Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Rotate in OpenGL [Delphi, Windows]


Creep ©   (2004-11-06 19:09:00) 

Помогите пожалуйста с поворотом в OpenGL. Чтобы квадрат,многоугольник и т.д крутились вокруг своей оси (я ипользую glRotate), а не вокруг центра окна.


марсианин   (2004-11-07 23:00:00) [1]

[8] Shulkin

конечно! но в результате действия всяких glTranslate, glRotate есt координаты вершин (которые на экране нарисуются) будут другими..

вывод: посчитать готовые координаты вершин повернутых квадратиков самим (самим заполнить матрицу преобразований и умножить ее на исходные координаты) - и скормить их ОпенГЛ безовсяких поворотов/сдвигов.

или вытащить текущую матрицу преобразований (см. один из параметров glGetDouble) и умножить на нее исходные координаты...

хоть что-нибудь ясно?.. без азов линейной алгебры не обойтись здесь


Creep   (2004-11-07 20:10:00) [2]

Да я то какраз и краснова читаю.


OSokin   (2004-11-07 16:27:00) [3]

to Creep: ты случайно не Краснова читаешь?
Если надо, могу замылить мой компонент GLForm (инициализирует на обычной форме OpenGL), только там при изменении размера небольшие ошибки


Shulkin   (2004-11-07 03:56:00) [4]

to марсианин : "никаких точек опенгл не запоминает". А что нам
мешает запомнить их самим? Просто пишем процедуру вроде этой :

Procedure DrawCube ( x,y,z,Size : GLfloat) ;
begin
   glBegin (GL_QUADS);
    glVertex3f ( X+Size , Y+Size , Z+Size ) ;
    glVertex3f ( X-Size , Y+Size , Z+Size ) ;
    glVertex3f ( X-Size , Y-Size , Z+Size ) ;
    glVertex3f ( X+Size , Y-Size , Z+Size ) ;
   glEnd ;

   glBegin (GL_QUADS);
    glVertex3f ( X+Size , Y+Size , Z-Size ) ;
    glVertex3f ( X+Size , Y-Size , Z-Size ) ;
    glVertex3f ( X-Size , Y-Size , Z-Size ) ;
    glVertex3f ( X-Size , Y+Size , Z-Size ) ;
   glEnd ;

   glBegin (GL_QUADS);
    glVertex3f ( X-Size , Y+Size , Z+Size ) ;
    glVertex3f ( X-Size , Y+Size , Z-Size ) ;
    glVertex3f ( X-Size , Y-Size , Z-Size ) ;
    glVertex3f ( X-Size , Y-Size , Z+Size ) ;
   glEnd ;

   glBegin (GL_QUADS);
    glVertex3f ( X+Size , Y+Size , Z+Size ) ;
    glVertex3f ( X+Size , Y-Size , Z+Size ) ;
    glVertex3f ( X+Size , Y-Size , Z-Size ) ;
    glVertex3f ( X+Size , Y+Size , Z-Size ) ;
   glEnd ;

   glBegin (GL_QUADS);
    glVertex3f ( X-Size , Y+Size , Z-Size ) ;
    glVertex3f ( X-Size , Y+Size , Z+Size ) ;
    glVertex3f ( X+Size , Y+Size , Z+Size ) ;
    glVertex3f ( X+Size , Y+Size , Z-Size ) ;
   glEnd ;

   glBegin (GL_QUADS);
    glVertex3f ( X-Size , Y-Size , Z-Size ) ;
    glVertex3f ( X+Size , Y-Size , Z-Size ) ;
    glVertex3f ( X+Size , Y-Size , Z+Size ) ;
    glVertex3f ( X-Size , Y-Size , Z+Size ) ;
   glEnd ;
end;

Ну а потом заводим глобальные X,Y,Z и Size и по ним управляем
кубом - вращаем, двигаем и т.д.

to Creep : Коллизии также определяются по значениям координат и
размеров 2 кубов - нужно просто их сравнить.


марсианин   (2004-11-07 00:39:00) [5]


> Тогда просто полудается квадрат остается на месте. А мы
> двигаем систему кординат.


не понял.. квадрату вообще параллельно. он просто есть. а это наши проблемы как построить систему координат.


> И еще как обращаться к этим "квадратам". Например  просто
> в Delphi Form1.Image1.left, а в OpenGl Как?


тебе нужно получить новые координаты вершин квадрата после всех сдвигов/поворотов?


> Помоему, по указателю на участок памяти, содержащий квадрат


можно выловить указатель на текущую матрицу преобразований. никаких точек опенгл не запоминает


Колбасьев   (2004-11-06 23:47:00) [6]

Я не спец по OpenGL. Точно не помню: там либо указатель либо массив вершин. Это у OpenGL'шников распросить надо.


Creep   (2004-11-06 23:14:00) [7]

А как этот указатель выловить


Колбасьев   (2004-11-06 22:31:00) [8]

Помоему, по указателю на участок памяти, содержащий квадрат.
И в обще в OpenGL и DirectX про всякие удобные вещи типа


> Form1.Image1.left,


нужно сразу забыть, если только ты не напишешь их сам :-)


Creep   (2004-11-06 22:17:00) [9]

По кординате Z сравнивать не надо.
И еще как обращаться к этим "квадратам". Например  просто в Delphi Form1.Image1.left, а в OpenGl Как?


Creep   (2004-11-06 22:08:00) [10]

Тогда просто полудается квадрат остается на месте. А мы двигаем систему кординат.
И еще как определять столкновения одново квадрата с другим по OpenGL'ски.


марсианин   (2004-11-06 20:51:00) [11]

когда делаешь glRotate - все поворачивается вокруг текущего ценра координат. его надо сначала просто сдвинуть

glPushMatrix();

 glTranslate() //в точку, где д.б центр квадрата
 glRotate()     // вращаем

 Рисуем квадрат с центром в (0,0,0)

glPopMatrix();


Наверх

Титульная страница Поиск, карта сайта Написать письмо