Управление мышью

Программирование на Юнити.

Управление мышью

Сообщение EvgeniyT 17 дек 2010, 17:50

Подскажите, как сделать так, чтобы при нажатии мышью на какой-то объект, я смог узнать, что это за объект. Т.е. вот допустим есть у меня карта, я гляжу на неё сверху. Жму мышью на какое-нибудь дерево, и мне нужно определить, что именно на этом дереве я и нажал. В другой раз жму на Terrain, и, скажем, определить, что я нажал на нём самом, а не на каком-то другом объекте, и при этом получить координату относительно этого террайна, где я нажал.

Я могу найти позицию мыши в 2-мерной плоскости окна, но как мне это спроецировать в 3d и понять, где именно я нажал?
EvgeniyT
UNIт
 
Сообщения: 142
Зарегистрирован: 14 дек 2010, 19:06
  • ICQ

Re: Управление мышью

Сообщение Zaicheg 17 дек 2010, 18:38

Camera.ScreenToWorldPoint и смежные
RaycastHit
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: Управление мышью

Сообщение EvgeniyT 17 дек 2010, 19:27

Zaicheg писал(а):Camera.ScreenToWorldPoint и смежные
RaycastHit


Читал про этот метод, но был бы очень рад, если бы Вы по-подрробнее о нём рассказали.

Как я понял, чтобы определить, на каком именно объекте я нажимаю мышью, можно использовать метод OnMouseDown(), наследуемый от класса MonoBehaviour. В этом методе и обрабатывать событие нажатия мышью.
Отсаётся тогда вопрос о том, как узнать, в какой именно части террайна я кликнул. Особенно если камера под каким-то углом, градусов в 46,12345...получается, что расстоние по z от камеры до террайна вверху экрана будет другое, нежели это же расстояние внизу экрана.
Надеюсь я понятно выразился...
EvgeniyT
UNIт
 
Сообщения: 142
Зарегистрирован: 14 дек 2010, 19:06
  • ICQ

Re: Управление мышью

Сообщение Zaicheg 17 дек 2010, 19:34

Метод Camera.ScreenToWorldPoint с параметром Input.mousePosition (возможно, надо инвертировать Y-координату) даст вам RaycastHit, содержащий точку попадания в террейн.
OnMouseDown не нужен.
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: Управление мышью

Сообщение Akai 18 дек 2010, 13:30

EvgeniyT писал(а):Я могу найти позицию мыши в 2-мерной плоскости окна, но как мне это спроецировать в 3d и понять, где именно я нажал?

Используй метод камеры ScreenPointToRay, который отдаст тебе луч, который уже нужно будет использовать для обратной трассировки в Physics.Raycast. Это даст тебе коллайдер (а следовательно, и сам объект), на который направлен луч из камеры, проходящий через заданные экранные координаты, а также точку столкновения луча и объекта, нормаль и ещё много другой полезной информации. Соответственно, на каждом проверяемом объекте должен быть установлен коллайдер, в противном случае удовлетворительного результата ты не получишь.

В ScreenPointToRay нельзя отдавать обычные координаты мыши, так как они находятся не в экранном пространстве. Чтобы перевести их в экранное, нужно пересчитать ординату относительно окна (другие координаты не нужно), вот хоть бы и так:
новаяОрдинатаКрысы = Mathf.Abs(Input.mousePosition.y - Камера.pixelHeight)

Zaicheg писал(а):Метод Camera.ScreenToWorldPoint с параметром Input.mousePosition (возможно, надо инвертировать Y-координату) даст вам RaycastHit, содержащий точку попадания в террейн.


Ну, не даст. ScreenToWorldPoint возвращает точку, из неё и позиции камеры нужно будет построить луч и затем трассировать. По сравнению с использованием ScreenPointToRay дополнительный шаг получается. Кроме того, метод ScreenToWorldPoint работает по-особенному — аппликату точки, которую он получает на входе, необходимо задавать самостоятельно. А она неизвестна. Таким образом использовать этот метод для указанных целей имеет смысл только тогда, когда аппликата не имеет значения (двумерная графика), или она известна заранее. Но в любом случае для камеры с перспективной проекцией z-координата точки, передаваемой в метод, должна быть отличной от нуля (для ортографической камеры это не обязательно), иначе результат, возвращаемый методом, будет некорректным и его нельзя будет использовать.
Akai
UNец
 
Сообщения: 29
Зарегистрирован: 11 сен 2010, 08:26
Откуда: Вельск

Re: Управление мышью

Сообщение Zaicheg 18 дек 2010, 14:29

ScreenPointToRay

Да, речь о ToRay. Я выделял имя метода не вчитываясь, ключевое слово "смежные" :)
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15