直接X旋转/C#如何使两个网格对象始终面对面

直接X旋转/C#如何使两个网格对象始终面对面,c#,directx,C#,Directx,给定网格对象的中心点时,是否有方法使其始终面向另一个给定点?例如,如果绘制一个圆柱体,使其看起来像一个圆锥体,则圆锥体的尖端总是面对另一个给定点?这是绝对可行的。您需要设置正交基准,以便两个对象相互指向。我将假设你的圆锥体是这样设置的,即点沿Z轴向下(你需要记住这一点) 锥体A位于位置p 锥体B位于位置Q 从A到B的方向是Q-p,从B到A的方向是p-Q。首先,我们需要对这两个向量进行归一化,使它们现在成为单位方向向量。为了方便起见,我们将它们分别称为A'和B'(它们现在都是方向向量) 现在,我们

给定网格对象的中心点时,是否有方法使其始终面向另一个给定点?例如,如果绘制一个圆柱体,使其看起来像一个圆锥体,则圆锥体的尖端总是面对另一个给定点?

这是绝对可行的。您需要设置正交基准,以便两个对象相互指向。我将假设你的圆锥体是这样设置的,即点沿Z轴向下(你需要记住这一点)

锥体A位于位置p
锥体B位于位置Q

从A到B的方向是Q-p,从B到A的方向是p-Q。首先,我们需要对这两个向量进行归一化,使它们现在成为单位方向向量。为了方便起见,我们将它们分别称为A'和B'(它们现在都是方向向量)

现在,我们可以假设上向量(我们称之为U)是0,1,0(请注意,如果A'或B'与上向量非常接近,这里的数学将失败,但现在我不担心)

现在我们需要边向量和真上向量。幸运的是,我们可以用叉积计算出垂直于上方向向量和A'或B'所形成的平面的东西

因此,侧矢量的计算如下。。。现在我们有了这个边向量,我们可以通过做A'x S来计算真上向量。这为我们提供了正交基所需的3个向量。你可以对这两个向量进行归一化,以消除可能累积的任何错误,但是两个单位向量的叉积应该始终是一个单位向量,因此任何错误都是轻微的,因此可能不值得这样做

利用这些信息,我们现在可以建立圆锥A的矩阵

S.x,  S.y,  S.z,  0
U.x,  U.y,  U.z,  0
A'.x, A'.y, A'.z, 0
P.x, P.y, P.z, 1
对两个锥体执行相同的计算,现在它们将彼此指向对方。如果移动任一圆锥体,请按上述方法重新计算两个圆锥体,它们仍将指向对方

值得注意的是,我使用的矩阵格式是DirectX的默认(行主)布局。很可能C#(因此XNA?)使用了列主格式。如果是这样的话,您需要按照以下方式布置Amtrics:

S.x, U.x, A'.x, P.x
S.y, U.y, A'.y, P.y
S.z, U.z, A'.z, P.z
0,   0,   0,    1
请注意,这两个矩阵之间的唯一区别是行和列已交换。这使得第二个矩阵成为第一个矩阵的转置(反之亦然)