72 / 48 / 19
Регистрация: 18.05.2021
Сообщений: 205
1

Использование мыши для прицела в 3д игре на GODOT

17.05.2022, 19:53. Показов 1040. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как можно получить 3д координаты мыши? Или как ещё можно использовать мышь, для прицеливания в GODOT в 3д играх?
Я делаю игру, в которой требуется возможность, перемещая мышь по экрану, не перемещая камеру и всего игрока, понять, куда эта мышь направленна. Но ничего не получается. Как вообще подобную задачу обычно решают?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.05.2022, 19:53
Ответы с готовыми решениями:

Плавает курсор мыши. Задержка мыши при игре в шутеры (игры)
Мучаюсь с проблемой две недели. Совершенно запутался и кажется начинаю терять нервные клетки....

Правда ли, что Unreal - для профессионалов, Unity - для масс, а Godot - для самых отсталых?
Кто знает?

Использование sleep в игре змейка, для постепенной отрисовки
Доброго времени суток. Начал учить Java и, после решения N простеньких задачек, решил попробовать...

Использование mouse_event для имитации клика мыши
Привет всем, друзья подскажите, для имитации клика мыши использую setcursorpos(Xc,Yc); ...

Использование колесика мыши для открытия папок в новом окне?
Добрый день! Давно во всех браузерах функционирует возможность быстро открыть указанную ссылку в...

7
3249 / 1470 / 468
Регистрация: 01.06.2021
Сообщений: 4,959
20.12.2023, 18:18 2
Цитата Сообщение от -_human_- Посмотреть сообщение
Как можно получить 3д координаты мыши?
Какая еще 3d координата мыши? У курсора есть только 2d координата (Vector2) - положение на экране.
Цитата Сообщение от -_human_- Посмотреть сообщение
Или как ещё можно использовать мышь, для прицеливания в GODOT в 3д играх?
Курсор мыши вообще не годится для прицеливания в играх! Можете сразу о нем забыть, даже если вам кажутся привлекательными, что для CollisionObject3D и для других классов есть всякие сигналы типа mouse_entered. Это очень большое заблуждение. Курсор это самый отстойный прицел. Проблема в том, что при смене разрешения экрана, при переходе на полноэкранный режим и т.п. даже если центрировать курсор, то его координаты не будут совпадать с истинным центром экрана. Соответственно, проецировать с координаты курсора не получится.

Сперва вы прописываете
Код
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
курсор исчезает и он блокируется по центру экрана, но его координаты не годятся для прицела.

Как же тогда делают прицел, вы спросите?
Очень просто. С центра камеры (которая расположена в голове персонажа) испускается луч (RayCast). Т.е. родителем луча является Камера. RayCast можно создать без кода. Далее для параметра cast_to прописываете Vector3, которые отвечает за дальность выстрела. А потом во время выстрела луч просто проверяет попал ли он на тот или иной объект по маске.

Как по мне, RayCast самый удобный для прицела. Имею в виду, функции этого класса. Но описанный выше способ для реализации прицела не единственный. Можно использовать и другие трюки.
0
72 / 48 / 19
Регистрация: 18.05.2021
Сообщений: 205
20.12.2023, 18:38  [ТС] 3
Royal_X, мне требуется, помимо фиксирования центра экрана для наведения, как вы написали, дополнительно наводится мышью на другие объекты вне центра экрана.
Нет, конечно можно просто создать ещё один луч и управлять им с помощью мыши, но суть проблемы это не меняет. Я понимаю как получить точку пересечения плоскости и луча, или как направить луч в определенную точку на плоскости, но откуда мне взять плоскость, на которую проецируется картинка с камеры?
0
3249 / 1470 / 468
Регистрация: 01.06.2021
Сообщений: 4,959
20.12.2023, 19:02 4
-_human_-, не нужно придумывать свои велосипеды, изучайте документацию. RayCast содержит очень много полезных функций. Он позволяет найти точку соприкосновения, нормаль, определить объект, с которым коснулся луч и т.п. На форуме за вас никто не будет писать игру. Читайте матчасть. Я всего лишь, увидев ваш вопрос, решил предупредить, что курсор мыши для прицела не годится. Я создавал 3d игру - шутер, использовал RayCast. Причем, в точку столкновения (а не в центр объекта) я ещё передавал импульс. Выглядело очень реалистично и очень похоже на настоящий выстрел.
0
72 / 48 / 19
Регистрация: 18.05.2021
Сообщений: 205
20.12.2023, 20:54  [ТС] 5
Royal_X, прошу прощения, но пожалуйста, читайте вопрос прежде чем писать ответ. Я и так навожусь центром экрана с помощью лучей. Мне нужно с помощью мыши, именно мышью, дополнительно выбирать объекты на экране вне центра экрана.
Я не прошу писать игру за меня, я задаю вопрос по реализации в конкретном движке - godot, поскольку, предоставляя как это сделать в теории, не нашел как реализовать в конкретном движке.
Как в этом игровом движке получить плоскость, на которую движок проецирует картинку или как получить луч, являющийся продолжением курсора мыши из центра камеры, если картинка проецируется не на плоскость?
Ещё раз, я спрашиваю как это реализовать в GODOT, поскольку не нашел инфы об этом в документации. Был бы благодарен ссылке на страницу в документации, где об этом было бы написано.
0
3249 / 1470 / 468
Регистрация: 01.06.2021
Сообщений: 4,959
20.12.2023, 21:34 6
-_human_-, я даже не представляю, как выглядит ваша игра. Как можно что-то выбирать мышью на экране, если мышь обычно в 3d играх вращает камеру? Т.е. игра в режиме заблокированного курсора в центре экрана. Обычно, если что-то и подбирают в 3d играх, то делают это с помощью центральной точки экрана, с того же прицела (например, как в Half-Life 2). Т.е. персонаж поворачивает голову (камеру) так, чтобы объект попал в центр экрана и если объект находится на определенном расстоянии, то предмет подбирается.
0
72 / 48 / 19
Регистрация: 18.05.2021
Сообщений: 205
20.12.2023, 21:47  [ТС] 7
Royal_X, управление полностью с клавиатуры, игрок управляет космичемким истребителем, и мышь там в принципе не нужна. Мышью игрок должен выделять интересующие его объекты, чтобы получить по ним информацию.
В этом и проблема - игрок видит астероид, наводит на него мышь, но как мне получить луч от камеры до мыши на экране, чтобы узнать, на что указывает игрок? В идеале, мышь - просто точка на прямоугольнике, на который проецируется картинка, и тогда задача простая. Но графика не всегда проецируется на прямоугольник, плюс я не знаю где лежит описание плоскости, на которую проецируется. По идее должен быть какой-то более-менее встроенный метод, но я не смог его найти, то что находилось, работало некорректно.
П.с. вообще, на данный момент проект заморожен из-за нехватки времени на его разработку, поэтому вопрос не очень актуален, но было бы интересно узнать, как же все-таки это делается.

Добавлено через 3 минуты
Я даже делал костыль, сделав самонаведение ракет (одно из назначений мыши - выделять цель для атаки) на ближайшую к центру экрана цель, а не по указателю мыши, но из-за этого сильно страдала скорость наведения - корабль разворачивается не мгновенно, а ракетам должно быть по барабану из какой позиции запускаться, поэтому это не дело
0
3249 / 1470 / 468
Регистрация: 01.06.2021
Сообщений: 4,959
20.12.2023, 21:57 8
-_human_-, вот, нашел такой код в инете. Придется разбирать и реализовать что-то похожее. Я когда-то делал создание луча по позиции курсора от камеры, но я свой код не нашел. Но он был похож на этот код, который нашел в интернете. Сейчас пишу с телефона, даже проверить не могу. Но скажу одно: Godot располагает всеми встроенными функциями для данной задачи. Это точная инфа, т.к. я такое реализовал. Т.е. не нужно вам ничего придумывать и решать сложные задачи из линейной алгебры и аналитической геометрии... Просто читайте документацию.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func aiming()-> bool:   
var mousePos = get_viewport().get_mouse_position()
var from = Vector3(self.position.x , 8 ,self.position.z)
var to = from + camera_3d.project_ray_normal(mousePos) * RAY_LENGTH
var space = get_world_3d().direct_space_state
var rayQuery = PhysicsRayQueryParameters3D.new()
rayQuery.from = from
rayQuery.to = to
var result = space.intersect_ray(rayQuery)
if result.size()>1:
    print(result.position)
    aim.position = result.position
    return true
else:
    return false
Добавлено через 2 минуты
-_human_-, а вообще, для мыши вроде бы есть сигнал при наведении на collision объект. Уже давно не работал на Godot, не помню...
0
20.12.2023, 21:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.12.2023, 21:57
Помогаю со студенческими работами здесь

Обработка мыши в игре
Для тренировки хочу создать игру - Unblock Me. Суть игры в том, что необходимо сдвигать блоки,...

Движение курсора мыши в игре
Всем доброго времени суток. Подскажите как реализовать движение курсора мыши в игре (допустим...

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

Как сделать эмуляцию мыши в игре?
как сделать эмуляцию мыши в игре, написал код по нажатию на f1 курсор смещается на определенное...

Управление курсором мыши в игре Арканоид
Учусь писать простенькие игры и столкнулся с проблемой,не могу понять,как реализовать управление в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru