旋转几何图形以对齐方向向量

Posted

技术标签:

【中文标题】旋转几何图形以对齐方向向量【英文标题】:Rotate geometry to align to a direction vector 【发布时间】:2013-11-24 17:25:05 【问题描述】:

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

A = 正确对齐的几何图形(只是一个用于测试的三角形) B = 几何图形对齐不正确

我当前在此三角形示例中的代码解决方案(此代码针对您在屏幕上从拆分开始看到的所有节点运行,我正在使用 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 浮点数 y 0.788205445 浮点数 z 0.615412235 浮点数

B点的方向向量值:

x 0.0543831661 浮点数 y 0.788205445 浮点数 z -0.613004684 浮点数

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

我一直在查看此处发布的解决方案:

Quaternions, rotate a model and align with a direction Direct3D Rotation Matrix from Vector and vice-versa Direction Vector To Rotation Matrix

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

任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

如果AB 是单位向量,并且您想要一个旋转矩阵R 来转换B 使其与A 对齐,那么首先计算C = B x A(的叉积BA)。 C 是旋转轴,arcsin(|C|) 是必要的旋转角度。

您可以根据这些构建所需的旋转矩阵。看起来glm 支持这个,所以我不会进一步解释。

注意,如果您在性能关键代码中执行很多很多这些操作,您可以通过注意|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 将是您想要的转换。

【讨论】:

这里的问题是A&B没有关系,不能这样使用。在 A 点或 B 点生成三角形时,只知道位置和方向。我将在顶部澄清我的问题以包括这一点。 @Yonathan 我的朋友,这绝对没有意义。您必须解释必须将哪些点和向量平移和/或旋转到其他点和向量(或转换的等效描述)。 在 A 点或 B 点生成三角形时,我只有一个平移(位置)和一个它应该面对的方向。翻译工作正常,因为您可以看到三角形都位于深灰色点上。较浅的灰色线表示面部应指向的方向。我想要完成的是在每个灰点上都有这些三角形,面向下一个灰点。这会在某些时候沿着这些正确对齐的点生成几何图形。因此我想生成一个矩阵来正确旋转这个几何的顶点。希望这更有意义。 @Yonathan 然后我的回答适用。如果你有一个三角形的法线向量是错误的 (A),并且你有两个点描述了一个正确的法线向量 (B),那么你需要一个将 A 带到 B 的旋转。这就是我所描述的。 你也可以使用(A•B)/(|A||B|)得到余弦,因为两个单位向量的点积就是它们之间夹角的余弦。

以上是关于旋转几何图形以对齐方向向量的主要内容,如果未能解决你的问题,请参考以下文章

Three.js Object3d 圆柱体旋转以对齐向量

向量学习2:图形围绕自己中心旋转围绕图形外或内任意点为中心旋转

向量学习2:图形围绕自己中心旋转围绕图形外或内任意点为中心旋转

将方向向量转换为四元数旋转

矩阵乘法的几何意义

第八章:矩阵和线性变换