opengl 观察变换与投影变化 水壶 (学习笔记-仅供参考)

#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;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值