2017-02-11 3 views
0

Ich schrieb eine Voxel-Engine, als ich dieses seltsame Problem mit Gesichtern bekam.Voxel Engine, Gesichter werden abgehört, wenn die Kamera herausschwenkt

Also, wenn ich weg vom Gelände, alles bricht. Ich habe nicht einmal eine Idee, wie ich das Problem beschreiben soll. Ich werde einige Screenshots veröffentlichen.

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

fand ich heraus, wenn ich mit dem vorletzten Wert spielen und das Problem zu 1.0f ändern teilweise verschwindet. Aber ich möchte diesen Wert nicht bei 1,0f halten.

Ich poste Definition dieser Funktion:

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; 
} 

Ich habe völlig keine Ahnung, wie damit umgehen.

+0

Können Sie erklären, was wir in den Screenshots sehen und was ist falsch daran? Warum möchten Sie den Wert für "Znear" nicht in einen Wert ändern, der funktioniert? Es ist wichtig, die nahen und fernen Clipping-Ebenen auf vernünftige Werte zu setzen. Welche Bittiefe verwenden Sie für Ihren Tiefenpuffer? –

+0

Geht es weg, wenn Sie einen kleineren Bereich von nah bis fern wählen, sagen wir 1.0f bis 1000.0f? –

+0

Nicht ganz, ich muss weiter weg mit der Kamera, um diesen Bug wieder zu sehen. – Brajanowski

Antwort

0

Überprüfen Sie Ihre Mathematik.

ret[2][2] = (-near - far)/range; sieht nicht richtig aus. Wenn Sie an einer vorhandenen Bibliothek suchen (zB neueste GLM) werden Sie in der Lage sein zu sehen, was ich meine:

GLM Result[2][2] = (zFar + zNear)/(zFar - zNear); verwendet, wenn Clip Raum -1, 1.

Auch sollte ret[2][3] = 2.0f * far * near/range; sein ret[3][2] = 2.0f * far * near/range; und ret[2][3] sollte 1 sein - ret[2][3] = 1;

Als eine Randnotiz, ist die Verwendung Ihrer eigenen Mathebibliothek fast immer nicht die beste Idee. Etablierte werden immer von vielen Leuten rigoros getestet. Es kann eine großartige Übung sein, ich habe es selbst in der Vergangenheit gemacht, aber vielleicht wäre es eine gute Idee, eine vorhandene Bibliothek zu benutzen, um Ihre Ergebnisse zu testen.

Verwandte Themen