![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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();