0

在 XNA 4.0 3D 中。我想拖放一个模型 3D。所以,我必须在模型中检查鼠标。我的问题是我不知道将这个模型从 3D 更改为 2D 的位置和评分。它与相机的矩阵视图和矩阵投影有关吗?这是我的代码: http ://www.mediafire.com/?3835txmw3amj7pe

4

1 回答 1

1

查看 msdn 上的这篇文章:使用鼠标选择对象

从那篇文章:

MouseState mouseState = Mouse.GetState();
int mouseX = mouseState.X;
int mouseY = mouseState.Y;

Vector3 nearsource = new Vector3((float)mouseX, (float)mouseY, 0f);
Vector3 farsource = new Vector3((float)mouseX, (float)mouseY, 1f);

Matrix world = Matrix.CreateTranslation(0, 0, 0);

Vector3 nearPoint = GraphicsDevice.Viewport.Unproject(nearsource,
    proj, view, world);

Vector3 farPoint = GraphicsDevice.Viewport.Unproject(farsource,
    proj, view, world);

// Create a ray from the near clip plane to the far clip plane.
Vector3 direction = farPoint - nearPoint;
direction.Normalize();
Ray pickRay = new Ray(nearPoint, direction);

proj并相应地使用您view自己的投影和视图矩阵。

现在,当你有你的 时Ray,你需要有一个BoundingBox或一个BoundingSphere(或多个)大致包含你的模型。

一个简单的解决BoundingSphere方案ModelMesh是使用Model.Meshes.

foreach(ModelMesh mesh in model.Meshes)
{
    if(Ray.Intersects(mesh.BoundingSphere))
    {
        //the mouse is over the model!
        break;
    }
}

由于BoundingSphere每个ModelMesh都将包含该网格中的所有顶点,因此如果网格不是大致圆形(即如果它很长) ,它可能不是网格的最精确表示。这意味着上面的代码可能会说鼠标与对象相交,而在视觉上它是远离的。

另一种方法是手动创建包围体BoundingBox您可以根据需要创建对象或对象的实例BoundingSphere,并根据运行时要求手动更改它们的尺寸和位置。这需要更多的工作,但并不难

于 2012-11-09T10:40:06.907 回答