2

Android に移植された 3D ゲームに取り組んでおり、ゲームの 3D コースでタッチ イベントを操作したいと考えています。クリッピング プレーンに近い 3D 空間のポイントが必要ですが、取得できるのは Android ディスプレイからの 2D 座標だけです。では、これらの (x, y) 座標を 3D 空間の (x, y, z) 座標にマップする方法はありますか?

編集

さて、私はレーシング ゲームに取り組んでおり、クリックした場所に応じてコースにいくつかのアイテムを挿入したいと考えています。私はこの機能を持っています:

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);
    .
    .
    .
}

、しかし、これを表示面に変換する方法は、私にはわかりません。

4

1 に答える 1

1

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あり、任意の可逆変換です。

(x,y,z)以下の方法で回復でき(display_x, display_y, display_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)
于 2013-08-26T01:41:46.897 に答える