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=不正确对齐的几何体

我的当前三角形示例代码解决方案(此代码针对从拆分开始的屏幕上看到的所有节点运行,我使用的是GLM数学库):

点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时,仅知道位置和方向

我一直在关注这里发布的解决方案:

但我无法成功地旋转几何体以与方向向量对齐。我觉得我做错了一些基本的事情


任何帮助都将不胜感激

如果
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);