![]() |
Модераторы: Rickert |
![]() ![]() ![]() |
|
EgoBrain |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 23.3.2008 Где: Комната Репутация: 1 Всего: 2 |
Что лучше использовать в приложении при монипуляциях в сцене (например простой 3-D редактор) события формы или DirectInput? Спрашиваю потому что DirectInput незнаю, изучать времени нет. Может быть там есть какие-то координальные возможности из-за которых нет смысла строить программу на событиях формы? Ну задачи пока стандартные: перемещения объектов в пространстве мышью, возможно какой-то ввод с клавиатуры, например, то же самое перемещение и т.п.
|
|||
|
||||
ValLer |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 30.11.2008 Где: Ростов-на-Дону Репутация: нет Всего: нет |
Если простой редактор, то события формы подойдут. Ну а если тебя волнует производительность кода и точность манипуляций то DI. Кстати использовать DirectInput для получения данных от мыши и клавиатуры совсем не сложно.
|
|||
|
||||
EgoBrain |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 23.3.2008 Где: Комната Репутация: 1 Всего: 2 |
Помоему события формы типа MouseDown MouseMove и т.п. не очень подходят, так как в программе существует возможность вращения сцены, то есть изменение ракурса обзора (это я уже реализовал, хоть и криво, кстати по этому поводу тоже нада задать вопрос), значит взависимости от текущего ракурса соответствие плоскости формы плоскостям пространства разные. Короче проще говоря, на данный момент для меня, офигительно сложный алгоритм придется делать, для вычисления соответствий X Y-координаты мыши X Y Z-координатам пространства (например для реализации возможности выделения и перемещения объекта). Дайте пример
![]() Это сообщение отредактировал(а) EgoBrain - 2.12.2008, 13:08 |
|||
|
||||
ValLer |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 30.11.2008 Где: Ростов-на-Дону Репутация: нет Всего: нет |
DI позволяет получать не конкретные координаты курсора на экране, а перемещение самой мыши, т.е. если курсор упрётся в границу экрана, ты всё равно будешь получать перемещение мыши. Может это тебе поможет... Вот мой класс на С++ для получения данных от мыши и клавиатуры под DI.
g_hInst - нэндл экземпляра приложения g_hWnd - нэндл окна (формы) Чтобы пользоваться достаточно создать экземпляр класса, инициализировать DI, клаву и/или мышь, в цикле читать состояние и получать данные, что и делает следующий код:
|
||||
|
|||||
ValLer |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 30.11.2008 Где: Ростов-на-Дону Репутация: нет Всего: нет |
На счёт перемещения мышью в 3D, вопрос меня заинтересовал... В 2D это сделать несложно (простая тригонометрия)... А вот в 3D... Предположим, реализовать перемещение подобное 3DMax'у. Т.е. существуют 3 оси, и можно перемещать объект отдельно по каждой оси, причём сцена может быть повёрнута как угодно. Решение этой задачи можно свести к двухмерному, если представить эти оси, например, как единичные векторы, затем найти их проекции на плоскость (экран). Получим что все три вектора x y z лежат в одной плоскости. Допустим хотим переместить объект по оси OZ. После проецирования этот вектор стал иметь координаты (x1,y1). Перемещаем мышь, к примеру, на (dx,dy) которые получаем через DI или извращаясь с помощью событий.
Теперь можно переместить сам объект: z += x1*dx + y1*dy Задача по-моему решаема, но не так проста как хотелось бы. Ещё подумаю... |
|||
|
||||
EgoBrain |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 23.3.2008 Где: Комната Репутация: 1 Всего: 2 |
Спасибо за инфу. Хотелось бы продолжения
![]() |
|||
|
||||
ValLer |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 30.11.2008 Где: Ростов-на-Дону Репутация: нет Всего: нет |
На C# ещё проще, используя управляемый DirectX. Добавляешь в проект ссылки:
Microsoft.DirectX Microsoft.DirectX.DirectInput Затем using Microsoft.DirectX; using Microsoft.DirectX.DirectInput; Класс немного изменился (особенности управляемого DX). По большому счёту можно было бы и без класса обойтись, в управляемом DX и так всё компактно и удобно ![]()
Чтобы пользовать:
Вот рабочий проект на MS 2008: Присоединённый файл ( Кол-во скачиваний: 3 ) ![]() |
||||
|
|||||
EgoBrain |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 23.3.2008 Где: Комната Репутация: 1 Всего: 2 |
Спасибо. С таким пользовательским классом будет проще
![]() |
|||
|
||||
ValLer |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 30.11.2008 Где: Ростов-на-Дону Репутация: нет Всего: нет |
Ты понял правильно, событие timer_Tick вызывается постояно с интервалом ~30мс, что при наилучшем раскладе равносильно 1000/30 = 33fps. И каждый раз при возникновении события ты получаешь инфу от устройства. На сколько я знаю ты работаешь с 3d графикой в MDX и используешь события, например, OnVertexBufferCreate, OnLostDevice. Так вот сдесь тоже самое, просто вместо timer_Tick, ты возможно используешь Form_Paint, или ещё что.
|
|||
|
||||
EgoBrain |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 23.3.2008 Где: Комната Репутация: 1 Всего: 2 |
Я вначале идею использования таймера воспринял ни как пример а в буквальном смысле, имхо так даже будет проще. А еще лучше наверное юзать DXTimer, у него разрешение выше. Я к тому, что привязываться к ФПС не стоит, так как на разных компах мышка по разному будет работать
![]()
У меня есть два примера, на которых можно посмотреть решение данной задачи (3-D Max и еще одна неизвестная прога Pro100). В максе пользователь визуально выбирает вектор или плоскость в которой будет движение, но такое решение тоже далеко не из простых: необходимо рисовать векторы и плоскости для выбора на объекте и расчитывать что из них выбрал пользователь (думаю все видели 3-D Max ![]() ![]() |
|||
|
||||
ValLer |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 30.11.2008 Где: Ростов-на-Дону Репутация: нет Всего: нет |
На счёт DXTimer... Он используется в программах, например играх )), где требуется повышенная точность, например для просчётов физики. Конечно его ничто не мешает вам его использовать.
![]()
На самом деле нет. После проецирования векторов на экран получим, что все векторы лежат в одной плоскости (XY, там где мышь обитает))). ![]() Заметьте, когда вы в максе перемещаете объект по какой-либо оси, вы перемещаете курсор по направлению этой оси, будь-то x,y или z. Теперь можно определять расстояние курсора до каждого вектора (это "длинна перпендикуляра" из точки Cursor.x, Cursor.y на вектор), и проверять какая ось была выбранна. Затем по уже придуманному мной алгоритму перемещать объект. Я недавно писал прогу, которая определяет расстояние от точки до отрезка. Правдо на Delphi... может пригодиться. Добавлено через 7 минут и 34 секунды С прогой Pro100 не работал, но предпологаю что в максе манипулировать удобнее)) ![]() Присоединённый файл ( Кол-во скачиваний: 3 ) ![]() |
|||
|
||||
EgoBrain |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 23.3.2008 Где: Комната Репутация: 1 Всего: 2 |
Ну в Max-е на самом деле проще, все сводится к банальному "больше следующая x-координата мыши предыдущей или нет?", то бишь влево двигаем объект уходит по оси в минус, вправо - в плюс. А пример на GDI+ как расчитывает расстояние, по теоремам линейной алгебры, или какие-то свои алгоритмы (я просто не люблю в чужых кодах капаться)? ![]() ![]() Добавлено через 10 минут и 52 секунды В общем пока что-то как-то расплывчато представляется преимущество DI перед событиями формы... Я так просмотрел ваш проект DI.sln, класс очень удобный а вот программа имеет минус - координаты кнопки меняются не пропорционально координатам мыши, то есть местами последняя обгоняет кнопку. |
|||
|
||||
ValLer |
|
||||||
![]() Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 30.11.2008 Где: Ростов-на-Дону Репутация: нет Всего: нет |
Точно! Что-то я перемудрил...)))) А для того чтобы по плоскости перемещать, то ещё по Y включается!!! Всё гениальное просто)))))) Сделаю себе такую возможность.
Да просто я сейчас в универе аналитическую геометрию изучаю, поэтому это первое что пришло в голову. На счёт чужого кода - сам ненавижу разбираться)))))), интересно, а кто любит?
Возможно, я как-то не правильно его (DI) использую, а может в microsoft решили, что и не требуется такое соответствие? |
||||||
|
|||||||
EgoBrain |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 23.3.2008 Где: Комната Репутация: 1 Всего: 2 |
ValLer, у вас есть готовые решения долгообсуждаемой проблему перемещения объектов (программа, проект)?
|
|||
|
||||
ValLer |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 30.11.2008 Где: Ростов-на-Дону Репутация: нет Всего: нет |
Пока что нет, времени не хватает ((( Когда что-нибудь сделаю, сообщу.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Программирование игр, графики и искуственного интеллекта" | |
|
НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |