Я работаю с LWJGL и openGL и пытаюсь реализовать RayCasting для преобразования позиции курсора в трехмерную точку.
Я пробовал много способов (встроенных и полностью ручных), но результат всегдато же самое: GIF задачи
Стена в GIF имеет плоскость ax = 0, y = 0, z = 1, и я использую двоичный поиск, чтобы найти пересечение и переместить кубв положение курсора.
Вот некоторый соответствующий код:
private static Vector3f mouseRay = new Vector3f();
protected static GLFWCursorPosCallback cursorPosCallback = new GLFWCursorPosCallback() {
@Override
public void invoke(long window, double xpos, double ypos) {
cursorPosX = xpos;
cursorPosY = ypos;
Vector3f origin = new Vector3f();
int[] viewport = new int[4];
viewport[2] = Game.window.getWidth();
viewport[3] = Game.window.getHeight();
MasterRenderer.getProjectionMatrix()
.unprojectRay((float) xpos, (float) (Game.window.getHeight() - ypos), viewport, origin, mouseRay);
mouseRay.normalize();
//wallIntersection = binarySearch(Game.activeCamera.getPosition(), 0, 0, RAYCASTING_RAY_RANGE, mouseRay);
float distance = Intersectionf.intersectRayPlane(Game.camera.getPosition(), mouseRay, new Vector3f(0,0,0), new Vector3f(0,0,1), 1e-5f);
wallIntersection = getPointOnRay(Game.camera.getPosition(), mouseRay, distance);
public static Vector3f getPointOnRay(Vector3f origin, Vector3f ray, float distance) {
Vector3f camPos = origin;
Vector3f start = new Vector3f(camPos.x, camPos.y, camPos.z);
Vector3f scaledRay = new Vector3f(ray.x * distance, ray.y * distance, ray.z * distance);
return start.add(scaledRay);
}
Обновление луча выполняется в режиме обратного вызова мыши.Я попробовал это и за пределами обратного вызова, но обратный вызов звучит более эффективно.
И матрица проецирования от средства визуализации
private void createProjectionMatrix() {
float aspectRatio = (float) Game.window.getWidth() / (float) Game.window.getHeight();
float y_scale = (float) ((1f / Math.tan(Math.toRadians(FOV / 2f))) * aspectRatio);
float x_scale = y_scale / aspectRatio;
float frustum_length = FAR_PLANE - NEAR_PLANE;
projectionMatrix = new Matrix4f();
projectionMatrix._m00(x_scale);
projectionMatrix._m11(y_scale);
projectionMatrix._m22( -((FAR_PLANE + NEAR_PLANE) / frustum_length) );
projectionMatrix._m23( -1 );
projectionMatrix._m32( -((2 * NEAR_PLANE * FAR_PLANE) / frustum_length) );
projectionMatrix._m33( 0 );
}
Мне кажется, что мне нужно повернуть с помощью viewMatrix:
Matrix4f matrix = new Matrix4f()
.rotateX((float) Math.toRadians(camera.getPitch()))
.rotateY((float) Math.toRadians(camera.getYaw()))
.rotateZ((float) Math.toRadians(camera.getRoll()))
.translate(new Vector3f(-camera.getPosition().x, -camera.getPosition().y, -camera.getPosition().z));
Но я просто не могу заставить его работать.Буду очень признателен за любую помощь!