[转]图形学原理 矩阵变换

空间中的某个点(x,y,z)的任何移动,旋转,缩放的变换,都是用这个点乘以某个一个矩阵而得到。那么模型是由一个个(x,y,z)的点组成,模型整个要变换,就是让每个点乘以某个矩阵。
这是三维引擎开发,和引擎代码阅读的必备的基础常识。
由于(x,y,z)乘以3*3矩阵可以达到旋转和缩放的目的,但是无法表示移动,所以为了统一,我们通常是采用乘以一个4行4列的矩阵。也就是说所有变换方法,都是用如下公式:
变换后点的(x’,y’,z’)=原来的(x,y,z) 乘以 4*4矩阵M
如果使用pv3d的数学类,写法如下:

var 点:number3D=new Number3D(x的值,y的值,z的值); //原来的点
var 数组:Array=[n11,n12,n13, 0,
                  n21,n22,n23, 0,
                  n31,n32,n33, 0,
                  nx , ny, nz, 1]; //构造矩阵内每个值,需要一个数组,我们通常都是以这种格式书写
var 矩阵: Matrix3D=new Matrix3D(数组); //构造矩阵
Matrix3D.multiplyVector4x4(矩阵,点); //点的x,y,z数据直接就更新为相乘后的数据了。

那么具体是用哪个矩阵M呢?下面我们就列出来:

旋转
旋转在三维里应该是最麻烦的东西,因为人类对旋转的描述是很有限。光靠矩阵控制旋转很多情况是非常复杂和不形象的,所以我们还发明了优拉角和四元数这些对旋转的控制更优良的办法,这些我们以后会讲到。

角度θ表示的是延某轴旋转的角度。
下面三个矩阵分别表示了点绕x轴,y轴,z轴的旋转矩阵。

移动
从公式我们很容易能看出,第4行1,2,3列的数,分别控制着点在x,y,z方向上的移动。

缩放
从公式我们很容易能看出,对角线上的n11,n22,n33,分别控制着点在x,y,z方向上的缩放。

这些就是最简单的变换矩阵,熟悉了这些,我们就又向前迈进了一步。
图形学应该是一个很有趣的东西,并非像很多学校和学生教授的的那种痛苦不堪的东西。其实道理非常简单,如果自己再具备一点编程知识,很容易就能做出自己的成像程序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
计算机图形学中,图形变换是非常重要的一部分,主要包括平移、旋、缩放和剪裁等操作。以下是基于OpenGL库的C++代码示例,演示了如何通过矩阵变换实现二维图形的平移、旋和缩放操作: ```c++ #include <GL/glut.h> GLfloat x = 0.0f; GLfloat y = 0.0f; GLfloat angle = 0.0f; GLfloat scale = 1.0f; void display() { glClear(GL_COLOR_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // 平移变换 glTranslatef(x, y, 0.0f); // 旋变换 glRotatef(angle, 0.0f, 0.0f, 1.0f); // 缩放变换 glScalef(scale, scale, 1.0f); // 绘制图形 glBegin(GL_TRIANGLES); glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(-0.5f, -0.5f); glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(0.5f, -0.5f); glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(0.0f, 0.5f); glEnd(); glutSwapBuffers(); } void keyboard(unsigned char key, int x, int y) { switch(key) { case 'w': y += 0.1f; break; case 's': y -= 0.1f; break; case 'a': x -= 0.1f; break; case 'd': x += 0.1f; break; case 'q': angle += 5.0f; break; case 'e': angle -= 5.0f; break; case '+': scale += 0.1f; break; case '-': scale -= 0.1f; break; default: break; } glutPostRedisplay(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(640, 480); glutCreateWindow("Transformations"); glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glutDisplayFunc(display); glutKeyboardFunc(keyboard); glutMainLoop(); return 0; } ``` 在这个示例中,我们通过使用OpenGL的矩阵变换函数来实现平移、旋和缩放操作。具体来说,我们使用了`glTranslatef()`函数实现平移,`glRotatef()`函数实现旋,`glScalef()`函数实现缩放。在绘制图形之前,我们将这些变换矩阵应用到当前的模型视图矩阵中。 此外,我们还设置了一个键盘回调函数`keyboard()`,以便通过键盘控制图形变换。在这个函数中,我们根据不同的按键来改变平移、旋和缩放的参数,然后通过`glutPostRedisplay()`函数来触发窗口的重新绘制。 需要注意的是,这个示例中只演示了二维图形变换操作,实际上在三维图形中也可以使用类似的矩阵变换方法。另外,为了更好地理解矩阵变换原理和操作,建议先学习一些线性代数和矩阵运算的基础知识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值