如何用OpenGL实现3d场景的精确输出?
davic 2006-12-03 08:29:11 本人把3ds模型读入OpenGL后,对模型进行视图变换、透视投影变换、再进行视口变换,然后显示在屏幕上,并将场景保存为位图,因实验要求,需要对保存的位图图象大小进行精确控制。也就是说需要计算一个顶点坐标为(-230.0,-230.0,-550.0)
(-230.0,230.0,-550.0),(230.0,230.0,-550.0),(230.0,-230.0,-550.0),的正方形经过视图变换、透视投影变换、行视口变换(以上几个变换参数已知)后显示在屏幕上到底有几个像素?
请各位大虾拔刀相助啊!
把各个参数代入变换矩阵,按变换顺序用MATLAB算了一下,与实际保存下来的像素数相差甚远!不知为何?计算过程如下:
标顶点a=(-230,-230,-550,1),视图变换为矩阵为单位矩阵,即默认在原点观察,透视投影变换为gluPerspective(60.0f,4/3,1.0f,800.0f);即透视矩阵为:
p=[3*cot(30)/4, 0, 0, 0
0, cot(30), 0, 0
0,0,801/799,800*2/799
0, 0, -1, 0]
视口变换为glViewport(0,0,800,600);
对a进行视图和投影变换:a'=p*a=(26.9307,35.9076,-549.3742,500)
再进行透视除法:a''=a'/500=(0.049,0.0653,-0.9989,1.0000)
然后进行视口变换转化为屏幕坐标:
利用公式:Xwin=(Xnd+1)width/2+x=(0.049+1)*800/2+0=419.6
Ywin=(Ynd++1)height/2+y=(0.0653+1)*600/2+0=319.59
按同样步骤也算了顶点b=(-230.0,230.0,-550.0,1)
得Xwin'=419.6
Ywin'=280.41
这样两个顶点之间的像素坐标距离为39.2
实际用PHOTOSHOP查看两点之间却有410个像素!!!