Конвертирование 2D координат курсора в 3D
кто подскажет как спроецировать экранные координаты курсора в 3D мир?
если пользоваться функциями unproject и intersection то выдаётся информация о треугольнике в который попал курсор и Byracentric координаты.
как их перевести в мировые?
Или если мне например нужно узнать X и Y мировые при определённом известном мировом Z?
Заранее спасибо за ответ.
свой вектор X,Y,Z умножить на мировую матрицу.
который из векторов? который NEAR?, и после unproject?
Если нужно координаты относительно камеры, то вектор (x, y, 0) надо помножить на view-матрицу - получим новое (3D) направление соответствующих осей
попробовал, не соответствуют координаты реальности, может примеры есть какие?
gamedev.ru - поищи там
А у ты чем пользуешься? Если DirectX то есть в стандартом SDK пример соответствующий - а вообще много раз спрашивали и отвечали на данную тему на
[QUOTE=PstM]попробовал, не соответствуют координаты реальности, может примеры есть какие?[/QUOTE]Заполнение view-матрицы - всего лишь реализация look-at контроллера, как его принято обозначать в трёхмерной графике, то есть положение камеры - это смещение координат, а направление цели и up-вектор задают вращение по осям x, y и z, если считать, что ось z направлена из камеры (вглубь экрана). Такая матрица ничем не отличается от обычной матрицы преобразований (просто здесь не нужно заморачиваться с порядком следования осей при вращении). Пример: возьмём произвольную точку (или, скажем, смещение) на экране, к примеру v0 = (5, 10, 0). Далее, пусть камера находится в начале координат (0, 0, 0), а её цель (camera target) - в точке (0, 0, 1), то есть направление осей в пространстве ничем не отличается от принятого по умолчанию (up-вектор принимаем за (0, 1, 0), то есть камера стоит вертикально), а, значит, экранные координаты должны совпадать с мировыми. Формируем view-матрицу и умножаем на неё вектор v0 - получаем те же (5, 10, 0). Поворачиваем камеру на 90 градусов вокруг z, то есть up-вектор будет теперь u = (-1, 0, 0) - получим v = (10, -5, 0) - всё правильно? Вернём камеру в "вертикальное" положение и крутанём её на этот раз вокруг оси y: зададим положение цели (-2, 0, 0), расстояние до цели на преобразование координат не влияет. Умножаем, получаем v = (0, 10, -5). Это то, что тебе было нужно? Для полноты картины вернём "всё как было" и сместим камеру в точку (0, 0, 0.5). В результате преобразования получим v = (5, 10, -0.5) - точка оказалась за камерой, и её новая z-координата стала отрицательной - смещение координат идёт в обратную сторону. Для камеры это правильно и на самом деле должно иметь место. Но, если планируется перемещать локальную плоскую систему координат вместе с камерой, а не против её движения, то придётся прибавлять к преобразованному вектору v вектор 2*с, где вектор с есть положение камеры.