2013-10-16 83 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」實際上應該是「矩陣」。 –