关于OPENGL中的长度以及显示坐标轴的方法

关于OPENGL中的长度,写给像我一样刚入门的SB OPENGLER(二)

(2012-07-18 17:41:55)
转载
标签:

杂谈

 

往往最基础的问题,会影响到最顶层的理解,如今我开始想不通到底在opengl中,单位1代表的长度是多少呢?

然后网络上的各种“高手”的解答,又是一堆对新手毫无意义的回答:有扯到视图变换的,有彻底投影变换的。诚然OPENGL中由于涉及多个矩阵变换,单纯的 从某个图看其长度是不正确的,但每个三维图元(投影到二维屏幕)再始创之初,必然是有长度概念的,然后经过各种矩阵变换,其视觉长度也在发生变换。如果拘 泥与三维空间而不是二维屏幕,那必然需要有长度的概念,不然试问如何想象这个三维物体在真实空间的位置和呈现呢?

言归正传,首先拿glutWireCube(1)这个立方体函数为例,其传入参数为GLdouble size,这个GLdouble对我们而言显然缺乏意义,到底指的是像素,还是其他单位呢?

于是我做了个试验,干脆用土办法来确定吧,于是我再display函数中加了以下代码,并且忽视掉reshape函数,即不考虑任何矩阵相乘和变换,让摄像机处于全局坐标系原点:

 glClear(GL_COLOR_BUFFER_BIT);
 glColor3f(1,1,1);
 glutWireCube(1);
 glBegin(GL_POINTS);
 for(int i=0;i<10;i++)
   glVertex3f((float)i/10,0,0);
 glEnd();
 glFlush();

而在main函数中,已经指定窗口大小为500*500像素,于是我们得到了一张如下的图关于OPENGL中的长度,写给像我一样刚入门的SB <wbr>OPENGLER(二)

可以看到,经过for循环,在x轴正向产生了11个点10个区间,而总长度为1;同时我们画的以1为长度的立方体也证明了这一点,即在该程序(窗口)中,1的长度等于250个像素

那么当窗口的大小变化呢,可以拖拉窗口,使其变成500*250,这个时候可以看到明显的变形,立方体已经变成了长方体。这里我们会很深刻的意识到,如果要保持立方体的形态,reshape函数中的glViewport函数就其很大的作用了,不过这就是题外话了。


然后我们又如何在三维空间描述这个立方体呢,比方说一个长度为10cm的立方体?由于上图可见,坐标轴的中心原点在窗口中心,向右为X 正向,向上为Y轴正向,向着自己是Z轴正向。因此可以随意指定OPENGL中的1是多少,就比方说1是10CM吧,那这10CM=1.0f=250像素长 度。但是要记住,当10cm对应的1的长度定下来以后,相对因的其他矩阵以及变换,都要以这个为比例,比如说将立方体向Z轴负向平移 10CM(glTranslatef),其平移单位也必须是1。当然这只是直观的表述了10cm和1.0f和250像素长度的关系,实际上只要了解了,应 用其长度可以非常灵活。可惜网络上的“高手”解答没能做到详细直观

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值