「MonoGameでマウス位置を3D平面に投影する」の版間の差分
Administrator (トーク | 投稿記録) |
Administrator (トーク | 投稿記録) 編集の要約なし |
||
| 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方向(画面奥)に向かって飛ぶので「点」にしかならない。画面に「線」が表示されるようならバグってる。
この計算後、かつ描画前にカメラを少しでも動かす処理が入ると表示がバグるよ。