2013-06-28 166 views
2

我正在研究移植到Android上的3D遊戲,並且我想在3D遊戲中使用觸摸事件。我需要3D空間中的點,就在剪裁平面附近,但我可以從Android顯示器獲得2D座標。那麼,有沒有辦法將這些(x,y)座標映射到3D空間中的(x,y,z)座標?如何將2D顯示座標映射到3D OpenGL空間

編輯

好吧,我工作的一個賽車遊戲,我想插入一個過程中的一些項目,不同的地方我點擊。我有這樣的功能:

void racing_mouse_cb(int button, int state, int x, int y) { //parameters (x,y) are coords of a display 
    set_ill_fish(get_player_data(local_player())->view); 
} 

但現在我每隔一段距離插入物品在玩家面前:

void set_ill_fish(view_t view) { 
    item_locs[num_items].ray.pt.x = view.plyr_pos.x; 
    item_locs[num_items].ray.pt.z = view.plyr_pos.z - 5; 
    item_locs[num_items].ray.pt.y = find_y_coord(view.plyr_pos.x, 
      view.plyr_pos.z - 5) + 0.2; 
    item_locs[num_items].ray.vec = make_vector(0, 1, 0); 
    . 
    . 
    . 
} 

,但如何把這種顯示面,我無言以對。

+1

你嘗試過什麼?發佈代碼,然後我們可以看看我們可以幫助你。 – hetepeperfan

+0

向x-y-touch上的Z-pane發送一縷光線,看看你點擊了哪個物體。 –

+1

要將一個點從2D屏幕轉換爲3D世界,您可以使用'gluUnproject',參見[http://nehe.gamedev.net/article/using_gluunproject/16013/](http://nehe.gamedev.net/article/using_gluunproject/16013 /) – jcxz

回答

0

要重新映射2D顯示座標(display_x, display_y)到3D物體座標(x,y,z)你需要知道

  1. 像素的深度display_z(display_x, display_y)
  2. 改造T是轉換裁剪空間座標(clip_x, clip_y, clip_z)顯示座標
  3. 轉換M將對象座標轉換爲剪輯空間座標(通常包含相機和透視圖)

的顯示座標被計算如下

M.transform(x, y, z, 1) --> (clip_x, clip_y, clip_z, clip_w) 

T.transform(clip_x/clip_w, clip_y/clip_w, clip_z/clip_w) --> (display_x, display_y, display_z) 

M.transform是可逆矩陣乘法和T.transform是任何可逆變換。

可以從(display_x, display_y, display_z)恢復(x,y,z)如下

T.inverse_transform(display_x, display_y, display_z) --> (a, b, c) 

M.inverse_transform(a, b, c, 1) --> (X, Y, Z, W) 

(X/W, Y/W, Z/W) --> (x, y, z) 

下面給出直覺上爲什麼上述計算導致正確的解決方案

T.inverse_transform(display_x, display_y, display_z) --> (clip_x/clip_w, clip_y/clip_w, clip_z/clip_w) 

(clip_x/clip_w, clip_y/clip_w, clip_z/clip_w, clip_w/clip_w) == (clip_x, clip_y, clip_z, clip_w)/clip_w 

M.inverse_transform((clip_x, clip_y, clip_z, clip_w)/clip_w) == M.inverse_transform(clip_x, clip_y, clip_z, clip_w)/clip_w 

M.inverse_transform(clip_x, clip_y, clip_z, clip_w)/clip_w --> (x, y, z, 1)/clip_w 

(x, y, z, 1)/clip_w == (x/clip_w, y/clip_w, z/clip_w, 1/clip_w) 

(x/clip_w, y/clip_w, z/clip_w, 1/clip_w) == (X, Y, Z, W) 

上面使用下述矩陣(M)載體(v)標量(a == 1/clip_w)屬性:

M * (a * v) == a * (M * v)