c++ - 将已经围绕另一个枢轴变换的 GL 对象的枢轴居中?

标签 c++ opengl blender maya glm-math

我正在寻找使用 openGL 着色器在对象上居中和偏移旋转轴心的最佳方法。 3d 应用在处理此问题的方式上存在差异。


我有一个对象,我将平移设置为 (0,2,2),将旋转设置为 (90,0,0) 并将轴心移动到 (5,2,0),然后旋转(或不旋转) 任意。然后我想将对象上的“中心轴”定位到翻译后的 bb 中心

在 pivRT 与 BBcenter 不同的所有情况下,我都尝试了此 modelMatrix 的变体但没有成功: modelM = translationM * pivRT * glm::inverse(pivotM) * rotationM * scaleM * pivotM;

在玛雅

我将对象“居中”并且用户可见的值没有变化。在 blender 等其他应用程序中,当您将枢轴居中时,翻译会发生变化 - 实际上,您的对象翻译会成为枢轴翻译。在 xform 中阅读有关其工作原理的信息命令或 MTransformationMatrix类,Maya 的变换矩阵为

[Sp]x[S]x[Sh]x[Sp]x[St]x[Rp]x[Ro]x[R]x[Rp]x[Rt]x[T]

with Rt being the "Rotate pivot translation" matrix which is translation introduced to preserve exisiting rotate transformations when moving pivot. This is used to prevent the object from moving when the objects pivot point is not at the origin and the pivot is moved. [Rt]

我相信这个旋转枢轴平移矩阵可以工作,并且比在平移值发生变化的搅拌器中更直观,但我在实现这两个矩阵时都遇到了麻烦。

最佳答案

如果我正确地按照你的例子,这将是如何:

  1. 将枢轴移动到 (5,2,0)
  2. 围绕新轴旋转对象(假设围绕 z 轴旋转 2 弧度)
  3. 将枢轴重新置于对象上
  4. 将对象绕 x 轴旋转 90 度(围绕新的居中枢轴)
  5. 将对象翻译成 (0,2,2)

对于 glm,这将是模型矩阵的代码:

glm::mat4 Step1 = glm::translate(glm::mat4(1.0), glm::vec3(5,2,0));
glm::mat4 Step2 = glm::rotate(Step1, 2.0, glm::vec3(0,0,1));
glm::mat4 Step3 = glm::translate(Step2, glm::vec3(-5,-2,0));
glm::mat4 Step4 = glm::rotate(Step3, 1.57, glm::vec3(1,0,0));
glm::mat4 Step5 = glm::translate(Step4, glm::vec3(0,2,2) + glm::vec3(5,2,0));

列表中的第 3 步在技术上分为两部分:在第二次旋转之前翻译对象,然后在最后的翻译步骤中再次将其翻译回来。

关于c++ - 将已经围绕另一个枢轴变换的 GL 对象的枢轴居中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24977460/

相关文章:

opengl - OpenGL命令后缀 'v'代表什么?

c++ - 在 OpenGL 中将纹理映射到球体时出现接缝问题

android - 导入 Blender 模型后 Unity3D 帧率下降

python - 用于 blender 的 python 脚本中的内存泄漏

swift - 如何将复杂的 .dae 模型导入 SceneKit?

c++ - 扁平化为 1D 数组的 2D 和 3D 数组的等效迭代?

c++ - 类中声明的枚举的默认值

c++ - QObject连接函数

c++ - 是否可以在 using 声明中引用用户定义的转换模板?

c - GTK+ 和 OpenGL