![]() |
Модераторы: Rickert |
![]() ![]() ![]() |
|
Vitaly333 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 6.11.2006 Где: Volgograd Репутация: нет Всего: 2 |
Нужно создать интерактивный редактор 3D моделей, состоящих из узлов и стержней , соединяющих эти узлы. Добавление, удаление, выделение элеметов модели (узлов и стержней) должно производится с помошью мыши(и дополнительно с помошью диалогов). Повороты вокруг всех осей,маштабирование, проекции на все плоскости, перспектива и др. также должно производится с помощью мышки. Всё необходимо реализовать на OpenGL.
Приступив к реализации я стокнулся сразу же столкнулся со след. проблемами: 1.) Как находить точки пересечения узла и стержней в него входящих (они нужны для того чтобы не отрисовывать ту часть стержня, которая находится внутри узла)? Если узел представляеть в пространстве как куб (8 точек и 6 плоскостей) то нужно находить точку пересечения куба с прямой в пространстве. А это сложная задача (нужно решать систему неравенств), к тому же каждый раз проводить такие математические расчеты становится очень накладным для большого количества узлов. Если узел представлять как квадрат с 4-мя 3-мерными точками то находить точки пересечения уже легче, но при рендеринге он будет выглядеть как квадрат только в проекции на одну плоскость (в проекциях на другие плоскости он будет выглядеть как линия). Нужно чтобы в любой проеции он выглядел как квадрат и в изометрии тоже. Может быть существует какое - нибудь спец. решение в OpenGL. 2.) 2-ая проблема состоит в том как с помощью мыши добавлять узлы при произвольном расположении осей XYZ. Ведь от мыши можно получить только две координаты. Как при этом правильно вычислять третью? 3.) 3-ая проблема связана с индетификацией узлов и стержней. Как с помощью всё той же мыши можно выделить какой-либо узел или стержень также при произвольном расположении осей XYZ. У меня идея примерно следующая: построить проекции всех 3D - объектов на какую - нибудь плоскость (например на плоскость ХОY). Итак, зная координаты х,y каждого объекта и координаты х,y мыши можно узнать попали ли мы на ХОY - проекцию трехмерного объекта или нет. Благо это сделать легко. При этом может возникнуть ситуация что курсор мыши попадет сразу же на проекции двух или более объектов. В этом случае нужно просмотреть 3-ю координату у этих объектов и выбрать тот у которого эта 3-я координата находится ближе к наблюдателю. Как то так... Возможно что это всё полный бред. Подскажите пож-та как это всё правильно реализовать или хотя бы примеры такого редактора с использованием мыши. Это сообщение отредактировал(а) Vitaly333 - 22.4.2009, 15:05 |
|||
|
||||
Rickert |
|
|||
![]() Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 6 Всего: 52 |
0) Не понял вообще. Что такое стержень? Линия или некий цилиндр с определённым объёмом?
1, 2) Вроде вопрос один и тот же: как выделить объект в пространстве. Смотрите раздел OpenGL/DirectX, подфорума C++ - этот вопрос уже поднимался ни раз. И объясните что значит "произвольное расположение осей XYZ"? Их произвольная направленность? Тогда хочется узнать: косоугольная или прямоугольная система координат используется. Или это речь о положнии точки начала координат? -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
Vitaly333 |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 6.11.2006 Где: Volgograd Репутация: нет Всего: 2 |
Стержень может быть представлен как линией так и цилиндром.
Под произвольным расположением осей я понимаю произвольное положение начала координат отн. наблюдателя (чел., смотрящего в монитор и щёлкующего на мышь). Изначально оси расположены в центре окна в которое выводится вся сцена, ось z - направлена к наблюдателю. Но после после преобразований положение начала координат уже будет изменено. Как тогда узнать каким координатам в МСК соответсвует каждая из двух координат, полученных от щелчка мыши и чему равна третья? |
||||
|
|||||
Rickert |
|
|||
![]() Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 6 Всего: 52 |
Vitaly333
Правильно ли я вас понял: вы работаете с двухмерным пространством? Все вычисления как производятся? И ещё вопрос: как вы сейчас определяете "место" курсора? Это сообщение отредактировал(а) Rickert - 25.4.2009, 04:46 -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
Vitaly333 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 6.11.2006 Где: Volgograd Репутация: нет Всего: 2 |
Нет.Работаю я с 3D. По крайней мере собираюсь это делать. Вычислений пока никаких нет. Это лишь мои предположения. Место курсора я определяю по его двум координатам x и y. |
|||
|
||||
Чупакабро |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 27.2.2007 Репутация: 2 Всего: 4 |
Чтобы не отрисовывать часть стержня внутри узла, есть z-буфер. И да, сделать пересечение прямой и плоскости, это не самая сложная задача)) Но это и не нужно. 1) можно сделать 3 вида как в нормальном редакторе 2) можно сделать одну из координат фиксированной. тогда будет какая-то плоскость, в которой все узлы будут появляться. При повороте осей координат относительно исходного положения нужно находить проекции экранных координат на эту плоскость. В OpenGL есть буфер выбора. Лень его описывать, может кто-нибудь еще здесь это сделает. Можно сделать дополнительный буфер, куда рисовать объекты без учета освещения. Тогда выбор объекта сводится к определению цвета пикселя под мышью --------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue. |
|||
|
||||
unicuum |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 830 Регистрация: 16.3.2005 Где: Рашка Репутация: нет Всего: 8 |
-------------------- ![]() обычный день на винграде |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Программирование игр, графики и искуственного интеллекта" | |
|
НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |