#include <GL/glut.h>
#include <stdlib.h>
void display(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0); //背景黑色
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0); //画笔白色
glLoadIdentity(); //加载单位矩阵
gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
/*眼睛在(0.0,0.0,5.0)处,望向(0.0,0.0,0.0),后面的三个参数(0.0,1.0,0.0),y轴为1,其余为0,表示脑袋朝上*/
//1.修改gluLookAt的后三个参数设置为(0.0,-1.0,0.0),即y轴为-1,其余为0,表示脑袋向下,即人眼倒着看
//2.修改gluLookAt的后三个参数为(1.0,0.0,0.0);x轴为1,其余为0.即人的脑袋像右歪90度来看,即顺时针转90度(那么,茶壶则逆时针转90度)
//3.若修改gluLookAt(0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0);则看到的茶壶是怎样?
//4.如果没有调用gluLookAt(),那么照相机设置为默认的位置和方向。默认情况下,照相机位于原点,指向z轴的负方向,朝上向量为(0,1,0)。
/*
5.把视图变换函数gluLookAt()函数,改为模型变换函数glTranslatef(),并使用参数(0.0,0.0,-5.0)。这个函数的效果和使用gluLookAt()函数的效果是完全相同的,
gluLookAt()函数是通过移动照相机(使用视图变换)来观察;
glTranslatef()函数是通过移动茶壶(使用模型变换)来观察。
注:在二维屏幕上,向右是x轴正方向,向右为正,向上是Y轴正方向,垂直于屏幕的方向是Z轴方向,从屏幕里往外为正z方向,即指向视点(人眼)方面
*/
glutWireTeapot(2);//画一个线框茶壶
//glutSwapBuffers();
glFlush();
}
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//gluPerspective(60.0, (GLfloat)w / (GLfloat)h, 1.0, 20.0);//透视投影
glFrustum(-5.0f, 5.0f, -5.0f, 5.0f, 5.0f, 20.0f);//透视投影
//glOrtho(-5,5,-5,5,1.0,20.0);//如此设置,当改变窗体尺寸时,茶壶会变形
//if (w <= h)
// glOrtho(-5.0f, 5.0f, -5.0f * h / w, 5.0f * h / w, 1.0f, 20.0f);
///*定义修剪区函数
//void glOrtho(Gldouble left,Gldouble right,Gldouble bottom,Gldouble top,Gldouble near,Gldouble far)
//其中left和right指定x轴的最小和最大坐标值,bottom和top用于y轴,而near和far用于z轴
//*/
//else
// glOrtho(-5.0f * w / h, 5.0f * w / h, -5.0f, 5.0f, 1.0f, 20.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow("观察变换与投影变换");
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}
opengl 观察变换与投影变化 水壶 (学习笔记-仅供参考)
最新推荐文章于 2023-09-05 01:32:25 发布