#java #math #opengl #vector #matrix
#java #математика #opengl #вектор #матрица
Вопрос:
Может кто-нибудь сказать мне, почему мой класс camera работает некорректно? Я установил вектор положения равным (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:
В вашем классе есть пара моментов, на которые я бы обратил внимание:
1) Вы исправляете свои векторы «вправо» и «вверх», оставляя только одну степень свободы вращения. По мере переориентации камеры в 3D-пространстве их необходимо будет изменить. В нынешнем виде ваш расчет для высоты тона всегда равен 0, в то время как ваш расчет для поворота всегда равен tan (1/0).
2) Хотя я не знаком с Java, вы, похоже, используете вычисление (position — LookAt) для получения вашего прямого вектора. Не должно ли быть наоборот? Прямой вектор указывает в сторону от положения наблюдателя.
3) Опять же — не знаком с java — но вызов pow() для выполнения одного умножения, скорее всего, излишен.
1 и 2 могут быть причиной ваших проблем. В конечном счете, я бы предложил взглянуть на gluLookAt — предполагая, что библиотека GLU доступна на Java. Если это не так, то посмотрите исходный код gluLookAt (один из вариантов доступен здесь).