「MonoGameでマウス位置を3D平面に投影する」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
(ページの作成:「3D空間で物体を掴んだりするのに必要になる処理。 MonoGameでの例だが、WebGLだろうと何だろうと同じだ。 * マウス座標を…」)
 
 
2行目: 2行目:
 
[[MonoGame]]での例だが、[[WebGL]]だろうと何だろうと同じだ。
 
[[MonoGame]]での例だが、[[WebGL]]だろうと何だろうと同じだ。
  
* マウス座標をビュー座標に変換した場所から
+
* マウス座標を[[ビュー座標]]に変換した場所から
* 画面の奥に向かって飛ぶベクトル(レイ)を求める。
+
* 画面の奥に向かって飛ぶ[[ベクトル]](レイ)を求める。
 +
 
 +
[[レイ]]を生成できれば、あとは[[レイキャスティング]]で「当たり判定」をするだけだ。
  
 
<source lang="csharp">
 
<source lang="csharp">

2019年12月9日 (月) 04:49時点における最新版

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方向(画面奥)に向かって飛ぶので「点」にしかならない。画面に「線」が表示されるようならバグってる。

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

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