我在LWJGL3.0中创建Camera时遇到问题。当我在c ++中使用opengl时,需要创建一个像这样定义的Camera类。
class Camera
{
public:
// Camera Attributes
glm::vec3 Position;
glm::vec3 Front;
glm::vec3 Up;
glm::vec3 Right;
glm::vec3 WorldUp;
// Eular Angles
float Yaw;
float Pitch;
// Camera options
相机有三个矢量,Up,Target和Pos来定义它。它仍有Yaw和Pitch可以向任何方向旋转。众所周知,viewmatrix可以像这样计算:
private void genVieMatrix() {
// calculate direction
Vector3f cameraDirection = Vector3f.sub(mEyeTarget, mEyePos, null);
cameraDirection.normalise();
// calculate right axis
Vector3f cameraRight = Vector3f.cross(cameraDirection, mEyeUp, null);
cameraRight.normalise();
Vector3f up = Vector3f.cross(cameraRight, cameraDirection, null);
up.normalise();
// lookat
Matrix4f matrix = new Matrix4f();
matrix.setIdentity();
matrix.m00 = cameraRight.x;
matrix.m01 = up.x;
matrix.m02 = -cameraDirection.x;
matrix.m10 = cameraRight.y;
matrix.m11 = up.y;
matrix.m12 = -cameraDirection.y;
matrix.m20 = cameraRight.z;
matrix.m21 = up.z;
matrix.m22 = -cameraDirection.z;
matrix.translate(new Vector3f(-mEyePos.x, -mEyePos.y, -mEyePos.z));
}
但是当我尝试在LWJGL 3.0中使用视图矩阵时,我发现创建视图矩阵的最常用方法如下:
Matrix4f viewMatrix = new Matrix4f();
Matrix4f.translate(camerapos, viewMatrix, viewMatrix);
当改变相机的旋转时,它们只是旋转矩阵。创建视图矩阵怎么这么简单?
所以我尝试使用三个向量,up,target和pos,在LWJGL演示中创建视图矩阵,将其替换为原始的。然后我发现没有显示任何东西。
我的代码:
private ShaderProgram mProgram;
private Shader mVertexShader;
private Shader mFragmentShader;
private VertexArrayObject VAO;
private VertexBufferObject VBO;
//private VertexBufferObject EBO;
private Cube mCubeData;
private Camera mCamera;
private Vector3f eyePos = new Vector3f(0.0f, 0.0f, 0.0f);
private Vector3f eyeUp = new Vector3f(0.0f, 1.0f, 0.0f);
private Vector3f eyeTarget = new Vector3f(0.0f, 0.0f, -5.0f);
private Texture mTexture;
private FloatBuffer projectMatrix;
private FloatBuffer mViewMatrix;
private Matrix4f mModelMatrix;
public SkyBoxProgram() {
}
private void compileShaders() {
mVertexShader = Shader.loadShader(GL_VERTEX_SHADER, VERTEX_SHADER_PATH);
mFragmentShader = Shader.loadShader(GL_FRAGMENT_SHADER, FRAGMENT_SHADER_PATH);
mProgram = new ShaderProgram();
mProgram.attachShader(mVertexShader);
mProgram.attachShader(mFragmentShader);
mProgram.bindFragmentDataLocation(0, "out_colour");
mProgram.link();
}
private void prepareData() {
mCubeData = new Cube(0.4f);
mCamera = new Camera(eyePos, eyeUp, eyeTarget);
Matrix4f matrix4f = mCamera.getViewMatrix();//GeneralSetting.getViewMatrix(new Vector3f(0, 0, -10f));
mViewMatrix = BufferUtils.createFloatBuffer(16);
matrix4f.store(mViewMatrix);
//mViewMatrix = GeneralSetting.getViewMatrix(new Vector3f(-1f, 0, -1f));
matrix4f = GeneralSetting.createProjectionMatrix();
projectMatrix = BufferUtils.createFloatBuffer(16);//GeneralSetting.getProjectionMatrix(60f, 1.33f, 0.1f, 10f);
matrix4f.store(projectMatrix);
projectMatrix.flip();
mModelMatrix = new Matrix4f();
mModelMatrix.setIdentity();
VAO = new VertexArrayObject();
VBO = new VertexBufferObject();
VAO.bind();
VBO.bindBuffer(GL_ARRAY_BUFFER);
VBO.bufferFloatData(GL_ARRAY_BUFFER, mCubeData.getPosDataBuffer(), GL_STATIC_DRAW);
mProgram.enableAttribLocation(0);
mProgram.vertexAttribPointer(0, 3, GL_FLOAT, false, 3 * 4, 0);
VAO.unbind();
}
private void prepareTexture() {
mTexture = Texture.loadImageFromFile(IMAGE_PATH, GL_TEXTURE_2D, GL_RGBA);
}
private void _delete() {
mVertexShader.delete();
mFragmentShader.delete();
mProgram.delete();
VAO.delete();
VBO.delete();
//EBO.delete();
}
private void _render() {
mProgram.use();
VAO.bind();
VBO.bindBuffer(GL_ARRAY_BUFFER);
mModelMatrix.translate(new Vector3f(0.0f, 0.0f, 0.0f));
mProgram.setUniformMatrix4f(mProgram.getAttributeLocation("modelMatrix"), mModelMatrix);
mProgram.setUniformMatrix4f(mProgram.getAttributeLocation("viewMatrix"), mViewMatrix);
mProgram.setUniformMatrix4f(mProgram.getAttributeLocation("projectionMatrix"), projectMatrix);
glDrawArrays(GL_TRIANGLES, 0, 3);
VAO.unbind();
}
public void init() {
compileShaders();
prepareData();
prepareTexture();
}
public void render() {
_render();
}
public void cleanUp() {
_delete();
}
}
代码中使用的一些对象,如ProgramShader,Shader,VertexArrayObject等,只是简单的打包类,表示在opengl中使用相应对象的一般方法。 着色器很简单,因此只有顶点着色器:
gl_Position = projectionMatrix * viewMatrix * vec4(position, 1.0);
当我这样做时,我发现了一些不寻常的东西。 在第二种方式中,原始相机位置是vector3f(0.0f,0.0f,-10.0f),顶点位置' z值为-2.0f。
在复杂方法(首先解释)中,向上矢量是vector3f(0.0f,1.0f,0.0f),相机目标pos是vector3f(0.0f,0.0f,-10.0f),相机pos是vector3f(0.0F)。
复杂的方法没有显示,我真的不知道为什么。