在3D中合并旋转
Combine rotations in 3D
我正在尝试使用OpenGL(C )实现3D旋转,我真的很厌倦了寻找一种旋转全局(x,y,z)而不是本地物体的方法。
我发现了这个简单的概念:
- 获取要旋转的对象的世界转换矩阵。
- 使用此矩阵的倒数将世界轴转换为本地坐标。
- 使用转换后的轴来计算您在代码中进行的旋转。
所以我做了类似的东西:
//set the rotation matrix ti identity matrix
transformedModel->rotationMatrix = glm::rotate(glm::mat4(1.0f), float(0), glm::vec3(1, 1, 1) ); //rotation matrix = identity matrix
//X-axis
glm::vec4 axis = glm::inverse(transformedModel->rotationMatrix) * glm::vec4(1,0,0,0);
axis = glm::normalize(axis);
transformedModel->rotationMatrix = glm::rotate(transformedModel->rotationMatrix, glm::radians(rotation.x), glm::vec3(axis.x, axis.y, axis.z));
//Y-axis
glm::vec4 axis2 = glm::inverse(transformedModel->rotationMatrix) * glm::vec4(0,1,0,0);
transformedModel->rotationMatrix = glm::rotate(transformedModel->rotationMatrix, glm::radians(rotation.y), glm::vec3(axis2.x, axis2.y, axis2.z));
axis2 = glm::normalize(axis2);
//Z-axis
glm::vec4 axis3 = glm::inverse(transformedModel->rotationMatrix) * glm::vec4(0,0,1,0);
axis3 = glm::normalize(axis3);
transformedModel->rotationMatrix = glm::rotate(transformedModel->rotationMatrix, glm::radians(rotation.z), glm::vec3(axis3.x, axis3.y, axis3.z));
updateModelMatrix(transformedModel);
在特殊情况下,它可以正常工作!!任何人都可以帮助我获得最简单的方法吗?
首先,确定将对象旋转的点。这通常是对象的中心。我们将其称为旋转点。
现在,对于对象中的每个顶点,我们将执行以下操作:
1)将顶点转换为原点。这可以通过从顶点减去旋转点来完成。例如,如果旋转点为(5、10、20),我们将从顶点的x坐标中减去5,从顶点的y坐标中10,而从顶点的z坐标减去20个。
。2)用3x3旋转矩阵执行旋转。
3)将顶点转换回旋转点。我们撤消了第一步,然后在顶点的坐标中加入5、10和20。
我发现这比使用转换矩阵更简单,但效率可能降低。
相关文章:
- 与互斥锁相比,旋转锁可以保证上下文切换
- 使用C++程序合并排序没有得到正确的输出
- 绘制旋转的三角形
- 旋转模型矩阵时的形状失真
- 四边形的 2D 旋转
- 垂直方向的 Gtk3+ 旋转按钮 (c/c++)
- 用于合并排序的合并函数
- 在声明中合并两个常量"std::set"(不是在运行时)
- 发布旋转矩阵(openGL/glm)
- 如何将一个数组值合并为一个整数c++
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 将向量的 N 段合并到位C++
- 顺时针迭代旋转 3 位数字
- 在C++中合并两个库
- 以迭代方式合并标准::unordered_map
- 形状对象的旋转和缩放不正确C++
- 如何在 OpenSceneGraph 中缩放/旋转/移动资产
- 无法合并生成操作.. 先决条件不同
- 合并排序不排序自创建数组类 c++
- 在3D中合并旋转