OpenGL实战教程(12) -- 第十一站:OpenGL坐标系及平移缩放操作

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下编译通过。

项目源文件下载

发布了32 篇原创文章 · 获赞 9 · 访问量 1083

猜你喜欢

转载自blog.csdn.net/x879014419/article/details/105243760
今日推荐