2010-02-05 5 views
1

Я создаю простой интерфейс перетаскивания 3D в процессе обработки и хочу определить, когда мышь перекатывается над объектом. Я бы предположил, что мне нужно сделать некоторые переводы матриц в координаты трехмерной модели, чтобы получить их в пространстве экрана и т. Д.Перевод мыши X и Y в координаты 3D-модели

У меня простая версия этой работы, проблема в том, что при перемещении камеры на сцене координаты, которые я получаю, сходят с ума.

Так как мне перевести координаты плитки в пространство экрана (так как screenX & screenY не работает должным образом)?

UPDATE: В конце концов я нашел два примера с сайта Processing о том, как это сделать. Благодаря villintehaspam.

http://processing.org/hacks/hacks:picking

+0

Чтобы увидеть 2-мерную проекцию своего 3-D объекта, вам необходимо перевести его из трехмерных координат в конкретную двумерную проекцию (координаты экрана). Проблема в том, что этот перевод включает в себя потерю, поэтому вы не можете просто изменить процесс и получить трехмерную точку. Вам нужно проецировать луч назад, найти все объекты, которые пересекает луч, и отсортировать их по Z-порядку. –

ответ

3

Эта проблема называется собирание. Найдите выбор мыши, и вы получите много и много хитов.

Основы теории заключается в следующем:

  1. Get х, у Coords от мыши.
  2. Преобразуйте их в координаты x, y, z в координатах глаз (т.е. -1 < = x < = 1, -1 < = y < = 1, z = расстояние ближнего/дальнего клипа, если у вас нормальная проекция) ,
  3. Преобразуйте эти координаты в обратную матрицу проекции, чтобы получить координаты мира.
  4. Теперь у вас есть луч из положения камеры, с направлением к координатам мира, которые вы только что получили.
  5. Проведите тест пересечения лучей с объектами, которые вы хотите рассмотреть. Выберите объект, который пересекает луч, ближайший к лучу (положение камеры).
+0

Большое спасибо за это. Оказывается, для этого уже есть код (не удивительно), я просто не мог его найти. Правильный поисковый запрос помог. –