OpenGL:计算1:1像素比的z值

Sam*_*Sam 1 opengl math graphics trigonometry

我的视锥体中有一个256x256纹理,我需要移动到一个z位置,在该位置纹理在ACTUAL大小的屏幕上复制.

到目前为止我所拥有的是:

    const float zForTrueScale = -((itemSize/2) / tanf(DEGREES_TO_RADIANS(fieldOfView/2)) ) * 2;     
Run Code Online (Sandbox Code Playgroud)

其中itemSize是世界空间中纹理的大小(2.0单位).这是为了计算itemSize/2(相反)为1.0时的Z(相邻).我认为这会奏效.

无论我使用何种FOV,该公式都显示纹理始终太小约10%.

谢谢

编辑:我在3D空间中移动图像,需要无缝过渡到正确的z距离.我不能使用orthagonal投影,它必须在视锥体.

Goz*_*Goz 6

由于您需要的信息直接保存在投影矩阵中,因此您可以比使用视野更轻松地执行此操作.

因此,您的投影矩阵将如下所示:

xScale     0               0                     0
0        yScale            0                     0
0          0     -(zf + zn)/(zf - zn)  -(2 * zf) / (zf-zn) 
0          0              -1                     0
Run Code Online (Sandbox Code Playgroud)

其中z-Far(zf)和z-Near(zn),xScale和yScale是已知的.

为了选择正确的Z-Depth,我们首先要确保w最终为1.这样,当我们除以w时,它不会改变任何东西.

幸运的是,很容易搞定.它只是输入z的负数.因此,输入-1到z将返回1的aw.

我们假设您使用的分辨率为1024x768,并且您想要的纹理尺寸正确为256x256.

我们还将进一步假设您的矩形设置为左上角位于-1,1和右下角的1,-1.

所以让我们插入这些并计算出z.

如果我们使用以下内容:

-1, 1, -1, 1
1, -1, -1, 1
Run Code Online (Sandbox Code Playgroud)

我们会得到如下的东西.

1 / xScale, -1 / yScale, someZThatIsn'tImportant, 1
-1 / xScale, 1 / yScale, someZThatIsn'tImportant, 1
Run Code Online (Sandbox Code Playgroud)

视口变换转换这些值,使-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
Run Code Online (Sandbox Code Playgroud)

对于右下角:

x = 3/4
=> ((3/4 + 1) / 2) * 1024
=> 896
y = -1
=> ((1 + 1) / 2) * 768
=> 768
Run Code Online (Sandbox Code Playgroud)

因此,您可以看到我们在屏幕中心有一个768x768像素的图像.显然要获得256x256我们需要得到w为3以便w w divide我们将那些坐标设置为大小的第3个((xScale*1024)/ 256应该等于(yScale*768)/ 256以获得正方形投影.

所以如果我们的最终坐标如下:

-1, 1, -3, 1
and
1, -1, -3, 1
Run Code Online (Sandbox Code Playgroud)

我们将得到以下结果(在w-除后):

-0.25, 0.333, unimportantZ, 1
and
0.25, -0.333, unimportantZ, 1
Run Code Online (Sandbox Code Playgroud)

通过上面的屏幕方程运行那些,我们得到

左上角:

x = -0.25
=> ((-0.25 + 1) / 2) * 1024
=> 384
y = 0.3333
=> ((1 - 0.3333) / 2) * 768
=> 256
Run Code Online (Sandbox Code Playgroud)

对于右下角:

x = 0.25
=> ((0.25 + 1) / 2) * 1024
=> 640
y = -0.333
=> ((1 + 0.33333) / 2) * 768
=> 512

640 - 384 = 256
512 - 256 = 256
Run Code Online (Sandbox Code Playgroud)

因此,我们现在有正确像素大小的最终矩形...