OpenGL 入门5

来源:互联网 发布:php api接口开发 json 编辑:程序博客网 时间:2024/06/05 16:06

原帖地址:
http://ogldev.atspace.co.uk/www/tutorial06/tutorial06.html
http://blog.csdn.net/cordova/article/details/52541902

平移变换

空间中的一个点的坐标通常是用一个三维向量表示,如(1,2,3),(4,-2,0)。当我们说一个点移动了(a,b,c),那么这个点(x,y,z)移动后的坐标就应该是(x+a,y+b,z+c)。我们现在要找一个映射,让点(x,y,z)经过这个映射的处理之后变成(x+a,y+b,z+c)。在3D图形学中,我们通常用四个元素来表示空间中的点以及向量。(x,y,z,1)最后的1表示这是一个点,点的位置是(x,y,z)。而(x,y,z,0)最后的0标明这是一个向量。向量的方向是(x,y,z)。如果我们要让点(x,y,z,1)的第一个参数变成x+a,那么我们可以让(x,y,z,1)乘以(1,0,0,a),最后的结果就是(x+a,y,z,1)。同理如果要让y变成y+b,则需要乘以向量(0,1,0,b);让z变成z+c需要乘以向量(0,0,1,c)。因此由(1,0,0,a),(0,1,0,b),(0,0,1,c)就构成了点(x,y,z,1)平移到(x+a,y+b,z+c,1)的平移矩阵。
顶点用行向量:
这里写图片描述

顶点用列向量:
这里写图片描述

代码

struct Matrix4f {float m[4][4];};

首先定义了一种数据结构用于存储我们的4x4矩阵。
Matrix4f World;
World.m[0][0] = 1.0f; World.m[0][1] = 0.0f; World.m[0][2] = 0.0f; World.m[0][3] = sinf(Scale);
World.m[1][0] = 0.0f; World.m[1][1] = 1.0f; World.m[1][2] = 0.0f; World.m[1][3] = 0.0f;
World.m[2][0] = 0.0f; World.m[2][1] = 0.0f; World.m[2][2] = 1.0f; World.m[2][3] = 0.0f;
World.m[3][0] = 0.0f; World.m[3][1] = 0.0f; World.m[3][2] = 0.0f; World.m[3][3] = 1.0f;

在c/c++里面,我们的矩阵中的数据是一行一行存储进去的,所以我们应该用第一个公式。如果要用第二个公式的话,需要我们自己转化一下,比较麻烦。

glUniformMatrix4fv(gWorldLocation, 1, GL_TRUE, &World.m[0][0]);

将我们生成的平移矩阵传入gWorldLocation,(这个是用glGetUniformLocation函数获得的shader程序中的平移矩阵的索引)。1表示我们传入的矩阵的数量是1个,GL_TRUE标明我们的矩阵是行向量的方式,最后一个参数是存储矩阵的数组。

uniform mat4 gWorld;

在shader 程序里面声明我们的平移矩阵。

gl_Position = gWorld * vec4(Position, 1.0);

按照公式,将我们的平移矩阵乘以顶点坐标。

0 0