由于您需要的信息直接保存在投影矩阵中,因此您可以比视角更容易地做到这一点。
因此给你的投影矩阵看起来就像这样:
xScale 0 0 0
0 yScale 0 0
0 0 -(zf + zn)/(zf - zn) -(2 * zf)/(zf-zn)
0 0 -1 0
其中Z-远(ZF)和z近(ZN),xScale等和yScale是已知的。
要选择正确的Z-Depth,我们首先确保w结束为1.这样,当我们通过w进行除法时,它不会改变任何东西。
幸运的是,w很容易找到。它只是输入z的负数。因此,将-1输入到z将返回1的w。
我们假定您使用的分辨率为1024x768,并且您想要的正确比例的纹理为256x256。
我们还会进一步假设您的矩形在左上角位置-1,1和右下角位置1,1处设置。
因此,让我们插入这些东西并计算出z。
如果我们使用以下命令:
-1, 1, -1, 1
1, -1, -1, 1
我们会得到了一些东西,如下所示。
1/xScale, -1/yScale, someZThatIsn'tImportant, 1
-1/xScale, 1/yScale, someZThatIsn'tImportant, 1
视口变换变换的那些值,使得-1,1为0,0和1,-1是1024,768
因此,我们可以看到,通过执行工作((X + 1)/2)* 1024和((1-y)/ 2)* 768
所以,如果我们假设xScale为3/4,yScale为1,我们可以看到通过插入它我们会得到以下:
左上:
x = -3/4
=> ((-3/4 + 1)/2) * 1024
=> 128
y = 1
=> ((1 - 1)/2) * 768
=> 0
对于右下:
因此你可以看到,我们在屏幕中心的768x768像素的图片。很显然,获得256x256我们需要得到的w为3,所以后w分割我们有这些坐标的三分之一的大小((xScale * 1024)/ 256应该等于(yScale * 768)/ 256得到一个正方形。投影
所以,如果我们最后的坐标如下:
-1, 1, -3, 1
and
1, -1, -3, 1
,我们会得到下面的输出(W-分后):
-0.25, 0.333, unimportantZ, 1
and
0.25, -0.333, unimportantZ, 1
运行那些通过屏幕以上等式和我们得到
对于左上:
x = -0.25
=> ((-0.25 + 1)/2) * 1024
=> 384
y = 0.3333
=> ((1 - 0.3333)/2) * 768
=> 256
对于右下:
x = 0.25
=> ((0.25 + 1)/2) * 1024
=> 640
y = -0.333
=> ((1 + 0.33333)/2) * 768
=> 512
640 - 384 = 256
512 - 256 = 256
因此我们现在在正确的像素大小的矩形最后...
哇,很好的答案,谢谢 – Sam 2010-01-21 10:19:19