Witajcie,
mam problem z tzw. "frustum culling". Chciałbym obliczyć wektory normalne do powierzchni wyznaczonych na podstawie pozycji, rotacji kamery oraz jej parametrów: fov, near_plane, far_plane, lecz pomimo wielu przeczytanych toutoriali, nadal mi to nie wychodzi. Link do głównego toutorialu LINK
Klasa Camera.java
public class Camera {
private Vector3f position;
private Vector3f rotation = new Vector3f(0f,0f,0f); // x - Pitch, y - Yaw, z - Roll
private float fov = 90;
private float nearPlane = 0.1f;
private float farPlane = 1000f;
}
Klasa Maths.java - tworzenie macierzy projekcji i macierzy widoku
public class Maths {
public static Matrix4f createProjectionMatrix(float FOV, float FAR_PLANE, float NEAR_PLANE) {
//Main.getWindowWidth() - szerokość okna
//Main.getWindowHeight() - wysokość okna
float aspectRatio = (float)Main.getWindowWidth() / (float)Main.getWindowHeight();
float y_scale = ((float)(1.0f / Math.tan(Math.toRadians(FOV / 2.0f))) * aspectRatio);
float x_scale = y_scale / aspectRatio;
float frustum_length = FAR_PLANE - NEAR_PLANE;
Matrix4f projectionMatrix = new Matrix4f();
projectionMatrix.m00(x_scale);
projectionMatrix.m11(y_scale);
projectionMatrix.m22(-((FAR_PLANE + NEAR_PLANE) / frustum_length));
projectionMatrix.m23(-1.0f);
projectionMatrix.m32(-((2 * NEAR_PLANE * FAR_PLANE) / frustum_length));
projectionMatrix.m33(0.0f);
return projectionMatrix;
}
public static Matrix4f createViewMatrix(Camera camera) {
Matrix4f viewMatrix = new Matrix4f().identity();
Vector3f cameraRotation = camera.getRotation();
//cameraRotation.x - Pitch
//cameraRotation.x - Yaw
//cameraRotation.x - Roll
viewMatrix.rotate((float) Math.toRadians(cameraRotation.x), new Vector3f(1,0,0), viewMatrix);
viewMatrix.rotate((float) Math.toRadians(cameraRotation.y), new Vector3f(0,1,0), viewMatrix);
viewMatrix.rotate((float) Math.toRadians(cameraRotation.z), new Vector3f(0,0,1), viewMatrix);
Vector3f negCameraPos = new Vector3f(camera.getPosition()).negate();
viewMatrix.translate(negCameraPos);
return viewMatrix;
}
}
Przykładowe wartości macierzy: (wymiary okna 1300 x 650)
No i tutaj zaczyna się problem, bo zbytnio nie rozumiem w jaki sposób z tych macierzy wyciągnąć informacje o wektorach normalnych do odpowiednich powierzchni. Jak na razie wszystkie próby kończą się czymś takim:
Za każdą wskazówkę będę bardzo wdzięczny :)