MonoGameでマウス位置を3D平面に投影する

提供: MonoBook
2019年12月9日 (月) 04:49時点におけるAdministrator (トーク | 投稿記録)による版
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

3D空間で物体を掴んだりするのに必要になる処理。 MonoGameでの例だが、WebGLだろうと何だろうと同じだ。

レイを生成できれば、あとはレイキャスティングで「当たり判定」をするだけだ。

    // マウスの座標
    var mouseState = Mouse.GetState();
    
    var nearScreenPoint = new Vector3(mouseState.X, mouseState.Y, 0);
    var farScreenPoint  = new Vector3(mouseState.X, mouseState.Y, 1);

    var viewport = GraphicsDevice.Viewport;
    var nearWorldPoint = viewport.Unproject(nearScreenPoint, camera.Projection, camera.View, Matrix.Identity);
    var farWorldPoint  = viewport.Unproject(farScreenPoint , camera.Projection, camera.View, Matrix.Identity);

    var direction = Vector3.Normalize( farWorldPoint - nearWorldPoint );

    new Ray(nearWorldPoint, direction);

このレイは画面に描画しようとしても、ディスプレイのXY平面と垂直なZ方向(画面奥)に向かって飛ぶので「点」にしかならない。画面に「線」が表示されるようならバグってる。

この計算後、かつ描画前にカメラを少しでも動かす処理が入ると表示がバグるよ。

関連項目[編集 | ソースを編集]