openGL中关于将gluPerspective透视投影变换为glOrtho正交投影的问题
我原来使用的透视投影,基本设置为如下
视区及投影设置:
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




