C++ 旋转几何体以与方向向量对齐
我一直在尝试让生成的几何体与方向向量对齐。为了说明我目前的问题是什么:C++ 旋转几何体以与方向向量对齐,c++,3d,geometry,rotational-matrices,glm-math,C++,3d,Geometry,Rotational Matrices,Glm Math,我一直在尝试让生成的几何体与方向向量对齐。为了说明我目前的问题是什么: A=正确对齐的几何体(仅用于测试的三角形) B=不正确对齐的几何体 我的当前三角形示例代码解决方案(此代码针对从拆分开始的屏幕上看到的所有节点运行,我使用的是GLM数学库): 点A的方向向量值: x 0.000000000浮动 y 0.788205445浮动 z 0.615412235浮动 点B的方向向量值: x 0.0543831661浮子 y 0.788205445浮动 z-0.613004684浮动 编辑
- A=正确对齐的几何体(仅用于测试的三角形)
- B=不正确对齐的几何体
- x 0.000000000浮动
- y 0.788205445浮动
- z 0.615412235浮动
- x 0.0543831661浮子
- y 0.788205445浮动
- z-0.613004684浮动
任何帮助都将不胜感激 如果
A
和B
是单位向量,您需要一个旋转矩阵R
,该矩阵将B
变换为与A
对齐,然后开始计算C=B x A
(B
和A
的叉积)C
是旋转轴,arcin(|C |)
是必要的旋转角度
根据这些,您可以构建所需的旋转矩阵。看起来glm
支持这一点,因此我将不作进一步解释
注意:如果您在性能关键型代码中执行了许多这样的操作,您可以通过记录|C |=sin(θ),sqrt(1-| C | ^2)=cos(θ)
并使用sin(θ)
和cos(θ)
的已知值自己计算矩阵来提高速度。关于这一点,请参见示例。glm
例程将以您的角度arcin(|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 |)
得到余弦,因为两个单位向量的点积是它们之间夹角的余弦。
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);