Среда, 24 Апреля 2024, 16:46

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » Общие обсуждения программистов » как сделать? (Позиция мыши в трёхмерном пространстве...)
как сделать?
ad141Дата: Четверг, 23 Августа 2012, 15:50 | Сообщение # 1
почетный гость
Сейчас нет на сайте
Такой вопрос, по какой формуле можно высчитать позицию мыши в трёхмерном пространстве?

Дано:
float Fov - Угол обхоракамеры
float MouseX, MouseY - Позиция мыши на экране от 0.0 до 1.0f
Vector3 CamP - Позиция камеры .x, .y, .z
Quanternion CamR - Направление камеры .x, .y, .z, .w
int Level - Уровень (позиция по Y) для расчёта положения мыши...



Баблосы здесь... Зарегестрируйся и начни получать деньги... Платят мало, но стабильно, а самое главное платят! а не обещают...
ArchidoДата: Четверг, 23 Августа 2012, 16:00 | Сообщение # 2
Сэнсэй
Сейчас нет на сайте
Где будет применяться? Какой API (OGL, DX) или движок? Т.к. обычно есть вспомогательные функции для таких вещей и часто проще ими воспользоваться, чем непонятные математические вычисления городить smile

C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
sk0rpi0nДата: Четверг, 23 Августа 2012, 16:00 | Сообщение # 3
Tiberium
Сейчас нет на сайте
Эм, курсор вроде как в двухмерной системе координат двигается, позиция по третьей оси у него всегда равна нулю...



Adventures of the Purple Ball - готов.
Wanderer - готов.


Сообщение отредактировал sk0rpi0n - Четверг, 23 Августа 2012, 16:00
ArchidoДата: Четверг, 23 Августа 2012, 16:03 | Сообщение # 4
Сэнсэй
Сейчас нет на сайте
Quote (sk0rpi0n)
Эм, курсор вроде как в двухмерной системе координат двигается, позиция по третьей оси у него всегда равна нулю...

Так в этом то и вся суть - нужно найти третью wink


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
sk0rpi0nДата: Четверг, 23 Августа 2012, 16:09 | Сообщение # 5
Tiberium
Сейчас нет на сайте
Quote
Так в этом то и вся суть - нужно найти третью wink

Как она, интересно, вообще может существовать? wacko




Adventures of the Purple Ball - готов.
Wanderer - готов.
ArchidoДата: Четверг, 23 Августа 2012, 16:35 | Сообщение # 6
Сэнсэй
Сейчас нет на сайте
Quote (sk0rpi0n)
Как она, интересно, вообще может существовать?

А в чем проблема то? Есть координаты мыши в 2д (оконные) и есть матрицы (View и Projection), с помощью которых осуществляется растеризация 3д пространства в экранное 2д (для того, чтобы 3д мир нарисовать на плоском мониторе biggrin ).
Так вот, никто не запрещает проводить и обратный процесс: если взять обратные от этих матриц и правильно помножить на 2д координаты курсора, приняв Z = -1 и 1, то получим две точки в 3д, одна из которых будет лежать на ближней плоскости отсечения, другая на дальней. Как результат - мы получим отрезок в 3д.
А для того, чтобы найти настоящую Z координату куда указывает курсор мыши - нужно найти пересечение этого отрезка с геометрией уровня, и из всех найденных пересечений взять самое ближнее smile

Если есть в доступном наличии Z-Buffer, то все немного проще.


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)

Сообщение отредактировал Archido - Четверг, 23 Августа 2012, 16:37
ad141Дата: Четверг, 23 Августа 2012, 19:10 | Сообщение # 7
почетный гость
Сейчас нет на сайте
Движёк 3impact...
Вот функции движка: http://www.3impact.com/3Impact_Engine/hulk7123/reference.htm



Баблосы здесь... Зарегестрируйся и начни получать деньги... Платят мало, но стабильно, а самое главное платят! а не обещают...
TimKruzДата: Четверг, 23 Августа 2012, 19:17 | Сообщение # 8
старожил
Сейчас нет на сайте
Quote (ad141)
по какой формуле

Эта формула будет зависеть от способа вывода графики на экран, всяких там матриц проекции и прочего, и прочего.
Если работаешь с OpenGL, то в библиотеке GLU есть функции gluProject и gluUnProject, они позволяют соотнести точку на экране с точкой в пространстве, выводимом на экран, и наоборот. Вводишь три матрицы (view, project и model) и координаты (объекта или курсора), получаешь в ответ координаты (курсора или объекта соответственно). В официальной документации всё подробно описано.

Quote (ad141)
Позиция мыши в трёхмерном пространстве...

Позиция мыши - рядом с клавиатурой на коврике, ты не знал? biggrin




Сообщение отредактировал TimKruz - Четверг, 23 Августа 2012, 19:17
ArchidoДата: Четверг, 23 Августа 2012, 20:20 | Сообщение # 9
Сэнсэй
Сейчас нет на сайте
Quote (TimKruz)
Эта формула будет зависеть от способа вывода графики на экран, всяких там матриц проекции и прочего, и прочего.

Не будет она ни от чего зависить, работает все это везде одинаково, только API разные. Другое дело, что у каждого такого API есть вспомогательные ф-ции для подобных вещей, что многое упрощает. Но если релизовывать все это ручками, то смысл будет один и "формула", ессно, тоже одна.

Quote (ad141)
Движёк 3impact...

Вот это, насколько я понимаю, то что тебе нужно.


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
Stalker_ShooterДата: Пятница, 24 Августа 2012, 09:44 | Сообщение # 10
3D XNA'шник
Сейчас нет на сайте
Quote (sk0rpi0n)
Как она, интересно, вообще может существовать?


Есть такое понятие, как луч. Archido описал подробней. Мы просто проводим луч от позиции мыши "в глубь" экрана и смотрим, пересекается ли с ним игровой объект...


*Не убегай от снайпера, умрешь уставшим.
*Мои статьи...
mobipakДата: Пятница, 24 Августа 2012, 12:30 | Сообщение # 11
Подрывник
Сейчас нет на сайте
А как человек будет управлять мышью в трёх пространствах и что это даст?
TimKruzДата: Пятница, 24 Августа 2012, 16:45 | Сообщение # 12
старожил
Сейчас нет на сайте
Quote (crayan)
А как человек будет управлять мышью в трёх пространствах

Посмотри в некоторых играх, обычно мышь перемещается в двух плоскостях, например, вместо X/Y будет X/Z. Да и при чём тут управлять? Он спрашивал про определение позиции курсора в 3D.
Quote (crayan)
и что это даст?

В некоторых играх это выглядит довольно интересно. Но, опять же, тут же не 3D-курсор имелся в виду...
Quote (Archido)
Не будет она ни от чего зависить, работает все это везде одинаково, только API разные.

А если я напишу свою графическую библиотеку, в которой всё рассчитывается по-другому (совсем не так, как в DirectX или OpenGL), тогда что?.. wacko


ArchidoДата: Пятница, 24 Августа 2012, 17:24 | Сообщение # 13
Сэнсэй
Сейчас нет на сайте
Quote (TimKruz)
А если я напишу свою графическую библиотеку, в которой всё рассчитывается по-другому (совсем не так, как в DirectX или OpenGL), тогда что?..

Пиши biggrin , если напишешь и кто-то будет это использовать, тогда и будет о чем говорить.


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
ad141Дата: Суббота, 25 Августа 2012, 14:56 | Сообщение # 14
почетный гость
Сейчас нет на сайте
Теперь как найти точку пересечения, этого луча с плоскостью на y=-100 ???
Получившейся пример...
Мышь, стрелки...



Баблосы здесь... Зарегестрируйся и начни получать деньги... Платят мало, но стабильно, а самое главное платят! а не обещают...


Сообщение отредактировал ad141 - Суббота, 25 Августа 2012, 15:00
ArchidoДата: Суббота, 25 Августа 2012, 15:12 | Сообщение # 15
Сэнсэй
Сейчас нет на сайте
А сия плоскость как представлена?

У движка есть вот такая ф-ция iPlaneLineIntersection


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
ad141Дата: Суббота, 25 Августа 2012, 15:24 | Сообщение # 16
почетный гость
Сейчас нет на сайте
А всё не надо... Я нашёл функцию, которая выдаёт точку пересечения мыши с указыным 3D объектом...

Добавлено (25.08.2012, 15:22)
---------------------------------------------

Code
D3DXVECTOR3 Mouse3DPos;
if(iMeshPicked (Camera, MeshPlaneY))
{
      iPickPoint (&Mouse3DPos);
}

Добавлено (25.08.2012, 15:24)
---------------------------------------------
Только функция почемуто позицию по высоте выдаёт одну и туже 1.0...
Хотя MeshPlaneY я двигаю ниже...
Придётся брать вместо позиции по Y мыши в 3D пространстве, брать позицию MeshPlaneY по Y, так как она вся ровно плоская...



Баблосы здесь... Зарегестрируйся и начни получать деньги... Платят мало, но стабильно, а самое главное платят! а не обещают...
ArchidoДата: Суббота, 25 Августа 2012, 15:29 | Сообщение # 17
Сэнсэй
Сейчас нет на сайте
Еще есть кста iMeshRayCheck, в параметрах они принимает то, что возвращает iScreenRay. А потом, насколько я понимаю, можно позвать iPickPoint и узнать точку пересечения.

C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
ad141Дата: Суббота, 25 Августа 2012, 15:31 | Сообщение # 18
почетный гость
Сейчас нет на сайте
Я видел, но подумал что без лучей легче будет happy


Баблосы здесь... Зарегестрируйся и начни получать деньги... Платят мало, но стабильно, а самое главное платят! а не обещают...
ArchidoДата: Суббота, 25 Августа 2012, 15:39 | Сообщение # 19
Сэнсэй
Сейчас нет на сайте
Quote (ad141)
Только функция почемуто позицию по высоте выдаёт одну и туже 1.0...

В описании ф-ции iPickPoint есть такая штука: "Coordinates are source-model-center relative." . Т.е координаты возвращаются относительно координат центра модели, т.к. "толщина" плоскости у тебя 1 - оно его и возвращает. Надо к полученной точке еще координаты модели (плоскости) прибавлять.


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
ad141Дата: Суббота, 25 Августа 2012, 15:52 | Сообщение # 20
почетный гость
Сейчас нет на сайте
Аааа, ну тогда понятно... Спасибо...


Баблосы здесь... Зарегестрируйся и начни получать деньги... Платят мало, но стабильно, а самое главное платят! а не обещают...
Форум игроделов » Программирование » Общие обсуждения программистов » как сделать? (Позиция мыши в трёхмерном пространстве...)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг