2016-05-24 23 views
1

Ich habe Probleme mit der rotierenden Kamera um die X-Achse herum. Ich habe ein Bild in der Kameraszene und wenn ich mit der Kamera nachschaue, möchte ich ein Bild in der Szene behalten.webgl Kamera um die X-Achse drehen

Zuerst baute ich einige Funktionen bis zu Matrizen erstellen:

mat4 makeTranslation(float tx, float ty, float tz) { 
    return mat4(
     1., 0., 0., 0., 
     0., 1., 0., 0., 
     0., 0., 1., 0., 
     tx, ty, tz, 1. 
    ); 
} 
mat4 makeXRotation(float angleInDegrees) { 
    float angleInRadians = angleInDegrees * M_PI/180.; 
    float c = cos(angleInRadians); 
    float s = sin(angleInRadians); 

    return mat4(
     1., 0., 0., 0., 
     0., c, s, 0., 
     0., -s, c, 0., 
     0., 0., 0., 1. 
    ); 
} 
mat4 makeZRotation(float angleInDegrees) { 
    float angleInRadians = angleInDegrees * M_PI/180.; 
    float c = cos(angleInRadians); 
    float s = sin(angleInRadians); 
    return mat4(
     c, s, 0., 0., 
     -s, c, 0., 0., 
     0., 0., 1., 0., 
     0., 0., 0., 1. 
    ); 
} 
// camera 
mat4 myW2N(float ax, float ay, float zNear, float zFar) { 
    float cx = 1.0/ax; 
    float cy = 1.0/ay; 
    float z0 = -zNear; 
    float z1 = -zFar; 
    float az = (z0 + z1)/(z0 - z1); 
    float bz = (1. - az) * z0; 
    return mat4(
     cx, 0., 0., 0., 
     0., cy, 0., 0., 
     0., 0., az, bz, 
     0., 0., -1., 0. 
    ); 
} 
// transpose 
mat3 rotationW2R() { 
    return mat3(
     0., 0., 1., 
     1., 0., 0., 
     0., 1., 0. 
    ); 
} 

als nur trasnlated Kameraposition in Y-Achse wie folgt aus:

<a href="https://s33.postimg.org/roc5btx6n/translate.png">panorama</a><br>

float ax = tan(hFOV * M_PI); 
float ay = ax/aspectRatio; 
mat4 res = makeTranslation(0., move_y, 0.) * myW2N(ax,ay,6.,2.); 

Aber ich don Ich möchte die Kameraposition übersetzen Ich möchte drehen Sie es um die Achse und halten Bild in der Szene wie folgt aus:

<a href="https://s33.postimg.org/x2xwg35tr/rotate.png">photo</a>

Und das ist, wie ich versuche, es zu tun:

float ax = tan(hFOV * M_PI); 
float ay = ax/aspectRatio; 
mat4 res = makeXRotation(pitch) * makeZRotation(roll) * makeTranslation(0., move_y, 0.) * myW2N(ax,ay,6.,2.); 

Aber am Ende mein Bild verschieben Sie es nicht auf nach oben und unten nicht nur beiden Seiten nach oben oder gerade unten erweitert:

<a href="https://s33.postimg.org/gamj7mdkv/asdasdasdasdadsasdas.png">photo</a>

und um es zu erweitern veritacally muss ich Kamera ar drehen Um X-Achse, wenn ich es um die Y-Achse rotiere, dehnt es sich horizontal aus.

Haben Sie keinen Rat, wie Sie es beheben können?

+0

Also, was willst du Billboards? Ein Quad, das immer zur Kamera zeigt? –

+0

@ WacławJasper Nicht sicher, was Sie mit Werbetafeln meinen, aber ja, ich möchte einen Quad, der immer der Kamera zugewandt ist, wo immer sich die Kameraszene bewegt, ich möchte auch dort mein Bild bewegen. –

Antwort

1

Billboard ist der gebräuchliche Name für ein Quad, das immer der Kamera zugewandt ist.

Die Billboard-Mesh-Daten sind eine Ebene, die der Kamera zugewandt ist (z = 0).

Sie können eine Plakatfläche rendern, indem Sie den Rotationsteil der Modellansichtsmatrix auf 0 setzen und nur den Übersetzungsteil: gl_Position = projection * zeroRotationAndScaling(view * model) * attr_position; im Vertex-Shader belassen.

Wenn Sie google auf der Suche nach "Billboard" Im sicher finden Sie viele Referenzen wie this.

+0

Ich dachte, es ist ein Fragment Shader-Problem. Wie auch immer, ich werde es heute versuchen und dann werde ich dich wissen lassen, danke für die Antwort! –

+0

Eine andere Frage: Wenn ich gl_Position auf diese Weise berechne, beeinflusse ich alle Inhalte meiner 3D-Welt? Weil ich "Billboard" Verhalten nur auf meinem Bild anwenden und Panoramabild ohne Änderungen behalten möchte. Sie können auf meinen Bildern oben sehen. –

+0

Ja. Verwenden Sie entweder einen anderen Shader für die Plakatwand oder übergeben Sie eine Modellmatrix, so dass 'view * matrix == zeroRotationAndScaling (view * model)'. –