模型变换和视图变换

简介:

从“相对移动”的观点来看,改变观察点的位置与方向和改变物体本身的位置与方向具有等效性。在OpenGL中,实现这两种功能甚至使用的是同样的函数。

进行模型和视图变换,主要涉及到三个函数: 
glTranslate*,把当前矩阵和一个表示移动物体的矩阵相乘。三个参数分别表示了在三个坐标上的位移值。 
glRotate*,把当前矩阵和一个表示旋转物体的矩阵相乘。物体将绕着(0,0,0)到(x,y,z)的直线以逆时针旋转,参数angle表示旋转的角度。 
glScale*,把当前矩阵和一个表示缩放物体的矩阵相乘。x,y,z分别表示在该方向上的缩放比例。

注意我都是说“与XX相乘”,而不是直接说“这个函数就是旋转”或者“这个函数就是移动”,这是有原因的,马上就会讲到。 
假设当前矩阵为单位矩阵,然后先乘以一个表示旋转的矩阵R,再乘以一个表示移动的矩阵T,最后得到的矩阵再乘上每一个顶点的坐标矩阵v。所以,经过变换得 到的顶点坐标就是((RT)v)。由于矩阵乘法的结合率,((RT)v) = (R(Tv)),换句话说,实际上是先进行移动,然后进行旋转。即:实际变换的顺序与代码中写的顺序是相反的。由于“先移动后旋转”和“先旋转后移动”得到的结果很可能不同,初学的时候需要特别注意这一点。 
OpenGL之所以这样设计,是为了得到更高的效率。但在绘制复杂的三维图形时,如果每次都去考虑如何把变换倒过来,也是很痛苦的事情。这里介绍另一种思路,可以让代码看起来更自然(写出的代码其实完全一样,只是考虑问题时用的方法不同了)。 
让我们想象,坐标并不是固定不变的。旋转的时候,坐标系统随着物体旋转。移动的时候,坐标系统随着物体移动。如此一来,就不需要考虑代码的顺序反转的问题了。

1. 
glTranslatef(x,y,z); 
移动当前绘图原点。 
并不是相对屏幕中心移动,而是相对与当前所在的屏幕位置。 
x,y,z分别代表沿x轴,y轴,z轴移动的距离。

2. 
glRotatef(Angle,Xvector,Yvector,Zvector); 
负责让对象绕某个轴旋转。 
Angle通常是某个变量代表转过的角度。Xvector,Yvector,Zvector三个参数则共同决定旋转轴的方向

示例:

glPushMatrix(); 
    glTranslatef(0.0f,1.0f,-6.0f);

//绕Y轴旋转
    glRotatef(r,0.0f,1.0f,0.0f); glBegin(GL_TRIANGLES); glColor3f(1.0f,0.0f,0.0f); glVertex3f(-1.0f,0.0f,0.0f); glColor3f(0.0f,1.0f,0.0f); glVertex3f(-3.0f,-2.0f,0.0f); glColor3f(0.0f,0.0f,1.0f); glVertex3f(-1.0f,-2.0f,0.0f); glEnd(); glPopMatrix(); //增加旋转变量 r += 0.2f; if(r == 360) r = 0;

要让你的对象绕着自身的轴旋转,你必须让对象的中心坐标总是(0.0f,0.0f,0.0f)

3. 
glScalef(x,y,z); 
x,y,z分别为模型在x,y,z轴方向的缩放比。

参数也可取负数,也可以理解为先关于某轴翻转180°,再缩放;

本文转自莫水千流博客园博客,原文链接:http://www.cnblogs.com/zhoug2020/p/5784347.html,如需转载请自行联系原作者
相关文章
SwiftUI—如何对图像视图进行缩放和旋转
SwiftUI—如何对图像视图进行缩放和旋转
747 0
SwiftUI—如何对图像视图进行缩放和旋转
|
4月前
[Qt5] 矩形、圆和多边形ROI区域的交互(List View列表视图,halcon实现)
[Qt5] 矩形、圆和多边形ROI区域的交互(List View列表视图,halcon实现)
53 0
利用矩阵进行平移,旋转,缩放等图像变换、创建第二个一模一样的图像并使之进行缩放等操作
利用矩阵进行平移,旋转,缩放等图像变换、创建第二个一模一样的图像并使之进行缩放等操作
MFC绘制二维图形【1】—— 使用映射模式函数自定义坐标系
MFC绘制二维图形【1】—— 使用映射模式函数自定义坐标系
257 0
MFC绘制二维图形【1】—— 使用映射模式函数自定义坐标系
Blender突然无法平移视图
Blender突然无法平移视图
1828 0
|
API
使用Threejs创建几何体,动态添加几何体,删除几何体,添加坐标轴
使用Threejs创建几何体,动态添加几何体,删除几何体,添加坐标轴
360 0
使用Threejs创建几何体,动态添加几何体,删除几何体,添加坐标轴
【MATLAB】三维图形绘制 ( 绘制网格 + 等高线 | meshc 函数 | 绘制平面 + 等高线 | surfc 函数 )
【MATLAB】三维图形绘制 ( 绘制网格 + 等高线 | meshc 函数 | 绘制平面 + 等高线 | surfc 函数 )
212 0
【MATLAB】三维图形绘制 ( 绘制网格 + 等高线 | meshc 函数 | 绘制平面 + 等高线 | surfc 函数 )
文字处理技术:视图坐标都是在父视图的相对坐标
文字处理技术:视图坐标都是在父视图的相对坐标
67 0

热门文章

最新文章