OpenGL旋转和位移先后顺序的差别

本文讨论了物体变换中的向量与变换矩阵的关系,强调了矩阵左乘向量与右乘的区别。通过实例解释了先旋转后位移与先位移后旋转的变换结果差异,揭示了矩阵乘法的非交换性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

物体变换的本质

物体向量与变换矩阵相差(注意是矩阵左乘向量

变换如何实现

单位矩阵逐个右乘变换矩阵(注意是右乘),所以如果是先旋转再位移,那么得到的是

vec*(translate*rotate)

反过来,如果是先位移再旋转,则是

vec*(rotate*translate)

这两个变换方程看起来差不多,但是最后结果是不一样的,因为矩阵乘法是不遵守交换律的(vec是物体向量,translate是位移矩阵,rotate是旋转矩阵)。

### OpenGL 中变换矩阵应用顺序 在 OpenGL 中,当执行一系列变换操作时,这些变换会按照特定的顺序应用于顶点数据。具体来说,在 `GL_MODELVIEW` 矩阵模式下进行的操作会影响最终渲染的对象位置、方向大小。 #### 应用顺序解释 所有的变换函数(如旋转平移、缩放)都会修改当前的活动矩阵堆栈顶部的内容。由于矩阵乘法不是交换性的,因此变换的先后顺序至关重要。一般情况下: - **缩放**:这一步骤调整物体的比例因子。 - **再旋转**:围绕指定轴改变物体的角度。 - **最后平移**:移动物体至所需的位置[^2]。 这种顺序确保了物体首被适当地拉伸或压缩,接着绕原点正确地转动,之后才沿坐标系的方向位移到目标地点。如果颠倒这个流程,则可能导致意外的结果,比如不希望有的剪裁效果或其他变形现象。 #### 示例代码展示 下面是一个简单的例子来说明如何设置并应用上述提到的不同类型的转换: ```cpp // 假设已经设置了正确的投影矩阵观察矩阵... glMatrixMode(GL_MODELVIEW); // 切换回模型视图矩阵 glLoadIdentity(); // 初始化为单位矩阵 // 开始构建局部空间到世界空间的变化链... // Step 1: Scale the object first. float scaleFactors[] = { scaleX, scaleY, scaleZ }; glScalef(scaleFactors[0], scaleFactors[1], scaleFactors[2]); // Step 2: Rotate around some axis next. GLfloat angleInDegrees = ...; GLfloat rotationAxis[] = {...}; // e.g., X-axis as {1.0, 0.0, 0.0} glRotatef(angleInDegrees, rotationAxis[0], rotationAxis[1], rotationAxis[2]); // Step 3: Translate to final position lastly. GLfloat translationVector[] = { posX, posY, posZ }; glTranslatef(translationVector[0], translationVector[1], translationVector[2]); ``` 这段程序片段展示了怎样通过调用相应的 OpenGL 函数依次完成缩放、旋转平移的动作。值得注意的是,这里使用的固定管线命令集适用于较旧版本的 OpenGL;现代 OpenGL 实践更倾向于利用着色器语言(如 GLSL),并通过统一变量传递变换参数给 GPU 进行处理[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值