检查用户是否点击了一个3D对象

这个例子讲述了通过创建一个从摄像机近景裁剪面指向远景裁剪面的射线怎样检测鼠标是否放在一个3D物体上。

示例截图

本示例仅适用于Windows 平台开发。 Xbox 360不支持Mouse和MouseState对象。

检查用户是否点击了一个3D对象

检查鼠标是否位于一个3D对象之上

  1. 使用GetState获取鼠标当前状态。

    MouseState mouseState = Mouse.GetState();
  2. 从X和Y中获取鼠标的屏幕坐标。

    int mouseX = mouseState.X;int mouseY = mouseState.Y;
  3. 使用Viewport.Unproject得出在近景裁剪面和远景裁剪面上的点在世界空间中的位置。对于近景裁剪面的点,传递一个Vector3向量,此向量的x和y设置为鼠标位置,而z设置为0。

  4. 对于远景裁剪面的点,传递一个Vector3向量,此向量的x和y设置为鼠标位置,而z设置为1。

  5. 对于这两个点,使用Unproject传递给当前投影矩阵,观察矩阵和点(0,0,0)的平移矩阵。

    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 = graphics.GraphicsDevice.Viewport.Unproject(nearsource, proj, view, world);
    
    VectVector3 farPoint = graphics.GraphicsDevice.Viewport.Unproject(farsource, proj, view, world);
  6. 创建一个从nearPoint指向farPoint的Ray。

    // Create a ray from the near clip plane to the far clip plane.
    Vector3 direction = farPoint - nearPoint;rection.Normalize();
    Ray Ray pickRay = new Ray(nearPoint, direction);
  7. 使用Intersects循环检测场景中的所有对象是否和Ray相交。

  8. 如果Ray与一个对象相交,检查这个对象是否是相交最近的。如果是,储存这个对象和相交的距离,并替换前面储存的对象。

  9. 对你完成对象的循环,存储的最后一个对象将会是用户点击区域内最近的那个对象。


发布时间:2009/3/23 下午1:54:04  阅读次数:7134

2006 - 2024,推荐分辨率 1024*768 以上,推荐浏览器 Chrome、Edge 等现代浏览器,截止 2021 年 12 月 5 日的访问次数:1872 万 9823 站长邮箱

沪 ICP 备 18037240 号-1

沪公网安备 31011002002865 号