当前变换矩阵CTM.PPTVIP

  • 138
  • 0
  • 约7.07千字
  • 约 35页
  • 2018-01-13 发布于天津
  • 举报
第3章 几何对象和变换 邹昆 cszoukun@ 例子 在二维空间中画3个点: 顶点数组: point2 points[] = { point2(0.0, 1.0); point2(-1.0, -1.0); point2(1.0, -1.0); } 如果要画出右图(b)中的样子该如何使用变换? OpenGL中通过矩阵相乘来修改当前矩阵,注意最右边的矩阵对应最先应用于顶点的变换。 mat4 modelView; //定义模视矩阵,初始为恒等矩阵 modelView = modelView * Translate(1.0, 3.0, 0.0); modelView = modelView * Rotate(-90.0, 0.0, 0.0, 1.0) /*将modelView传给顶点shader,在顶点shader中用modelView右乘顶点坐标即得到变换后的坐标*/ glDrawArrays(GL_POINTS, 0, 3); // 绘制三个点 模视变换后的顶点坐标为照相机坐标系下的坐标 为Shader中uniform矩阵变量传值 在Shader中mat4为按列存储的二维数组,而mat.h中的mat4为按行存储的,因此在传值时需要进行转置。 void?glUniformMatrix4fv( GLint ?location, // uniform矩阵变量索引? GLsizei ?count,? // 传递的矩阵个数 GLboolean ?transpose, // 是否转置? const GLfloat *?value // 传递的矩阵 ); class MatrixStack { // 矩阵栈类 int _index; // 当前栈顶索引 int _size; // 矩阵栈能最多容纳的矩阵数 mat4* _matrices; // 存放栈内矩阵 public: MatrixStack( int numMatrices = 32 ):_index(0), _size(numMatrices) { _matrices = new mat4[numMatrices]; } ~MatrixStack() { delete[] _matrices; } void push( const mat4 m ) { // 压栈函数 assert( _index + 1 _size ); _matrices[_index++] = m; } mat4 pop( void ) { // 出栈函数,返回栈顶矩阵 assert( _index - 1 = 0 ); _index--; return _matrices[_index]; } }; 另一例子 练习:设画左图的函数为drawF()(顶点数组中坐标为左图中坐标,用glDrawArrays进行绘制),给出画右图的OpenGL指令。 从另一角度看组合变换 之前画3个点的例子中指定变换的代码: mat4 modelView; //定义模视矩阵,初始为恒等矩阵 modelView = modelView * Translate(1.0, 3.0, 0.0); modelView = modelView * Rotate(-90.0, 0.0, 0.0, 1.0) 变换与三个坐标系的关系 建模——三个点的坐标指定——使用建模坐标系(对象坐标系) 实例化——将对象以所希望的大小、位置和朝向放置到场景中(此时考虑问题采用世界坐标系) 如果直接绘制三个点,则以标准尺寸、朝向画在世界坐标系原点 显然应该对其做变换(实例化变换) 定位照相机——此时考虑问题采用照相机坐标系,且照相机位于原点,面朝负z轴。 如直接绘制场景,则照相机坐标系与世界坐标系重合,即照相机也位于世界坐标系原点。 要获取不同视角:对场景所有物体做变换,意味着该变换放置在所有物体绘制的前面。 从变换作用于坐标系的角度来看 mat4 modelView; //定义模视矩阵,初始为恒等矩阵 modelView = modelView * Translate(1.0, 3.0, 0.0); modelView = modelView * Rotate(-90.0, 0.0, 0.0, 1.0) 练习:从变换作用于坐标系的角度理解之前画两个三角形的代码。画出变换过程中局部坐标系的图示。 变换与三个坐标系的关系 按代码顺序: 首先工作在照相机坐标系:

文档评论(0)

1亿VIP精品文档

相关文档