2013-10-16 82 views
0

这是作业,但我一直在为我们而努力,我只是不明白我做错了什么。这个想法是从三个给定的向量创建一个摄像头,中心(摄像头位置)向上(世界向上,这个是(0,1,0))和lookAt(它是世界坐标中的点) 。计算一个3d相机矩阵

当我在x和z轴上移动摄像机时,Everythinig工作正常,但是当我在y轴上移动它时(上/下)..它只是不看(0,0,0) 。

我有下面的代码,Vector3f和Matrix4f从javax.vecmath。*

private void updateCameraMatrix() { 
    Vector3f z = new Vector3f(); 
    z.sub(center, lookAt); 
    z.normalize(); 

    Vector3f x = new Vector3f(); 
    x.cross(z, up); 
    x.normalize(); 

    Vector3f y = new Vector3f(); 
    y.cross(x, z); 
    y.normalize(); 



    cameraMatrix.set(new float[] { 
     x.x, y.x, z.x, 0.0f, 
     x.y, y.y, z.y, 0.0f, 
     x.z, y.z, z.z, 0.0f, 
     0.0f, 0.0f, 0.0f, 1.0f 
    }); 

    cameraMatrix.mul(new Matrix4f(new float[] { 
     1.0f, 0.0f, 0.0f, -center.x, 
     0.0f, 1.0f, 0.0f, -center.y, 
     0.0f, 0.0f, 1.0f, -center.z, 
     0.0f, 0.0f, 0.0f, 1.0f 
    })); 
} 

感谢您的帮助提前!

回答

2

我不明白你为什么计算x, y, z,你这样做。虽然计算4x4矩阵,并应用一个摄像头看在它,那么我会做这样的:

public final Matrix4 lookAt(Vector3 eye, Vector3 center) 
{ 
    float dx = eye.x - center.x; 
    float dy = eye.y - center.y; 
    float dz = eye.z - center.z; 

    float pitch = (float) Math.atan2(dy, Math.sqrt(dx * dx + dz * dz)); 
    float yaw = (float) Math.atan2(dz, dx); 

    pitch = -pitch; 
    yaw = yaw - 1.57079633f; 

    Matrix4 camera_matrix = new Matrix4(); 

    matrix.identity(); 

    matrix.rotate(pitch, -1f, 0f, 0f); 
    matrix.rotate(yaw, 0f, 1f, 0f); 

    matrix.translate(-eyex, -eyey, -eyez); 

    return matrix; 
} 

这里默认功能“使用”的up这是(0, 1, 0)

正如你可以看到我写Vector3Matrix4而不是Vector3fMatrix4f那是因为我不使用javax.vecmath.*类。我已经制定了用于计算以下内容的自定义类,尽管它基本相同,并且vecmath可能/应该包含我使用的相同方法。虽然如果它不写作评论,我也可以提供。

+0

非常感谢,这工作像一个魅力。我试图从演讲幻灯片中实现公式...... ;-)。 –

+1

不客气! ;) – Vallentin

+0

任何想法matrix.rotate(...)调用的javax.vecmath相当于什么?此外,我假设上面的变量“camera_matrix”实际上应该是“矩阵”。 –