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