как сделать?
| |
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) или движок? Т.к. обычно есть вспомогательные функции для таких вещей и часто проще ими воспользоваться, чем непонятные математические вычисления городить
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) Эм, курсор вроде как в двухмерной системе координат двигается, позиция по третьей оси у него всегда равна нулю... Так в этом то и вся суть - нужно найти третью
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| |
sk0rpi0n | Дата: Четверг, 23 Августа 2012, 16:09 | Сообщение # 5 |
Tiberium
Сейчас нет на сайте
| Quote Так в этом то и вся суть - нужно найти третью wink Как она, интересно, вообще может существовать?
Adventures of the Purple Ball - готов. Wanderer - готов.
|
|
| |
Archido | Дата: Четверг, 23 Августа 2012, 16:35 | Сообщение # 6 |
Сэнсэй
Сейчас нет на сайте
| Quote (sk0rpi0n) Как она, интересно, вообще может существовать? А в чем проблема то? Есть координаты мыши в 2д (оконные) и есть матрицы (View и Projection), с помощью которых осуществляется растеризация 3д пространства в экранное 2д (для того, чтобы 3д мир нарисовать на плоском мониторе ). Так вот, никто не запрещает проводить и обратный процесс: если взять обратные от этих матриц и правильно помножить на 2д координаты курсора, приняв Z = -1 и 1, то получим две точки в 3д, одна из которых будет лежать на ближней плоскости отсечения, другая на дальней. Как результат - мы получим отрезок в 3д. А для того, чтобы найти настоящую Z координату куда указывает курсор мыши - нужно найти пересечение этого отрезка с геометрией уровня, и из всех найденных пересечений взять самое ближнее
Если есть в доступном наличии 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) Позиция мыши в трёхмерном пространстве... Позиция мыши - рядом с клавиатурой на коврике, ты не знал?
Сообщение отредактировал 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), тогда что?..
|
|
| |
Archido | Дата: Пятница, 24 Августа 2012, 17:24 | Сообщение # 13 |
Сэнсэй
Сейчас нет на сайте
| Quote (TimKruz) А если я напишу свою графическую библиотеку, в которой всё рассчитывается по-другому (совсем не так, как в DirectX или OpenGL), тогда что?.. Пиши , если напишешь и кто-то будет это использовать, тогда и будет о чем говорить.
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 |
почетный гость
Сейчас нет на сайте
| Я видел, но подумал что без лучей легче будет
Баблосы здесь... Зарегестрируйся и начни получать деньги... Платят мало, но стабильно, а самое главное платят! а не обещают...
|
|
| |
Archido | Дата: Суббота, 25 Августа 2012, 15:39 | Сообщение # 19 |
Сэнсэй
Сейчас нет на сайте
| Quote (ad141) Только функция почемуто позицию по высоте выдаёт одну и туже 1.0... В описании ф-ции iPickPoint есть такая штука: "Coordinates are source-model-center relative." . Т.е координаты возвращаются относительно координат центра модели, т.к. "толщина" плоскости у тебя 1 - оно его и возвращает. Надо к полученной точке еще координаты модели (плоскости) прибавлять.
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| | |
|