game programming (4)

三维图形变换

 

 

向量、矩阵、平面以及相应的数学操作
三维点、齐次坐标和变换矩阵
三维绘制流程
三维绘制中的变换
三维绘制流程
三维绘制中的变换
照相机系统和相机模型
视域、背面剔除和裁剪
齐次坐标:
三维空间上的点 ( x,y,z ) T 可以表示为四维空间中的一个齐次点 ( x,y,z,w ) T ,其中 w=1
用齐次坐标表示空间中的点,能够方便进行各种运算。同样的,可将矩阵写作齐次形式,即将原来的 3 x 3 大小的矩阵扩充为 4 x 4 大小的矩阵。

struct Point3 { Union { struct { float x,y,z; //分量形式 }; float v[3]; // 数组形式 }; Point3() {}; //缺省构造函数 Point3 (float X, float Y, float Z) //带参构造函数 {x = X; y=Y; z=Z} //… 更多 };  

struct Plane3 { Point3 n; // 平面法向 float d; //原点垂直法向距离 Plane3() {} //缺省构造函数 plane3(float nX,float nY, float nZ, float D) { n(nX, nY, nZ); d=D} //…更多: 从三点构在一个平面,从多边形构造一个平面等等 };  

 

struct matrix4 { union { struct { float _11,_12,_13,_14; float _21,_22,_23,_24; float _31,_32,_33,_34; float _41,_42,_43,_44 }; //分量表示 float m[4][4]; //矩阵表示 }; //带参构造函数 matrix4 (float IN_11, float IN_12, float IN_13, float IN_14, float IN_21, float IN_22, float IN_23, float IN_24, float IN_31, float IN_32, float IN_33, float IN_34, float IN_41, float IN_42, float IN_43, float IN_44) { _11=IN_11; _12=IN_12; _13=IN_13; _14=IN_14; _21=IN_21; _22=IN_22; _23=IN_23; _24=IN_24; _31=IN_31; _32=IN_32; _33=IN_33; _34=IN_34; _41=IN_41; _42=IN_42; _43=IN_43; _44=IN_44; } };  

 

 

对一个点或者向量进行变换等价于将一个矩阵乘以该点或向量的齐次坐标 .
矩阵复合:
矩阵复合可完成对空间点的任意操作
矩阵乘法不满足交换率,因此复合的次序非常重要!
例如:先缩放后平移 不等于 先平移后缩放
通常情况下,给出的旋转矩阵是绕原点旋转的。因此首先要将物体平移至原点,进行旋转,再平移回来。

如何得到变换矩阵:
将物体平移至原点
绕坐标轴旋转
将物体重新平移至其原先的位置
图形流水线中的物体坐标系:
建模时所采用的坐标系
选取物体上或靠近物体的某一点作为原点,物体上的其他点相对于该点的坐标进行表示
针对物体的局部坐标系
图形流水线中的世界坐标系:
全局坐标系
所有物体组成一个场景,场景坐标系称为世界坐标系
所有物体必须变换至该坐标系,以确定彼此之间的相对空间位置
将物体放至场景内等价于定义一个从物体局部坐标系至世界坐标系的变换矩阵
场景需要定义光照

 

 

模型变换

 

将局部坐标系变换到世界坐标系
包括缩放、旋转、平移等
相机变换
将世界坐标系中的一点变换至照相机坐标系
可以分成平移和旋转两部分

 

 

问题:透视投影矩阵?

 

透视变换规则:

利用相似三角形定理

 

背面剔除:

 

可见性测试在视见空间内进行。计算每一个多边形的法向,并检查法向与视线方向点积后值的符号,符号大于0保留
问题:
视线方向:眼睛到物体的向量。
那么物体可见部分的法向与视线的点积应该小于0。
三维物体裁剪
用视域四棱锥对物体进行裁剪
视域四棱锥裁剪的四种情况:
两个顶点完全位于视域四棱锥内,把第二个顶点加入输出顶点表
第一个顶点在裁剪平面内侧,第二个顶点在裁剪平面外侧,将交点加入输出顶点表
两个顶点均在裁剪平面外侧,输出顶点表不加任何顶点
第一个顶点在裁剪平面外侧,第二个顶点在裁剪平面内侧,将交点和第二个顶点加入输出顶点表
从世界坐标系到屏幕坐标系:
将物体从世界坐标系变换至屏幕坐标系,可以看成是:将物体首先作相机变换,再作透视变换
OpenGL 中的变换矩阵
相机变换: 指定照相机位置和方向 ( 也叫照相机坐标系统 )
模型变换 : 将物体在场景中移动,也可以视为从局部坐标系到全局坐标系
ModelView 变换 : 相机变换和模型变换的混合 .
投影变换 : 定义视域体并指向投影
视区变换 : 将二维投影后的场景变换到绘制窗口 .
将相机放置到世界坐标系统中定义相机变换

      glMatrixMode (GL_MODELVIEW);

      glLoadIdentity ();

      gluLookAt ( eye.x , eye.y , eye.z , look.x ,

                       look.y , look.z , up.x , up.y , up.z );

 

Void DisplayScene () { glClear (GL_COLOR_BUFFER_BIT); glColor3f (1.0f, 0.0f, 0.0f); glLoadIdentity (); gluLookAt (0.0, 0.0, 10.0, 0.0, 0.0, -100.0, 0.0, 1.0, 0.0); glBegin (GL_TRIANGLE); glVertex3f (10.0f, 0.0f, 0.0f); glVertex3f (0.0f, 10.0f, 0.0f); glVertex3f (-10.0f, 0.0f, 0.0f); glEnd(); glFlush (); }  

 

ModelView 变换式建模矩阵 M 和相机变换 V 的乘积 C = VM
所有在 OpenGL 中的变换函数只能设置 modelview 矩阵 . 因此, ModelView 在物体被操作之前被调用 .

 

glMatrixMode (GL_MODELVIEW); glLoadIdentity (); glScalef (2.0f, 2.0f, 2.0f); DrawScene ();  

 

建模变换 :
glLoadIdentity :   C = I
glLoadMatrix (m) :  C =  m
glMultiMatrix (m) :  C = C m
glRotatef ( q,x,y,z ) :  C = C R (q)
glTranslatef ( x,y,z ) :  C = C T( x,y,z )
glScalef ( x,y,z ) :  C = C S( x,y,z )
平行(正交)投影
定义正交视域体 :

         glOrtho (left, right, bottom, top, near, far);

    或者 :   glOrtho2D (left, right, bottom, top);

定义投影矩阵 :

       glMatrixMode (GL_PROJECTION);

        glLoadIdentity ( );

       glOrtho (left,  right, bottom, top, near, far)

 

视域四堎锥的定义 :

     glFrustum (left,  right, bottom, top, near, far)

 

 

投影矩阵

glMatrixMode (GL_PROJECTION);

     glLoadIdentity ();

    glFrustum (left,  right, bottom, top,

                       near, far)

 

glMatrixMode (GL_PROJECTION);

    glLoadIdentity ();

    gluPerspective (angle, aspect, near, far)

 

glViewport ( GLint left, GLint bottom, GLint width,

                       GLint height)

 

 

你可能感兴趣的:(c,struct,buffer,float,图形,Matrix)