2017-02-11 54 views
0

我在写这个奇怪的脸部问题时正在写一个体素引擎。体素引擎,当相机掉出来时脸部会被窃听

因此,当我离开地形时,一切都断裂。我什至不知道如何描述我将发布一些截图的问题。

camera_projection = bb_perspective(bb_toRadiansReal32(70.0f), ((r32)WINDOW_WIDTH/(r32)WINDOW_HEIGHT), 0.1f, 1000.0f); 

我发现,当我第二个玩到最后一个值,并更改设置为1.0F问题部分消失。但我不想将此值保持在1.0f。

我张贴此函数的定义:

static bbMat4 bb_perspective(r32 fov, r32 aspect, r32 near, r32 far) { 
    bbMat4 ret(1.0f); 

    r32 range = near - far; 
    r32 tan_half_fov = tanf(fov/2.0f); 

    ret[0][0] = 1.0f/(tan_half_fov * aspect); 
    ret[1][1] = 1.0f/tan_half_fov; 
    ret[2][2] = (-near - far)/range; 
    ret[2][3] = 2.0f * far * near/range; 
    ret[3][3] = 0.0f; 
    ret[3][2] = 1.0f; 

    return ret; 
} 

我已经完全不知道如何处理这事。

+0

你能解释一下我们在屏幕截图中看到的和它有什么问题吗?您为什么不想将znear值更改为可用的值?将近距和远距剪辑平面设置为合理的数值是至关重要的。你用什么深度的深度缓冲区? –

+0

如果您选择从近到远的较小范围,例如1.0f到1000.0f,它会消失吗? –

+0

不完全,我不得不用相机再次看到这个bug。 – Brajanowski

回答

0

检查你的数学。

ret[2][2] = (-near - far)/range;看起来不正确。如果你看一下现有的库(如最新GLM),你就可以明白我的意思:

GLM使用Result[2][2] = (zFar + zNear)/(zFar - zNear);当剪辑空间为-1,1

而且ret[2][3] = 2.0f * far * near/range;应该ret[3][2] = 2.0f * far * near/range;ret[2][3]应该是1 - ret[2][3] = 1;

作为一个方面说明,使用自己的数学库几乎总是不是最好的主意。成立的人总是受到很多人的严格测试。尽管这可能是一个很好的练习,但我过去也是这样做的,但也许可以利用现有的库来测试你的输出是一个好主意。