我一直试图让生成的几何体与方向向量对齐。为了说明我目前的问题:
我目前在此三角形示例的代码中的解决方案(此代码针对您在分割时从屏幕上看到的所有节点运行,我正在使用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点的方向矢量值:
B点的方向矢量值:
编辑1(2013年11月24日@ 20:36): A和B没有任何关系,两者都是单独生成的。生成A或B时,只知道位置和方向。
我一直在寻找这里发布的解决方案:
但我无法成功旋转几何体以与我的方向矢量对齐。我觉得我在做一些相当基本的错误。
非常感谢任何帮助!
答案 0 :(得分:2)
如果A
和B
是单位向量,并且您希望转换矩阵R
转换B
以使其与A
对齐,那么请从计算C = B x A
(B
和A
的叉积)。 C
是旋转轴,arcsin(|C|)
是必要的旋转角度。
从中可以构建所需的旋转矩阵。看起来glm
支持这一点,所以我不会进一步解释。
注意,如果您在性能关键代码中执行了很多这些操作,那么您可以通过注意|C| = sin(theta), sqrt(1 - |C|^2) = cos(theta)
并使用sin(theta)
和{cos(theta)
的{{1}}这些已知值自行计算矩阵来获得一定的速度。 {1}}。为此,请参阅示例this discussion。 glm
例程将采用您的角度arcsin(|C|)
并立即继续计算其sin
和cos
,这是一个很小的浪费,因为您已经知道这些并且操作相对昂贵。< / p>
如果轮播大约是某个点p
而不是原点,那么让T
成为p
到原点的翻译,并找到X = T^-1 R T
。这个X
将是您想要的转变。