Ich versuche, ein Partikelsystem in OpenGL zu erstellen, und als solches muss ich Werbetafeln verwenden.
Ich brauche diese Werbetafeln, um jederzeit vor der Kamera zu stehen.
In den Tutorials, denen ich gefolgt bin, wurde die Werbetafel nur um eine Achse gedreht, z. B. Werbetafeln, die als Gras oder Pflanzen verwendet werden. Ich benötige jedoch eine Methode zum Drehen des Quad, um immer zur Kamera zu schauen, auch wenn ich auf sie herabschaue.
Bei der Suche nach einer Antwort habe ich nur die Technik gefunden, die mat3-Komponente der Ansichts- / Modellmatrix der Kamera wieder in eine Identitätsmatrix umzuwandeln. Dies ist nicht ganz das, was ich brauche, da sich die Position des Punktes im Raum dann nie ändert.
Wie kann ich eine neue Rotationsmatrix berechnen, die ein Quad immer erfolgreich in Richtung Kamera dreht, oder eine vorhandene Matrix ändern?
Im Geometrie-Shader habe ich Zugriff auf die Position der Kamera, die Perspektivmatrix und die Ansichts- / Modellmatrix.
Ich habe keinen Shader-Code eingefügt, weil er wirklich trivial ist. Ich erstelle Eckpunkte, die einen Versatz der Position des gewünschten Punkts basierend auf der gewünschten Größe darstellen. Wenn das Quad also 50 x 50 sein sollte, ist der Scheitelpunkt die Position, die auf X und Y um 25 versetzt ist, multipliziert mit der Matrix Perspective x View der Kamera.
Lösung:
mat4 VP = pMatrix * vMatrix;
vec3 CameraRight = vec3(vMatrix[0][0], vMatrix[1][0], vMatrix[2][0]);
vec3 CameraUp = vec3(vMatrix[0][1], vMatrix[1][1], vMatrix[2][1]);
vec3 Pos = gl_in[0].gl_Position.xyz; // The desired point for the billboard
vec4 v1 = VP * vec4(Pos + CameraRight * 0.5 * Size + CameraUp * -0.5 * Size, 1.0);
vec4 v2 = VP * vec4(Pos + CameraRight * 0.5 * Size + CameraUp * 0.5 * Size, 1.0);
vec4 v3 = VP * vec4(Pos + CameraRight * -0.5 * Size + CameraUp * -0.5 * Size, 1.0);
vec4 v4 = VP * vec4(Pos + CameraRight * -0.5 * Size + CameraUp * 0.5 * Size, 1.0);