游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2335|回复: 6

关于opengl投影的问题

[复制链接]

1

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2006-5-3 12:54:00 | 显示全部楼层 |阅读模式
最近刚开始学习opengl,写了一个例子:

  1. #include <Gl/glut.h>
  2. #include <GL/gl.h>

  3. void display()
  4. {
  5.         glClear(GL_COLOR_BUFFER_BIT);
  6.         glLineWidth(2.0);
  7.         glMatrixMode(GL_MODELVIEW);
  8.         [b]//glLoadIdentity();[/b]
  9.         glColor3f(0.0,0.0,0.0);
  10.         glTranslatef(2.0,2.0,0.0);
  11.         glutWireCube(1.0);
  12.         glFlush();
  13. }
  14. void reshape(GLsizei w,GLsizei h)
  15. {
  16.         glViewport(0,0,w,h);
  17.         glMatrixMode(GL_PROJECTION);
  18.         glLoadIdentity();
  19.         glFrustum(-2.0,2.0,-2.0,2.0,2.0,10.0);
  20.         glMatrixMode(GL_MODELVIEW);
  21.         glLoadIdentity();
  22.         gluLookAt(0.0,0.0,4.0,0.0,0.0,0.0,0.0,1.0,0.0);
  23. }
  24. int main()
  25. {
  26.         glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);
  27.         glutInitWindowSize(400,400);
  28.         glutInitWindowPosition(100,100);
  29.         glutCreateWindow("test");
  30.         glClearColor(1.0,1.0,1.0,0.0);
  31.         glutDisplayFunc(display);
  32.         glutReshapeFunc(reshape);
  33.         glutMainLoop();
  34.         return 0;
  35. }
复制代码

在上面的代码中,如果把display()里面的glLoadIdentity();去掉,就可以正常显示,如果不去掉
就无法显示图形,只能看到白色的背景。
我始终觉得glLoadIdentity()只是重置模型视点矩阵,不知道怎么会影响投影矩阵的?
请大家赐教

17

主题

85

帖子

85

积分

注册会员

Rank: 2

积分
85
发表于 2006-5-3 13:32:00 | 显示全部楼层

Re: 关于opengl投影的问题

OpenGL中的矩阵变换采用的矩阵堆栈的方法,每次矩阵变换都是在上一次的基础上进行累加,如果不调用glLoadIdentity()(将当前矩阵栈栈顶内容恢复为单位矩阵),则每次调用display都会在原有的glTranslatef()基础上进行累加,最终就不对了。

1

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2006-5-3 14:18:00 | 显示全部楼层

Re:关于opengl投影的问题

我本来以为在display()里面写:
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
就可以正确显示的,但是结果什么都没有
只有在display里面用
   glPushMatrix()和glPopMatrix()才行,
不知道是为什么?
每次显示的时候重置矩阵然后画一次,为什么不行呢

0

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2006-5-3 14:24:00 | 显示全部楼层

Re:关于opengl投影的问题

看看reshape里, 已经用了gluLookAt()了, 在display()中重复了glMatrixMode()和glLoadIdentity(); 删除它们就可以了, 否则,gluLookAt就无效了。

17

主题

85

帖子

85

积分

注册会员

Rank: 2

积分
85
发表于 2006-5-3 14:30:00 | 显示全部楼层

Re: Re:关于opengl投影的问题

gz2001: Re:关于opengl投影的问题

我本来以为在display()里面写:
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
就可以正确显示的...


你说的这两种方法都可以确保正确绘制
不知道没显示出结果会不会跟你平行投影定义的大小有关
把glTranslatef的参数改为(1.0,1.0,0.0)看看怎样

0

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2006-5-3 14:36:00 | 显示全部楼层

Re:关于opengl投影的问题

在reshape中,删除gluLookAt();

display()
{
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();

gluLookAt();

glTranslatef();

...
}

1

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2006-5-3 18:35:00 | 显示全部楼层

Re:关于opengl投影的问题

thx!
我认为关键还是注意要在glMatrixMode();和glLoadIdentity();后面设置gluLookAt()
投影的定义没有问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-24 10:10

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表