有人能告诉我为什么我的相机课不能正常工作吗?我将位置向量设置为(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);
}
}
答案 0 :(得分:0)
我要强调你的班级有几件事情:
1)你正在修复你的'右'和'向上'向量,只留下一个旋转自由度。随着相机在3D空间中重新定位,这些将需要改变。就目前而言,您对音高的计算总是计算为0,而您的掷骰计算总是计算为tan(1/0)。
2)虽然我不熟悉Java,但您似乎正在使用计算(position-lookAt)来派生前向向量。应该不是相反?前向矢量指向远离观察者的位置。
3)再次 - 不熟悉java - 但调用pow()进行单次乘法可能有点过头了。
1& 2可能是你的困境的原因。最后我建议看一下gluLookAt - 假设GLU库是用Java提供的。如果不是,那么请查看gluLookAt的源代码(一个变体可用here)。