1、坐标系
常说的坐标系,有三种说法:左手坐标系、右手坐标系、笛卡尔坐标系
左手系:伸开左手,大拇指指向X轴正方向,食指指向Y轴正方向,其他三个手指指向Z轴正方向。
右手系:伸开右手,大拇指指向X轴正方向,食指指向Y轴正方向,其他三个手指指向Z轴正方向。
左手和右手坐标注系的区别在于两者Z轴的方向是相反的。
笛卡尔坐标系:
在数学中使用的三维空间是笛卡尔坐标系
笛卡尔坐标系其实就是右手坐标系,OpenGL中使用右手坐标注系,Direct3D使用的是左手坐标系。
OpenGL中屏幕左下是原点(0,0), 右上角可以解理为(1,1)。
2、左手旋转规则、右手旋转规则
左右手旋转规则用于判断当前坐标系中物体旋转时正方向的判定。握成拳头,拇指指向旋转轴的正方向,其余手指的弯曲方向即为旋转的正方向,跟手指弯曲方向一致的旋转记为正向,相反则为负向。
两者的示意图:
3、平移操作:
glTranslatef (GLfloat x, GLfloat y, GLfloat z);
x,y,z分别表示物体在xyz方向上的平移量。
例:
glTransLatef(-0.5f,0.4f,-0.3f);
表示物体沿x轴负方向移动0.5,y正方向移动0.4,z负方向移动0.3。
4、旋转操作:
glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
GLfloat angle:旋转角度
GLfloat x, GLfloat y, GLfloat z:旋转轴,指旋转轴是由地当前坐标系的原点和点(x,y,z)的直线。
如果要定义不经过原点的旋转轴,则需要先把物体的旋转轴平移到过原点,旋转之后,再经过平移的逆变换平移回去。
例:
glRotatef (45.0f, 0.0f, 1.0f, 0.0f);
5、缩放操作:
glScalef (GLfloat x, GLfloat y, GLfloat z);
GLfloat x, GLfloat y, GLfloat z:分别是物体在xyz三个方向上的缩放比例。
例:
glScalef (0.5f, 0.5f, 1.0f,);
6、源代码演示:
void Step11_DeepthTest(void)
{
glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
// 加上光线
const GLfloat light_position[] = { 1.0f, 0.0f, -1.0f, 1.0f };
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
const GLfloat light_ambient[] = { 1.0f, 1.0f, 0.0f, 1.0f };
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glEnable(GL_DEPTH_TEST); // 开启深度测试
// 茶壶1
glLoadIdentity(); //加载单位矩阵
glutSolidTeapot(0.3);// 画一个立方体
// 茶壶2
glLoadIdentity(); //加载单位矩阵
// X轴上移动0.7, Z轴上移动-0.3,让它画到前面,显示立体
glTranslatef(0.3, 0.0, -0.3);
glutSolidTeapot(0.3);// 画茶壶
// 茶壶3
glLoadIdentity(); //加载单位矩阵
glTranslatef(0.0, 0.5, -0.5); // Y轴上移动0.5,Z轴上移动-0.5,让它画到前面,显示立体
glRotatef(90, 0.0, 1.0, 0); // 沿Y轴旋转60度(以弧度值为单位),
glutSolidTeapot(0.3);// 画茶壶
// 茶壶4
glLoadIdentity(); //加载单位矩阵
glTranslatef(-0.5, 0.0, -0.5); // X轴上移动-0.5,Z轴上移动-0.5,
glScalef(0.5, 0.5, 0.5); // 沿Y轴旋转60度(以弧度值为单位),
glutSolidTeapot(0.3);// 画茶壶
glutSwapBuffers();
return;
}
运行效果:
7、工程项目文件下载
本项目文件在Debug–x86下编译通过。