![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблемы при освоении OpenGL. Подскажите решение. [Delphi, Windows]
MegaVolt © (2007-06-04 10:48:00)Занялся освоением OpenGL. Встретился с некоторыми трудностями красивых решений которых я не вижу. Подскажите как их обычно решают?
1. Разбиение невыпуклого полигона на треугольники. Можно ли это сделать автоматически? Полигон задан координатами вершин, лежит целиком в одной плоскости. Для примера можно взять букву "Ш".
Как разбить ручками я понимаю но очень хотелось бы разбивать автоматически. К алгоритму особых скоросных требований нет. Полгоны несложные поряка 10-16 вершин.
2. Вращение объекта мышкой. Есть объект например куб изначально ориентированный по осям. На экране он так и выглядит. Двигаем по экрану мышь и преобразовываем это движение в поворот по двум осям. Теперь куб повёрнут на некоторые углы и соответственно так отрисован. Теперь нужно преобразовать следующее движение мыши в углы поворота. Вот тут и возникает сложность.
так как в идеале дожно быть так:
glRotate(Углы для 2-го поворота)
glRotate(Углы для 1-го поворота)
рисуем куб.
Т.е. в матричном виде:
Rn*...*(R2*(R1*x))
Соответственно чтобы правильно осуществлять поворот нужно у себя в программе вычислять
Rn*...(R3*(R2*R1))
Есть ли другой способ осуществить задуманное? Можно ли вычитать матрицу из OpenGL? Загружать можно, домножать на мою можно а обратно извлеч можно?
Yashin (2007-06-12 22:03:00) [1]Да я и сам не смотрел как это делается, пример нашел у себя в архиве, вроде он с delphi3d.net
MegaVolt (2007-06-11 16:53:00) [2]Yashinспасибо. Это как раз такое вращение как мне нужно. Буду разбиратся. Но судя по всему ты делаешь то что хотел сделать я только умножение делаешь сам а не запрягаешь под это дело карточку.
Гугль я действительно не спросил :( Я пошукал в нашей локалке на 2 милиона файлов и не нашел ничего похожего поэтому и решил что библиотека какая то специальная.
Yashin (2007-06-11 16:36:00) [3]Странно у меня не просит, и вообще на диске с Виндой такого файла нет
http://ifolder.ru/2311897
@!!ex_ (2007-06-11 16:34:00) [4]> glut32.dll
Гугль наше все. Это стандартная библиотека.
MegaVolt (2007-06-11 15:22:00) [5]Rial
>Запоминать эти повороты. :)
Т.е. всю последовательность поворотов где то хранить? Впринципе конечно памяти это сожрёт немного но хотелось бы покрасивее. :)
>Вообще, твой способ тоже будет работать.
Можно ли его реализовать как то альтернативно без вычитывания матрицы?
Yashin
>Вот http://ifolder.ru/2288425
Просит glut32.dll :(
Я такой dll-ки ненахожу :( Выложи её если не сложно.
Sapersky (2007-06-09 18:45:00) [6]GLScene -> MeshUtils.pas
@!!ex_ (2007-06-09 13:12:00) [7]> [27] Yashin © (09.06.07 12:37)
Это уже частные случаи. :)
Если еще юзать VBO, Индексацию и т.д.
Кстати, как можно по модели не индексированной построить индексированную?
Есть простые алгоритмы? Тупое сравнение всех вершин?
Yashin (2007-06-09 12:37:00) [8]Вот
http://ifolder.ru/2288425
>Плоские полигоны" - хм ?..
>А вообще рекомендую карточке "подсовывать" исключетильно треугольники,
>таким образом ты получишь наилучшее быстродействие.
Лучшее быстродействие можно получить, если подсовывать цепь треугольников (Stripes). Ускорение до трех раз.
Rial (2007-06-06 18:11:00) [9]> [24] MegaVolt © (06.06.07 15:53)
Я говорил про вектор. В пространстве вектор заданной
длины "закрепляют" 5 параметров. В нашем случае
координаты начала и 2 угла поворота.
Объемное тело "закрепляют" 6 параметров, т.е.
потребудется действительно 3 поворота.
Тем не менее, абсолютно любой поворот можно осуществить
только за счет 2х, заранее не известных осей.
В таком случае 6м параметром выступает как раз
выбор нужных осей. Т.е. по сути, поворот по 3й
оси определен: он равен нулю.
Понаписал я... просто немного не так друг друга поняли.
Посему правы обе стороны. :)
> У тебя например сейчас при изменении размеров формы все
> повороты сбрасываются :( Как этого избежать?
Запоминать эти повороты. :)
Вообще, твой способ тоже будет работать.
Математический подход... почему бы и нет ?
Инициализируй свою марицу, по очереди делай с ней все пробразования,
а перед отрисовкой домножай не нее текущую.
Овчинка стоит выделки, если этих поворотов действительно много,
иначе мало что выиграешь хоть в объеме памяти, хоть в скорости.
MegaVolt (2007-06-06 16:44:00) [10]У тебя например сейчас при изменении размеров формы все повороты сбрасываются :( Как этого избежать?
MegaVolt (2007-06-06 15:53:00) [11]>Речь шла о количестве осей. Не стоит придиратся к словам. ;)
Ну тогда расскажи как мне после наццати поворотов по двум осям определить в какое положение мне нужно повернуть кубик? Только запоминая последовательно все повороты. Можно хратить сами углы и последовательность их выхова а можно хранить одну матрицу повторота которая будет после каждого поворота модифицироватся.
Следовательно и возникает необходимость умножать на эту матрицу попворота хранящуюся где то. Или в стеке OpenGL или у меня в проге.
@!!ex_ (2007-06-06 14:53:00) [12]> Три позиции в вашем примере это 6 вызовов glRotate минимум.
> Вы же утверждали что можно за счёт двух.
>
> Итак в вашем примере добавте стрелочку и поробуйте в FormResize
> подобрать два угла поврота которые дадут указвнный мною
> эффект. Цифры в студию. Жду.
Речь шла о количестве осей. Не стоит придиратся к словам. ;)
> Я вроде не сравнивал DirectX и OpenGL это раз.
> А во вторых речь шла про то где выполняется.
Я тоже. чессслово. :))
Вот о том и речь. Все функции OpenGL выполняются видеокартой.
Glu и Glut выполняются на проце.
Ну это тоже самое, что говорить, что некий модуль написанный с помощью STL не отличается от STL и тоже явкляется частью STL. :)))
MegaVolt (2007-06-06 14:38:00) [13]>Блин. Я ща матом ругатся буду. У вас же мой пример есть!!!! Он это
>позволяет без проблем реализовать.
>Вот скрин. Без изенения кода. Просто повращал мышкой. Три позиции
>сделал. ЗАказывайте, как угодно повращаю.
Три позиции в вашем примере это 6 вызовов glRotate минимум.
Вы же утверждали что можно за счёт двух .
Итак в вашем примере добавте стрелочку и поробуйте в FormResize подобрать два угла поврота которые дадут указвнный мною эффект. Цифры в студию. Жду.
>Зачем тебе хранить матрицу? Формируй ее каждый кадр, просто перемещай, вращай, маштабируй и все. Ниче не надо хранить.
Возможно. Давай вначале разберёмся с поворотами а потом займёмся ватрицами.
>Гы. ЛОЛ. Windows и Linux - одно и тоже.
>Разница чисто условна.
Я вроде не сравнивал DirectX и OpenGL это раз.
А во вторых речь шла про то где выполняется.
Т.е. нечто написанное на WinApi и с помощью некой надстройки в которой спрятаны по несколько вызовов WinApi принципиально неотличаются :)
Хотя вопрос спорный и не принципиальный.
@!!ex_ (2007-06-06 14:29:00) [14]Чорт. Скрин забыл прикрутить, ждал пока зальется на сайт и автоматом кинул пост, когда дописал. :)
Вот скрин.
http://afera-net.narod.ru/rotate.JPG
@!!ex_ (2007-06-06 14:25:00) [15]> Господа моё высшее образование не позволяет верить выводам
> которые опровергаются простейшими примерами.
>
> Итак рисуем кубик его грани паралельны осям.
> Система координат стандартная x,y в плоскости координат
> z уходит в экран
>
> На передней грани нарисована стрелочка вверх.
> Как с помощью двух поворотов вокруг осей X и Y получить
> кубик у которого средлочка на передней грани повёрнута влево
> или вправо.
>
> Я например не смог подобрать такие углы. Обязательно нужен
> третий поворот.
Блин. Я ща матом ругатся буду. У вас же мой пример есть!!!! Он это позволяет без проблем реализовать.
Вот скрин. Без изенения кода. Просто повращал мышкой. Три позиции сделал. ЗАказывайте, как угодно повращаю.
Я обещал не докапываться по поводу вышки...Я обещал не докапываться по поводу вышки...Я обещал не докапываться по поводу вышки...Я обещал не докапываться по поводу вышки...Я обещал не докапываться по поводу вышки...Я обещал не докапываться по поводу вышки...Я обещал не докапываться по поводу вышки...Я обещал не докапываться по поводу вышки...Я обещал не докапываться по поводу вышки...Я обещал не докапываться по поводу вышки...Я обещал не докапываться по поводу вышки...
> glRotate это умножение той матрицы что у нас была на матрицу
> поворота. Вот оно и умножение. Соответственно если я сам
> где то храню матрицу поворота то я её должен умножить с
> помощью glMultMatrix
Не поверишь. За 2 года работы сграфиков и два десятка проектов ни разу не пользовался glMultMatrix.
ЗАЧЕМ???
Зачем тебе хранить матрицу? Формируй ее каждый кадр, просто перемещай, вращай, маштабируй и все. Ниче не надо хранить. ИМХО.
> Я даже спорить не буду :) Но от себя добавлю что и OpenGL
> и GLU реализованы одинаково програмно. Только одна обращается
> к карточке на прямую а вторая через OpenGL. Так что разница
> чисто условна.
Гы. ЛОЛ. Windows и Linux - одно и тоже. Просто одно придумал Вильям Гейтс 3, а другое Линус Торвальдс.
Разница чисто условна.
MegaVolt (2007-06-06 13:39:00) [16]@!!ex_
>Эм.. А как же высшее образование?(последний раз цепляюсь по поводу вышки. Больше не буду. чессслово.)
Rial
>Хранить достаточно 2 угла поворота.
Господа моё высшее образование не позволяет верить выводам которые опровергаются простейшими примерами.
Итак рисуем кубик его грани паралельны осям.
Система координат стандартная x,y в плоскости координат z уходит в экран
На передней грани нарисована стрелочка вверх.
Как с помощью двух поворотов вокруг осей X и Y получить кубик у которого средлочка на передней грани повёрнута влево или вправо.
Я например не смог подобрать такие углы. Обязательно нужен третий поворот.
@!!ex_
>Зачем че-то на че-то умножать я не догоняю.
glRotate это умножение той матрицы что у нас была на матрицу поворота. Вот оно и умножение. Соответственно если я сам где то храню матрицу поворота то я её должен умножить с помощью glMultMatrix
>Я может удивлю... Но glu и glut не имеют никакого отношения к OpenGL. :))
>Это просто библиотект реализующий некий функционал используя OpenGL.
>(Больше не буду придиратся.. Чессслово. :)))
Я даже спорить не буду :) Но от себя добавлю что и OpenGL и GLU реализованы одинаково програмно. Только одна обращается к карточке на прямую а вторая через OpenGL. Так что разница чисто условна.
Про полигон который многоугольник понял :))
Rial (2007-06-05 23:13:00) [17]> [15] MegaVolt © (05.06.07 19:50)
> Подскажи как правильно?
Ну вот такую процедурку я обычно вызываю при изменении
размеров окна:
glViewPort(..);
glMatrixMode(GL_Projection);
glLoadIdentity;
If(bRendererMode)then
gluPickMatrix(...);
...
gluPerspective(...);
glMatrixMode(GL_ModelView);
If (Not bRendererMode)then begin
glLoadIdentity;
glTranslatef(...);
end;
glScissor(...);
Т.е. по сути у тебя постоянно установлена единичная матрица.
А далее при каждой отрисовке:
Var
fRotateZ : GLFloat;
fRotateY : GLFloat;
..
glPushMatrix;
glRotateF(fRotateZ, 0.0, 0.0, 1.0);
glRotateF(fRotateY, 0.0, 1.0, 0.0);
//рисуем здесь :)
glPopMatrix;
Хранить достаточно 2 угла поворота. Их, естественно,
нужно еще вычислять. Но это наиболее разумный подход.
homm (2007-06-05 20:38:00) [18]> Если в терминологии спецов принято называть треугольник
> полигоном то как они называют то что я называю полигоном?
Polygon! Чувствуешь разницу? :))
@!!ex_ (2007-06-05 20:30:00) [19]> Возможно. Пока для меня это неочевидно :( Буду думать.
Эм.. А как же высшее образование?(последний раз цепляюсь по поводу вышки. Больше не буду. чессслово.)
> А как умножить ту матрицу что у меня есть текущая на ту
> которую вернёт Pop?
Хел тебе поможет, это раз.
Зачем че-то на че-то умножать я не догоняю. В своих проектах ниче никогда не умножал(я имею ввиду касательно ОГЛ, так то понятно, часто приходится матрицы множить) и камера прекрасно вертится.
ЛОгика такая:
Каждый кадр выставляешь единичную матрицу, функцию ты знаешь.
Каждый кадр выставляешь ту систему координат, которая нужна.
> Я не правильно выразился. Когда я говорит карточка я имел
> в виду OpenGL. То что карточка не в состоянии бить полигоны
> я подозревал :)
Я может удивлю... Но glu и glut не имеют никакого отношения к OpenGL. :)) Это просто библиотект реализующий некий функционал используя OpenGL.(Больше не буду придиратся.. Чессслово. :)))
> На текущий момент быстродействие меня не волнует. У меня
> во всей сцене не более 100 вершин из которых мой полигон
> занимает 10-16 вершин причём с одноцветной закраской даже
> без освещения остальное линии сетки :) Так что проблем с
> производительностью не предвидится :)
"Это покааа. Это покааа." (С) Мужской сезон: Бархатная революция.
> C какого это перепугу?
> Я говорю про элемент рисуемый
> glBegin(GL_POLYGON);
>
> Т.е. некий объект заданный своими вершинами. Само собой
> если вершины 3 то это треугольник.
>
> Если в терминологии спецов принято называть треугольник
> полигоном то как они называют то что я называю полигоном?
Многоугольник. :))
У моделлеров обычно полигон - квад.
У программеров - треугольник.
MegaVolt (2007-06-05 19:50:00) [20]@!!ex_
>LOL. Зачем ТРИ вращения??? Вроде как бы любой поворот достигается двумя вращениями.
Возможно. Пока для меня это неочевидно :( Буду думать.
>Как то странно упрощаешь... Через попу.
>glLoadIdentity
>glPushMatrix
>glPopMatrix
А как умножить ту матрицу что у меня есть текущая на ту которую вернёт Pop?
Т.е. порядок действий такой:
glLoadIdentity
glRotate
и теперь то что получилось нужно домножить на то что сохранено.
>ВСЕ что делает карточка - получает вершину, преобразует, получает треугольник, преобразует и выводит.
Я не правильно выразился. Когда я говорит карточка я имел в виду OpenGL. То что карточка не в состоянии бить полигоны я подозревал :)
Rial
>Иногда свой велосипед изобретать полезно, но в данным случае
>ты получишь частное решение, неприменимое в общем случае.
Подскажи как правильно?
>А вообще рекомендую карточке "подсовывать" исключетильно треугольники,
>таким образом ты получишь наилучшее быстродействие.
На текущий момент быстродействие меня не волнует. У меня во всей сцене не более 100 вершин из которых мой полигон занимает 10-16 вершин причём с одноцветной закраской даже без освещения остальное линии сетки :) Так что проблем с производительностью не предвидится :)
homm
>Полигон == треугольник!!!!
C какого это перепугу?
Я говорю про элемент рисуемый
glBegin(GL_POLYGON);
Т.е. некий объект заданный своими вершинами. Само собой если вершины 3 то это треугольник.
Если в терминологии спецов принято называть треугольник полигоном то как они называют то что я называю полигоном?