c - OpenGL 旋转和缩放

标签 c opengl 3d

旋转是否总是围绕原点 (0,0,0) 发生?

翻译是否总是相对于之前的翻译发生?

缩放是否会增加坐标轴的大小?

最佳答案

我建议初学者从考虑点而不是 3D 对象开始。那么所有的变换都可以看作是将一个点位置改变到一个新位置的函数。

首先想象一个 XYZ 笛卡尔坐标空间,然后想象空间中的一个原点 (0, 0, 0) 的点 (X,Y,Z)。 OpenGL 在这个阶段只知道点 X、Y、Z。现在您可以开始了:

旋转需要一个角度和一个旋转中心。 glRotate 允许您仅指定角度。凭借数学,从概念上讲,旋转中心位于位置 (X-X,Y-Y,Z-Z) 或 (0,0,0)。

Translation 只是当前位置的偏移量。由于 OpenGL 知道您的点 (X,Y,Z),它只是将最偏移的点添加到位置 vector 中。因此,说它是相对于当前位置而不是以前的翻译更正确。

缩放 是点 vector (X.m,Y.m,Z.m) 的乘法,因此它只是将该点平移 m 倍。因此在概念上可以说它不会改变坐标轴的大小。

但是,当您开始考虑 3D 时,事情会变得有些棘手,因为您会意识到,如果您不小心,单个 3D 对象中的所有点并不总是按照您希望的方式改变位置 相对于彼此。例如,您将了解到,如果您想围绕对象的中心旋转,您将必须“将其移至原点,旋转,然后再将其移回原点”。这个来回移动它的过程可以被认为是指定旋转中心。这些实际上是您应用的数学“技巧”。

关于c - OpenGL 旋转和缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7627106/

相关文章:

c++ - OpenGL 中的阴影贴图

3d - 获取3D模型指定方向上最远的顶点 - Unity

java - 如何径向移动图片?

c++ - 在图形管道中的哪个阶段进行剪辑?

c - 无法显示文件中数组的内容

c - 使链表更通用

c - 如何在不释放内容的情况下释放指针?辅助变量

c++ - 加载 HBITMAP 并将其转换为 OpenGL 纹理

wpf - 在 Windows XP 中是否有在 Viewport3D 中强制抗锯齿的 secret 技巧?

c++ - 打开终端并通过C编程执行命令