2014-09-12 52 views
0

正如標題所示,我有一個項目在由單個矢量定義的對象空間中具有特定位置。如何從物體空間位置獲得近平面上的攝像機空間位置

我想檢索這個向量在近剪裁平面上投影的相機空間座標。

換句話說,我需要在這個向量和由z座標定義的平面之間的相機空間中的交點等於-1(我的近平面)。

我需要它爲perspective projection

編輯用鼠標線性移動對象:現在我從物體空間再往窗口空間,然後從那裏到攝像機空間通過設置窗口深度窗口.z等於0,那就是近平面。

請注意,以獲得從unProject相機的空間,我只是通過在作爲模型視圖矩陣單位矩陣new Mat4(1f)

public Vec3 getCameraSpacePositionOnNearPlane(Vec2i mousePoint) { 

     int[] viewport = new int[]{0, 0, glViewer.getGlWindow().getWidth(), glViewer.getGlWindow().getHeight()}; 

     Vec3 window = new Vec3(); 

     window.x = mousePoint.x; 
     window.y = viewport[3] - mousePoint.y - 1; 
     window.z = 0; 

     return Jglm.unProject(window, new Mat4(1f), glViewer.getVehicleCameraToClipMatrix(), new Vec4(viewport)); 
    } 

有沒有更好的辦法(更有效)得到它沒有延續到窗口空間並回到相機之一?

回答

0

我能想到的最直接的方法就是簡單地改變你的物體空間位置(在以下稱爲矢量x),將其轉換爲眼睛空間,構建一條從原點到該眼睛空間座標的光線並計算該射線與近平面的交點z_eye=-near

另一種方法是完全轉換到剪輯空間。由於近平面爲z_clip = - w_clip,因此您可以將結果的座標z設置爲-w,並使用逆投影矩陣將其投影回眼部空間。

在這兩種情況下,如果點位於相機後面或相機平面z_eye = 0處,結果將毫無意義。

+0

您好,我想請您詳細說明第二種方法嗎?我乘了我的模型空間位置 - >世界空間 - >相機空間 - >剪輯空間。然後clip.z = -clip.w然後我乘以逆向proj,但它看起來不對.. – elect 2014-09-15 06:56:01

+0

那麼,你應該得到的眼睛空間位置回來。但是在同類座標系中,所以你可能必須用得到的'w'來分解結果'xyz',以得到你期望的3D笛卡爾座標。 – derhass 2014-09-15 15:36:46

相關問題