Класс 3D Camera не работает так, как должен - PullRequest
1 голос
/ 23 мая 2011

Может кто-нибудь сказать мне, почему мой класс камеры не работает правильно?Я установил вектор положения на (0,0, -10) и просмотр вектора на (0,0,0), но когда я рисую что-то на (0,0,0), его там нет.Я очень плохо знаком с векторной математикой и матричными вещами, поэтому держу пари, что именно в LookThrough () проблема заключается в этом.

import org.lwjgl.opengl.GL11;
import org.lwjgl.util.vector.Matrix3f;
import org.lwjgl.util.vector.Vector3f;

public class Camera {
     //3d vector to store the camera's position in
    Vector3f position = null;
    Vector3f lookAt = null;
    //the rotation around the Y axis of the camera
    float yaw = 0;

    //the rotation around the X axis of the camera
    float pitch = 0;

    //the rotation around the Z axis of the camera
    float roll = 0;

    public Camera(float x, float y, float z)
    {
        //instantiate position Vector3f to the x y z params.
        position = new Vector3f(x, y, z);
        lookAt = new Vector3f();
    }

    public void lookThrough()
    {
        Matrix3f m = new Matrix3f();



        Vector3f out = new Vector3f();
        Vector3f.sub(position, lookAt, out);
        out.normalise();
        //set forward vector
        m.m00 = out.x;
        m.m01 = out.y;
        m.m02 = out.z;

        //set right vector
        m.m10 = 1;
        m.m11 = 0;
        m.m12 = 0;

        //set up vector
        m.m20 = 0;
        m.m21 = 1;
        m.m22 = 0;

        yaw = (float) -(Math.tan(m.m10/m.m00));
        pitch = (float) -(Math.tan((-m.m20)/(Math.sqrt(Math.pow(m.m21, 2) + Math.pow(m.m22, 2)))));
        roll = (float) -(Math.tan(m.m21/m.m22));

        //roatate the pitch around the X axis
        GL11.glRotatef(pitch, 1.0f, 0.0f, 0.0f);
        //roatate the yaw around the Y axis
        GL11.glRotatef(yaw, 0.0f, 1.0f, 0.0f);
        //roatate the yaw around the Y axis
        GL11.glRotatef(roll, 0.0f, 0.0f, 1.0f);
        //translate to the position vector's location
        GL11.glTranslatef(position.x, position.y, position.z);
    }
}

1 Ответ

0 голосов
/ 26 мая 2011

В вашем классе есть пара вещей, которые я бы выделил:

1) Вы фиксируете свои векторы «вправо» и «вверх», оставляя только одну степень свободы вращения.Поскольку камера переориентируется в трехмерном пространстве, их необходимо будет изменить.На самом деле ваш расчет высоты тона всегда оценивается в 0, а расчет на бросок всегда оценивается в tan (1/0).

2) Хотя я не знаком с Java, вы, похоже, используетерасчет (position - lookAt) для получения вашего вектора вперед.Не должно ли быть наоборот?Вектор вперед направлен в сторону от позиции зрителя.

3) Опять же - не знаком с java - но вызовом pow () для однократного умножения, вероятно, излишне.

1 & 2 может бытьпричина твоих бед.В конечном счете, я бы посоветовал взглянуть на gluLookAt - при условии, что библиотека GLU доступна на Java.Если это не так, то посмотрите исходный код для gluLookAt (один вариант доступен здесь ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...