Обнаружение положения мыши на местности

У меня очень простая карта местности, например, 256х256 тайлов, она разбита на тайлы (одинаковые квадраты...). каждая плитка имеет высоту, наклон... Что-то вроде рисунка ниже. Мой внешний вид по умолчанию будет видом iso. (Каждая плитка может быть разделена на более мелкие плитки для сглаживания, я назвал тесселяцию)

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

Теперь мне нужно выбрать плитку юнита на экране с помощью мыши (куда переместить или построить что-то...)! У меня есть положение мыши Mx, мне нужно знать, что это за плитка! Если карта плоская, это очень просто! а вот с высотой сложно. Я планирую сделать карту довольно статичной (не вращать часто)... только перевод. Таким образом, я могу хранить все координаты вершины (x, y) на экране. Используя D3DXVec3Project. А затем ищем треугольники, содержащие позицию мыши -> нужный нам тайл! Однако при таком подходе нам может понадобиться обыскать 5-10 или 20 треугольников. Знаете ли вы какой-нибудь лучший способ, более оптимизированный или элегантный? Спасибо!

Я читал про что-то вроде RayCasting для детекта, может быть его можно использовать в моем случае. Поскольку в моей настройке просмотра нет позиции глаза, вектор обзора постоянен! 3D Screenspace Raycasting/Выбор DirectX9

D3DXVec3Unproject тоже выглядит многообещающе!

Изображение: http://i1335.photobucket.com/albums/w666/greenpig83/sc4_zpsaaa61249.png


person greenpig83    schedule 29.11.2013    source источник
comment
возможный дубликат 3D Screenspace Raycasting/Picking DirectX9   -  person Roger Rowland    schedule 29.11.2013
comment
В чем проблема проверить 20 треугольников? Пока это не 20 тысяч треугольников, этот подход должен быть в порядке. В общем, есть два пути решения проблемы: проецировать мир на экран (как вы упомянули) или проецировать мышь в мир (как с Vec3Unproject). Оба подхода не относятся к тесту пересечения. И если ваш ландшафт довольно статичен, первый подход, вероятно, лучше подходит. Разделите экран на плитки и создайте словарь, который сопоставляет плитки с пересекающимися треугольниками. Затем проверьте только эти треугольники.   -  person Nico Schertler    schedule 01.12.2013
comment
Да, я почти решил проблему, используя первое решение. Но это только для определения положения мыши (используйте только 1 на кадр). Или выберите единицы, которые появляются на экране.   -  person greenpig83    schedule 09.12.2013