opengl中的gluLookat函数生成的图像为什么会发生变化

#include <gl/glut.h>int width = 500, height = 500;void init(){glClearColor(1.0, 1.0, 1.0, 0.0);}void yjlookat(){gluLookAt(1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0);glClear(GL_COLOR_BUFFER_BIT);glColor3f(0.0, 0.0, 0.0);glBegin(GL_LINES);glVertex3f(0.0, 0.0, 0.0);glVertex3f(3.0, 0.0, 0.0);glVertex3f(0.0, 0.0, 0.0);glVertex3f(0.0, 3.0, 0.0);glVertex3f(0.0, 0.0, 0.0);glVertex3f(0.0, 0.0, 3.0);glEnd();glRasterPos3f(3.0, 0.0, 0.0);glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, 'X');glRasterPos3f(0.0, 3.0, 0.0);glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, 'Y');glRasterPos3f(0.0, 0.0, 3.0);glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, 'Z');glFlush();}void reshape(GLint wid, GLint hei){glViewport(0, 0, wid, hei);glMatrixMode(GL_PROJECTION);glOrtho(-10.0, 10.0, -10.0, 10.0, 0.0, 10.0);glMatrixMode(GL_MODELVIEW);glClear(GL_COLOR_BUFFER_BIT);}int main(int argc, char* argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowPosition(100, 100);glutInitWindowSize(width, height);glutCreateWindow("出道三次元");init();glutDisplayFunc(yjlookat);glutReshapeFunc(reshape);glutMainLoop();return 0;}刚生成

程序被其他窗体覆盖后点开

为什么会变了呢
最新回答
近水楼台

2024-06-23 16:11:14

首先 不用 glPushMatrix();会导致当前操作的矩阵被改变..


这些坐标变换都是通过操作矩阵来实现的,而矩阵相乘是会叠加的


(不用glPushMatrix();你会发现不是原来想要的位置)


gluLookat函数 就相当于 一个 捕捉图片的摄像机 (世界/三维坐标 )


void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble centerz,GLdouble upx,GLdouble upy,GLdouble upz);


前三个参数 是摄像机世界坐标的位置 ... 确定了摄像机的原点 ..


第二组centerx,centery,centerz 决定了相机的照射的方向...


第三组坐标决定了相机的的角度 ...(是以相机的正上方为基准..)


角度 跟偏移量不同 看到图像当然也不同 ..



参考资料: OpenGL编程宝典第七版第三章:视图

小迷妹

2024-06-23 16:36:05

眼坐标:来自观察者的观察点,与可能发生的任何变换无关,可以把它们视为“绝对”屏幕坐标。因此并不是真正的坐标,而是代表一个虚拟的固定坐标系,用作参考的公共框架。大部分变换都是根据它们相对于眼坐标系的效果来描述的。

opengl中的gluLookat函数生成的图像,就是利用gluLookat函数改变眼坐标来实现图像的变化。


  1. osg中camera->setViewMatrixAsLopengl 的函数相当于opengl中的glulookat

  2. openGL变换小节:

  3. 视图:指定观察者或摄像机的位置

  4. 模型:在场景中移动对象

  5. 模型视图:描述视图变换盒模型变换的对偶性

  6. 投影:对视见空间进行修剪和改变大小

  7. 视见区: 对到窗口的最终输出进行缩放

别闹~

2024-06-23 15:45:51

gluLookAt也是一种矩阵变换所以,要想使你要的画面正常,在整个画图函数的最前端加glPushMatrix();在最后面加上glPopMatrix();这样,每次都是相对世界坐标的LookAt就不会发生不期望的变化了.