2013-11-24 23 views
0

我一直在试图让我生成的几何图形与方向矢量对齐。为了说明我目前的问题是什么:将几何图形对齐到方向矢量

  • A =正确对准几何形状(只是用于测试三角形)
  • B =正确对齐几何

Example of the problem

我当前的代码解决方案对于这个三角形的例子(这个代码运行你在屏幕上看到的所有节点,从分割开始,我使用GLM数学库):

glm::vec3 v1, v2, v3; 

v1.x = -0.25f; 
v1.z = -0.25f; 

v2.x = 0.25f; 
v2.z = -0.25f; 

v3.x = 0.0f; 
v3.z = 0.25f; 

v1.y = 0.0f; 
v2.y = 0.0f; 
v3.y = 0.0f; 

glm::mat4x4 translate = glm::translate(glm::mat4x4(1.0f), sp.position); 
glm::mat4x4 rotate = glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), sp.direction, glm::vec3(0.0f, 1.0f, 0.0f)); 

v1 = glm::vec4(translate * rotate * glm::vec4(v1, 1.0f)).swizzle(glm::comp::X, glm::comp::Y, glm::comp::Z); 
v2 = glm::vec4(translate * rotate * glm::vec4(v2, 1.0f)).swizzle(glm::comp::X, glm::comp::Y, glm::comp::Z); 
v3 = glm::vec4(translate * rotate * glm::vec4(v3, 1.0f)).swizzle(glm::comp::X, glm::comp::Y, glm::comp::Z); 

为A点的方向矢量值:

  • X 0.000000000浮子
  • ý0.788205445浮子
  • ž0.615412235浮子点B

方向矢量值:

  • x 0.0543831661 float
  • ý0.788205445浮子
  • Ž-0.613004684浮子

编辑1(24/11/2013 @ 20点36分): A和B不具有任何关系,两者分别生成。当生成A或B时,只知道位置和方向。

我一直在寻找的解决方案张贴在这里:

但我一直没能成功地转动我的几何形状与对齐我的方向矢量。我觉得我正在做一些相当基本的错误。

任何帮助将不胜感激!

回答

2

如果AB是单位矢量,并且希望的是转换B以便它与A对准的旋转矩阵R,然后通过计算C = B x A(的BA叉积)启动。 C是旋转轴,arcsin(|C|)是必要的旋转角度。

从这些你可以建立所需的旋转矩阵。它看起来像glm支持这个,所以我不会进一步解释。

NB如果你是做多,性能关键代码的许多信息,您可以通过注意|C| = sin(theta), sqrt(1 - |C|^2) = cos(theta)并与sin(theta)cos(theta)这些已知值计算自己的矩阵获得一点速度。例如,请参阅this discussion。例如glm例程将采用您的角度arcsin(|C|)并立即开始计算其sincos,这是一种小型浪费,因为您已经知道这些浪费,且操作相对昂贵。

如果旋转是围绕某一点p以外的产地,然后让T是翻译这需要p到原点,并找到X = T^-1 R T。这X将是你想要的转换。

+0

这里的问题是A和B没有关系,不能以这种方式使用。在A或B点生成三角形时,只知道位置和方向。我将在最上面澄清我的问题,以包括这一点。 – Yonathan

+0

@Yonathan我的朋友,这绝对没有意义。你必须解释哪些点和矢量必须翻译和/或旋转到其他点和矢量(或等价的变换描述)。 – Gene

+0

在A点或B点生成三角形时,我只有一个平移(位置)和它应该面对的方向。翻译效果很好,因为您可以看到三角形都位于深灰点上。较浅的灰线表示脸部应指向的方向。我试图完成的是在每个灰点上都有这些三角形,面对下一个灰点。这在某些点上会沿着这些正确对齐的点生成几何图形。因此,我想生成一个矩阵来正确旋转这个几何体的顶点。希望这更有意义。 – Yonathan