Четверг, 25 Апреля 2024, 13:26

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » Общие обсуждения программистов » Обновление точек в OpenGL
Обновление точек в 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)
По моему ты не на то умножаешь.

А по-моему у тебя большое недопонимание основ.
Во-первых, код который привел я полностью идентичен тому, что написал ты (скопипастил наверное) - и я еще не на то умножаю biggrin
Во-вторых, как точка в (0,0) может как-либо поворачиваться? В своем же коде ты умножаешь ноли на элементы матрицы, которые отвечают за поворот... что по-твоему там в результате должно получиться?

В твоем случае точка (0,0) есть центр координат твоего квадрата(например), вокруг нее все и вращается. У квадрата есть еще 3 точки, вот их и умножай.


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
Форум игроделов » Программирование » Общие обсуждения программистов » Обновление точек в OpenGL
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг