2014-10-02 203 views
1

我有两个面向任意方向的三角形。我有两个三角形的向前矢量,我想对齐每个正向矢量以面对相同的方向。我只能够对世界x,y和z轴进行旋转(我使用的软件API非常有限)。给定一个旋转矩阵找到顶点的新位置

因此,设A =第一个三角形的前向矢量,B =第二个三角形的前向矢量。 我可以用这个公式计算,以找到旋转矩阵:

v = B X A 
s = ||v|| 
c = A dot B 

vx = skew-symmetric cross-product matrix of v 

R = I + [vx] + [vx]^2 * (1-c)/s^2 

我能找到R.

我不知道怎么用[R,这样我可以移动三角乙这样的顶点三角形B和三角形A面向相同的方向。

图片仅供参考:

enter image description here

谢谢大家提前帮助。

回答

1

可以使用归一化的向量v作为轴线A和B之间的角度τ来计算旋转矩阵(右 - 手指则):

| cosT + x*x*(1 - cosT)  y*x*(1 - cosT) + z*sinT z*x*(1 - cosT) - y*sinT | 
| x*y*(1 - cosT) - z*sinT cosT + y*y*(1 - cosT)  z*y*(1 - cosT) + x*sinT | 
| x*z*(1 - cosT) + y*sinT y*z*(1 - cosT) - x*sinT cosT + z*z*(1 - cosT) | 

x,y,z值是指标准化的v坐标。现在

,应用此矩阵来计算每个顶点B.

PS:这个矩阵是列优先的顺序,你可能要调换它。

+0

我忘了提到最后一件事(我用它更新了帖子)。我只有能力做世界旋转(只有x,y,z轴)。我无法在矢量上应用旋转。我使用的软件非常有限。 – user2970916 2014-10-03 12:45:10

+0

实际上这个矩阵是x,y和z轴旋转的组合(不一定按照这个顺序)。 – eap 2014-10-03 15:28:05

0

您可以通过计算角度between to forward vectors第一更容易做到这一点:

theta = arccos(dot(A, B)/(length(A)*length(B))) 

这给你的,你想旋转你的三角形的角度。然后就可以把该角度在2D rotation matrix并用它来计算每个顶点的新位置:

vector2 newPos = R*oldPos, Where R is the rotation matrix 
+0

这会工作,假设我在一个2D平面。我也必须考虑到Z方向。 – user2970916 2014-10-02 16:56:43