c++ - 旋转几何以对齐方向 vector

标签 c++ 3d geometry rotational-matrices glm-math

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

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

Example of the problem

我当前针对这个三角形示例的代码解决方案(此代码针对您在屏幕上看到的所有节点从拆分开始运行,我使用的是 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点的方向 vector 值:

  • x 0.000000000 float
  • y 0.788205445 float
  • z 0.615412235 float

B点的方向 vector 值:

  • x 0.0543831661 float
  • y 0.788205445 float
  • z -0.613004684 float

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

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

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

如有任何帮助,我们将不胜感激!

最佳答案

如果 AB 是单位 vector ,并且您需要一个旋转矩阵 R 来转换 B 以便它与 A 对齐,然后开始计算 C = B x A(BA). C是旋转轴,arcsin(|C|)是必要的旋转角度。

您可以从中构建所需的旋转矩阵。看起来glm 已经支持这个了,我就不多解释了。

注意如果你在性能关键代码中做很多很多这样的事情,你可以通过注意 |C| 来提高一点速度= sin(theta), sqrt(1 - |C|^2) = cos(theta) 并使用这些已知的 sin(theta) 值自行计算矩阵余弦(θ)。例如,请参见 this discussion . glm 例程将采用您的角度 arcsin(|C|) 并立即着手计算其 sincos ,这是一个小浪费,因为您已经知道这些并且操作相对昂贵。

如果旋转是围绕原点以外的某个点p,则令T 是将p 带到原点的平移,并找到 X = T^-1 R T。此 X 将是您想要的转换。

关于c++ - 旋转几何以对齐方向 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20177506/

相关文章:

javascript - 我需要 js 中的一些 lib 来显示 3d 模型

c++ - 如何确保给定的一组点位于可能正方形的边界上?

css - 三个圆等间距排成一行

c++ - 将 int 转换为 std::string

css - 滚动时更改 3D 透视 - 固定消失点

c++ - 在 C++ 中调用 "system"时抑制控制台

3d - 如何将 skybox/360 全景图片添加到我的 Archilogic 3D 模型中?

algorithm - 3D 空间中点的旋转

c++ - 如何在 C++ 中声明一个零初始化的类成员?

c++ - 在 C++11 中反序列化 DNS 数据包对象