三维图形变换
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; } };
模型变换
问题:透视投影矩阵?
透视变换规则:
利用相似三角形定理
背面剔除:
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 (); }
glMatrixMode (GL_MODELVIEW); glLoadIdentity (); glScalef (2.0f, 2.0f, 2.0f); DrawScene ();
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)