2016-06-09 74 views
1

我正在試驗LWJGL2我希望能夠判斷相機是否能夠看到3D空間中的某個點。我試圖自己去看看我能不能做到,並且最終得到了一些有用的東西,只能在Y軸上旋轉。在三維空間中計算點的可見性

此代碼有效,但不在兩個軸上。我不確定這是否是正確的方法。

public boolean isInFrame(float x, float y, float z){ //The z isn't used 

    float camera = rotation.y; //The cameras y rotation 
    double object = Math.atan2(y, x)*(180/Math.PI); 

    object += (180 - camera); 
    if (object <0) object += 360; 
    if (object >360) object -= 360; 

    return 270>object&&90<object; //set to 180˚ for test 


} 

對於代碼,我假設攝像頭是以0,0,0爲中心。

我只是想知道我該如何改變它,以便它適用於x和y旋轉的相機。例如,它可以告訴我一個點是否可見,而不管攝像機旋轉。

注意: 我不擔心任何阻礙觀點的觀點。

感謝您的幫助提前。

回答

1

如果您有相機的視圖和投影矩陣(我們稱之爲V,P),您可以將轉換應用到您的點並檢查結果是否位於相機的剪輯音量範圍內。

說你的觀點是(x, y, z)。構建物的載體p = (x, y, z, 1)並應用相機的變換,:

q = P * V * p 

視圖變換V應用於相對於相機的世界的改造,根據攝像機的位置和方向。然後,投影P變形相機的視錐(即,攝像機的可視空間)爲一個單元立方體,像這樣:

enter image description here
(圖像源:Song Ho Ahn

爲了讀出所得點的座標值,首先要解除均質化,通過其w分量除以:

r = q/q.w 

現在,部件r.xr.yr.z告訴你點是否位於攝像頭的可視範圍內:

  • 如果r.x < -1,該點位於超出屏幕的左邊框。
  • 如果r.x > 1,該點位於屏幕的右邊界之外。
  • 如果r.y < -1,該點位於屏幕底部邊界之外。
  • 如果r.y > 1,該點位於屏幕的上邊界之外。
  • 如果是r.z < -1,則該點位於相機的近平面之外,即,該點位於相機後方或太靠近以使相機看不到。
  • 如果r.z > 1,該點位於相機的遠平面之外,即該點距相機太遠以至於看不到。
  • 否則,該點位於相機的可見範圍內。
+0

哇,這簡化了我所做的一切,非常感謝! –

+0

我明白你在這裏說什麼,但我不確定我知道如何從LWJGL2中獲取視圖和投影矩陣。在LWJGL2中,你所做的就是像這樣定義它: 'glMatrixMode(GL_PROJECTION); gluPerspective((float)100,640f/480f,0.01f,100);' 如何從中獲得原始矩陣? –

+0

我對LWJGL並不熟悉。在普通的OpenGL中,矩陣堆棧的狀態可以通過例如'glGetFloatv(GL_MODELVIEW_MATRIX,...)'和'glGetFloatv(GL_PROJECTION_MATRIX,...)',它們返回16個浮點數組。 – jsb

相關問題