Directx 在地形上检测鼠标位置

Directx 在地形上检测鼠标位置,directx,terrain,isometric,raycasting,Directx,Terrain,Isometric,Raycasting,我有一个非常简单的地形图,例如256x256分块,它分为多个分块(相同的正方形…)。每一块瓷砖都有高度,坡度。。。 如下图所示。我的默认外观将是iso视图。(每一块瓷砖可以分成更小的瓷砖,以便平滑,我称之为镶嵌) 现在我需要用鼠标在屏幕上选择一个单元瓷砖(移动到哪里或构建什么东西…)!我有鼠标位置Mx,我需要知道它是什么瓷砖!如果地图是平的,那就很容易了!但对于身高来说,这很难。我计划使地图相当静止(不经常旋转)。。。只有翻译。所以我可以在屏幕上存储所有的顶点坐标(x,y)。通过使用D3DXVE

我有一个非常简单的地形图,例如256x256分块,它分为多个分块(相同的正方形…)。每一块瓷砖都有高度,坡度。。。 如下图所示。我的默认外观将是iso视图。(每一块瓷砖可以分成更小的瓷砖,以便平滑,我称之为镶嵌)

现在我需要用鼠标在屏幕上选择一个单元瓷砖(移动到哪里或构建什么东西…)!我有鼠标位置Mx,我需要知道它是什么瓷砖!如果地图是平的,那就很容易了!但对于身高来说,这很难。我计划使地图相当静止(不经常旋转)。。。只有翻译。所以我可以在屏幕上存储所有的顶点坐标(x,y)。通过使用D3DXVEC3项目。然后搜索包含鼠标位置的三角形->我们需要的瓷砖!然而,使用这种方法,我们可能需要搜索5-10或20个三角形。你知道更好的方式吗,更优化或者更优雅?谢谢

我读到了一些关于光线投射检测的东西,也许它可以用在我的案例中。因为我的视图设置中没有眼位置,所以视图向量是恒定的!

D3DXVec3Unproject看起来也很有前途


图:

测试20个三角形时可能出现重复的问题是什么?只要不是20k三角形,这种方法就可以了。通常有两种解决问题的方法:将世界投影到屏幕上(如您所述)或将鼠标投影到世界中(如Vec3Unproject)。这两种方法都不涉及交叉测试。如果你的地形相当静止,第一种方法可能更适合。将屏幕细分为平铺,并创建一个字典,将平铺映射到相交三角形。然后只测试那些三角形。是的,我用第一个解几乎解决了这个问题。但它仅用于鼠标位置检测(每帧仅使用1个)。或选择屏幕上显示的单位。
D3DXMatrixOrthoLH(&matProj, videoWidth , videoHeight , -100000, 100000);
float xPitch=0;
float yPitch=PI/3.0; //rotate yPitch 60 degree
float zPitch=PI/4.0; //rotate zPitch 45 degree