Обновление точек в OpenGL
| |
clidi | Дата: Четверг, 20 Сентября 2012, 20:56 | Сообщение # 1 |
почетный гость
Сейчас нет на сайте
| Как можно обновлять точки в Opengl? Кто как это делает? Например при передвижении персонажа(квадрата) его 4 вершины меняют координаты. Как узнать где именно они теперь находятся?
|
|
| |
Archido | Дата: Пятница, 21 Сентября 2012, 07:07 | Сообщение # 2 |
Сэнсэй
Сейчас нет на сайте
| Quote (clidi) Как можно обновлять точки в Opengl? Наверное не точки, а вершины.
Quote (clidi) Кто как это делает? Например при передвижении персонажа(квадрата) его 4 вершины меняют координаты. Как узнать где именно они теперь находятся? Самый простой вариант (и сам используемый) - делать через World матрицу, в OpenGL это вообще легко сделать, благодаря наличию в нем Matrix стека.
Как то так: Code //вот эта ф-ция переместит квадрат в нужною позицию glTranslatef(PosX, PosY, 0.0f); //PosX, PosY - позиция квадрата на экране
glBegin(GL_QUADS); //Вот отрисовка персонажа квадрата =), размером 64х64 glVertex3f(0, 0, 0.0f); glVertex3f(64, 0, 0.0f); glVertex3f(64, 64, 0.0f); glVertex3f(0, 64, 0.0f); glEnd();
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| |
clidi | Дата: Суббота, 22 Сентября 2012, 16:27 | Сообщение # 3 |
почетный гость
Сейчас нет на сайте
| А как потом узнать где находится вершина (например glVertex3f(0, 0, 0.0f);) после ее передвижения?
|
|
| |
TimKruz | Дата: Суббота, 22 Сентября 2012, 17:15 | Сообщение # 4 |
старожил
Сейчас нет на сайте
| clidi, ну вот смотри. Изначально у тебя камера находится в точке (0,0,0), и если вызвать glVertex3f(1,2,3), положение точки будет (1,2,3). А если после этого сделать glTranslatef(1,1,1), и снова вызвать glVertex3f(1,2,3), то вторая точка будет иметь координаты (2,3,4) относительно точки (0,0,0) в системе координат первой точки. Если выполнить следующий код: Code glTranslatef(X0, Y0, Z0); glVertex3f(X, Y, Z); То полученная точка будет иметь координаты (X+X0, Y+Y0, Z+Z0) относительно предыдущей (до вызова glTranslate) системы координат.
|
|
| |
clidi | Дата: Суббота, 22 Сентября 2012, 17:31 | Сообщение # 5 |
почетный гость
Сейчас нет на сайте
| А конкретнее как это сделать?
Code glRotatef(90,0,0,1); glGetFloatv(GL_MODELVIEW_MATRIX, mat); glBegin(GL_LINES); glVertex2d(0,0); glVertex2d(80,0); glEnd();
mat это матрица размером 16. В Opengl при glTranslate меняется mat[12], mat[13], mat[14]. При glRotate по оси z меняется mat[0] mat[1] mat[4] mat[5]. С glTranslate работает все нормально а вот с glRotate что то не тоДобавлено (22.09.2012, 17:31) --------------------------------------------- Например при glRotatef(45,0,0,1); mat[0] = 0.707107 mat[1] = 0.707107 mat[4] = -0.707107 mat[5] = 0.707107 Что с этим делать чтоб понять куда развернулась вершина?
|
|
| |
TimKruz | Дата: Суббота, 22 Сентября 2012, 18:08 | Сообщение # 6 |
старожил
Сейчас нет на сайте
| Quote (clidi) Например при glRotatef(45,0,0,1); mat[0] = 0.707107 mat[1] = 0.707107 mat[4] = -0.707107 mat[5] = 0.707107 Что с этим делать чтоб понять куда развернулась вершина? Ну ты повернул систему координат на 45 градусов, значит, точка сместилась на 45 градусов по окружности с центром в точке (0,0). sin(45)=cos(45)=корень из 2 разделить на 2, что примерно равно 0.707107... Синус - это y, косинус - x. Это для единичной окружности (R=1), т.е. точка отстояла от (0,0) на 1.
Для чего тебе нужно узнать точные координаты точек? Если для игровой физики, то это нужно обрабатывать независимо от OpenGL, а потом преобразовывать координаты для прорисовки...
|
|
| |
clidi | Дата: Суббота, 22 Сентября 2012, 18:10 | Сообщение # 7 |
почетный гость
Сейчас нет на сайте
| Нужно для коллизии. Можешь пожалуйста дать ссылку где про это рассказывается (независимо от OpenGL)?
|
|
| |
TimKruz | Дата: Воскресенье, 23 Сентября 2012, 21:11 | Сообщение # 8 |
старожил
Сейчас нет на сайте
| Quote (clidi) Нужно для коллизии. Можешь пожалуйста дать ссылку где про это рассказывается (независимо от OpenGL)? Ссылок у меня нет, поищи сам. В принципе, там сплошная геометрия...
|
|
| |
Archido | Дата: Понедельник, 24 Сентября 2012, 13:31 | Сообщение # 9 |
Сэнсэй
Сейчас нет на сайте
| Quote (clidi) Что с этим делать чтоб понять куда развернулась вершина? А умножить изначальную вершину на полученную матрицу не судьба что ли?
Code float m[4][4];
... glGetFloatv(GL_MODELVIEW_MATRIX, m); ...
Pos.x = m[0][0] * Vertex.x + m[1][0] * Vertex.y + m[3][0]; Pos.y = m[0][1] * Vertex.x + m[1][1] * Vertex.y + m[3][1];
Pos - результат, Vertex - изначальная позиция вершины (то, что идет в параметрах glVertex2d, первый x, второй y соответственно).
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
Сообщение отредактировал Archido - Понедельник, 24 Сентября 2012, 13:32 |
|
| |
clidi | Дата: Понедельник, 24 Сентября 2012, 14:18 | Сообщение # 10 |
почетный гость
Сейчас нет на сайте
|
Archido, По моему ты не на то умножаешь.
Я делал так и не работало с поворотом (точка в (0,0)): Code vertArray[0].x = transformMatrix[0]*0 + transformMatrix[4]*0 + transformMatrix[8]*0 + transformMatrix[12]; vertArray[0].y = transformMatrix[1]*0 + transformMatrix[5]*0 + transformMatrix[9]*0 + transformMatrix[13];
Сообщение отредактировал clidi - Понедельник, 24 Сентября 2012, 14:58 |
|
| |
Archido | Дата: Понедельник, 24 Сентября 2012, 15:27 | Сообщение # 11 |
Сэнсэй
Сейчас нет на сайте
| Quote (clidi) По моему ты не на то умножаешь. А по-моему у тебя большое недопонимание основ. Во-первых, код который привел я полностью идентичен тому, что написал ты (скопипастил наверное) - и я еще не на то умножаю Во-вторых, как точка в (0,0) может как-либо поворачиваться? В своем же коде ты умножаешь ноли на элементы матрицы, которые отвечают за поворот... что по-твоему там в результате должно получиться?
В твоем случае точка (0,0) есть центр координат твоего квадрата(например), вокруг нее все и вращается. У квадрата есть еще 3 точки, вот их и умножай.
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| |
|