旋转几何体以与方向矢量对齐

时间:2013-11-24 17:25:05

标签: c++ 3d geometry rotational-matrices glm-math

我一直试图让生成的几何体与方向向量对齐。为了说明我目前的问题:

  • 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 float
  • y 0.788205445 float
  • z 0.615412235 float

B点的方向矢量值:

  • x 0.0543831661 float
  • y 0.788205445 float
  • z -0.613004684 float

编辑1(2013年11月24日@ 20:36): A和B没有任何关系,两者都是单独生成的。生成A或B时,只知道位置和方向。

我一直在寻找这里发布的解决方案:

但我无法成功旋转几何体以与我的方向矢量对齐。我觉得我在做一些相当基本的错误。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

如果AB是单位向量,并且您希望转换矩阵R转换B以使其与A对齐,那么请从计算C = B x ABA的叉积)。 C是旋转轴,arcsin(|C|)是必要的旋转角度。

从中可以构建所需的旋转矩阵。看起来glm支持这一点,所以我不会进一步解释。

注意,如果您在性能关键代码中执行了很多这些操作,那么您可以通过注意|C| = sin(theta), sqrt(1 - |C|^2) = cos(theta)并使用sin(theta)和{cos(theta)的{​​{1}}这些已知值自行计算矩阵来获得一定的速度。 {1}}。为此,请参阅示例this discussionglm例程将采用您的角度arcsin(|C|)并立即继续计算其sincos,这是一个很小的浪费,因为您已经知道这些并且操作相对昂贵。< / p>

如果轮播大约是某个点p而不是原点,那么让T成为p到原点的翻译,并找到X = T^-1 R T。这个X将是您想要的转变。