旋转几何图形以对齐方向向量
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】:如果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)
的这些已知值自己计算矩阵来获得一点速度。例如,请参见 this discussion。 glm
例程会从你的角度 arcsin(|C|)
并立即开始计算它的 sin
和 cos
,这是一个小小的浪费,因为你已经知道这些并且操作相对昂贵。
如果旋转是关于某个点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|)
得到余弦,因为两个单位向量的点积就是它们之间夹角的余弦。以上是关于旋转几何图形以对齐方向向量的主要内容,如果未能解决你的问题,请参考以下文章
向量学习2:图形围绕自己中心旋转围绕图形外或内任意点为中心旋转