CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  图形处理/算法

openGL中关于将gluPerspective透视投影变换为glOrtho正交投影的问题

楼主sewawa()2005-03-03 12:32:10 在 VC/MFC / 图形处理/算法 提问

我原来使用的透视投影,基本设置为如下  
      视区及投影设置:  
                    CView::OnSize(nType,   cx,   cy);  
  //   TODO:   Add   your   message   handler   code   here  
                    /////////////////////////////////////////////////////////////////  
                    //添加窗口缩放时的图形变换函数  
  glViewport(0,0,cx,cy);  
                    /////////////////////////////////////////////////////////////////  
  GLdouble   aspect_ratio;  
  aspect_ratio   =   (GLdouble)cx/(GLdouble)cy;  
  glMatrixMode(GL_PROJECTION);  
  glLoadIdentity();  
  gluPerspective(30.0F,   aspect_ratio,   1.0F,   10000.0F);  
                    glMatrixMode(GL_MODELVIEW);  
  glLoadIdentity();  
      绘图部分如下:  
                    glClear(   GL_COLOR_BUFFER_BIT   |   GL_DEPTH_BUFFER_BIT   );  
  glMatrixMode(GL_MODELVIEW);  
  glLoadIdentity();     //清空矩阵  
   
  gluLookAt(0.0,   0.0,   -30.0,   0.0,   0.0,   0.0,   0.0,   1.0,   0.0);    
  //glTranslatef(   0.0,   0.0,   -30.0   );  
  glRotatef(rotation,0.0,1.0,0.0);  
  glPushMatrix();  
  glCallList(Model);  
  rotation   =   (rotation       +   1)       %   360;  
  glPopMatrix();  
      按上面方法绘出正确的图像来。  
      但是我想将其转化成正交投影来实现,  
      视区及投影设置改为:  
                    CView::OnSize(nType,   cx,   cy);  
  //   TODO:   Add   your   message   handler   code   here  
                    /////////////////////////////////////////////////////////////////  
                    //添加窗口缩放时的图形变换函数  
  glViewport(0,0,cx,cy);  
                    /////////////////////////////////////////////////////////////////  
  GLdouble   aspect_ratio;  
  aspect_ratio   =   (GLdouble)cx/(GLdouble)cy;  
  glMatrixMode(GL_PROJECTION);  
  glLoadIdentity();  
  GLdouble   nRange=1.0;  
          if   (cx   <=   cy)  
                  glOrtho   (-nRange,   nRange,   -nRange*aspect_ratio,   nRange*aspect_ratio,   -2*nRange,   2*nRange);  
          else  
          glOrtho   (-nRange*aspect_ratio,   nRange*aspect_ratio,   -nRange,   nRange,   -2*nRange,   2*nRange);  
                    glMatrixMode(GL_MODELVIEW);  
  glLoadIdentity();  
      绘图部分如下:  
                    glClear(   GL_COLOR_BUFFER_BIT   |   GL_DEPTH_BUFFER_BIT   );  
  glMatrixMode(GL_MODELVIEW);  
  glLoadIdentity();     //清空矩阵  
   
  gluLookAt(0.0,   0.0,   -0.30,   0.0,   0.0,   0.0,   0.0,   1.0,   0.0);   //修改模型移动的数值  
  //glTranslatef(   0.0,   0.0,   -0.30   );  
  glRotatef(rotation,0.0,1.0,0.0);  
  glPushMatrix();  
  glCallList(Model);  
  rotation   =   (rotation       +   1)       %   360;  
  glPopMatrix();  
      可是经过以上变化后经过编译得到的却是黑屏,这是怎么原因呢?有什么办法可以解决?谢谢!  
   
  问题点数:100、回复次数:11Top

1 楼happy__888([顾问团]寻开心 www.e-jjj.com)回复于 2005-03-03 14:08:06 得分 95

range太小了吧  
   
  你看的透视投影的近裁剪是1   ,远是1000  
  而ortho的时候,近是-2,远是2  
   
  是否是你的模型在视锥之外啊  
  Top

2 楼Featured(我握着爱情的门票静静排队……)回复于 2005-03-03 14:13:06 得分 5

友情帮顶Top

3 楼sewawa()回复于 2005-03-03 14:22:50 得分 0

happy__888([顾问团]寻开心)   :是,我也觉得有问题,那么请问一般用什么方法来判断模型是否在视锥之中呢?  
      Featured(阿卓仔   【升了三角,庆祝   】)   :谢。Top

4 楼sewawa()回复于 2005-03-03 14:32:58 得分 0

另外我把ortho的近改成1,远是1000,程序依然不能正常工作。Top

5 楼sewawa()回复于 2005-03-03 14:37:39 得分 0

请问一下如何将不在视锥中的物体移入视锥中?Top

6 楼happy__888([顾问团]寻开心 www.e-jjj.com)回复于 2005-03-03 14:47:07 得分 0

首先要确定你的模型有多大,然后是在什么位置  
  正交投影的情况下,长宽和上下和远近距离确定了长方体方式的视锥  
  视锥太大和太小都会影响你的显示效果的  
  应该和场景大小有一定的对应关系才合适  
   
  不知道你的模型大小是多少   1×1×1的,还是1000×1000*1000的  
   
  写成这个样子不好   :  
      glOrtho   (-nRange*aspect_ratio,   nRange*aspect_ratio,   -nRange,   nRange,   -2*nRange,   2*nRange);  
  因为nRange太小远近裁剪使得物体看不到  
  nRange太大,远近裁剪合适了,上下左右又的合适了——可见的范围太大,物体显得太小了  
  这个是个矛盾的  
   
  因此最好不要用一个nRange来控制它,可以这样写:  
  nRange   =   50;  
  glOrtho   (-nRange*aspect_ratio,   nRange*aspect_ratio,   -nRange,   nRange,   -200,200);  
  试试看吧  
  Top

7 楼happy__888([顾问团]寻开心 www.e-jjj.com)回复于 2005-03-03 14:53:28 得分 0

把物体移动到视锥当中两种办法  
  1   移动物体  
  2   移动相机  
   
  假定物体在x0,y0,z0的地方,大小是L*W*H  
  你可以按照三角函数的关系计算一下,或者空间几何位置关系计算:  
  首先  
          相机坐标xe,ye,ze让他们初始化和x0,y0,z0相同  
  然后移动相机到物体范围外面:  
          xe   =   x0   -   L       《1》  
          ye   =   y0   -   W       《2》  
          ze   =   z0   -   H       《3》  
  上述三个写那个都可以,假定上向量依然是0   1   0   ,   我们从z方向看,公式就是这样了  
  glLookAt(x0,   y0,   z0-H,   x0,   y0,   z0,   0,   1,   0)  
  这个和你目前用的方式差不多,只是从原来的相机在原点,向z方向看,  
  改位从物体的后面,看物体而已  
   
  glOrtho里面可以把leftright,和bottom和top蚕室分别设置位   W或者H参数即可  
  glLookAt可以做到物体在相机当中:  
  Top

8 楼sewawa()回复于 2005-03-03 15:35:16 得分 0

谢谢顾问团先生,按你的方法作这个问题基本解决了,现在可以画出该三维物体了。由于我的模型物体是3ds文件通过View3DS.exe转换成显示列表再读入的。因此我的物体模型有多大,在什么位置我也说不太清楚。您说有没有得出该显示列表构成的物体大小与位置的方法或函数呢?谢谢!Top

9 楼happy__888([顾问团]寻开心 www.e-jjj.com)回复于 2005-03-03 15:51:04 得分 0

3ds文件当中的物体的顶点的范围是很随意的  
   
  但是既然你已经把他们加载到内存了,那么肯定是有办法访问到他们的每个顶点坐标的  
   
  计算他们的包围盒应该会吧(分别找各个顶点的x,y,z分量的最大和最小值)  
   
  这个包围盒就表明了物体的中心,大小和位置了Top

10 楼happy__888([顾问团]寻开心 www.e-jjj.com)回复于 2005-03-03 16:01:33 得分 0

在组件自己的场景的时候,不应该直接使用这些从模型文件当中导入的数据  
  而是应该首先计算他们的包围盒  
  然后使用平移和比例变换把模型规范化到自己希望的位置和大小上  
  比如,你可能从文件当中导入的模型大小是1000×1000×1000,中心点位置在800,300,   -2000  
  这样的位置都是有可能的  
  而你希望这个东西,在你的场景当中只有10×10×10大小,放在5,   5,   20的位置  
  这样你就必须先把物体移动到原点,然后缩小100倍,然后再移动到指定的位置,进行这样一系列的操作之后,这个物体才算摆放合格呢。Top

11 楼sewawa()回复于 2005-03-03 17:37:16 得分 0

顾问团:谢谢你,经过你的指点,收获颇多。Top

相关问题

  • 正交投影中,如何将场景中的物体缩放显示?
  • 投影机选购
  • 投影机选购
  • 画山的投影图
  • 把点投影到任意平面中
  • 求解柱面投影的算法!
  • pigsir请进,关于透视投影
  • 谁能介绍一款投影机~~??
  • 关于坐标投影转换?
  • 【【【【【【【EPSON爱普生EMP-820投影机转让.

关键词

  • gldouble
  • 投影
  • 变换
  • glmatrixmode
  • glloadidentity
  • cy
  • cx
  • aspect
  • ratio
  • gl

得分解答快速导航

  • 帖主:sewawa
  • happy__888
  • Featured

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo