Показать сообщение отдельно
Старый 26.08.2011, 20:05   #18
alcoSHoLiK
Дэвелопер
 
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений
(для 110 пользователей)
Ответ: передвижение с помощью матриц

Вершины двигать не нужно. Важно понимать, что происходит во время рендера. Каждая вершина, которая поступает на графический конвеер, умножается на матрицу World, View и Projection. В итоге получаются экранные координаты вершины.

Чтобы переместить объект в мире тебе надо изменить матрицу World перед рендером этого объекта. Чтобы перемещать независимо несколько объектов, надо сохранять матрицу World до трансформации и восстанавливать после.

Для примера, продемонстрирую процесс в OpenGL коде. В OpenGL вместо отдельных матриц World и View используется одна modelview матрица. Сути это не меняет, т.к. эта матрица является произведением world на view.
// все функции трансформации работают с текущей матрицей

glPushMatrix(); // сохраним матрицу на стеке

// Переместим и отмасштабируем modelview матрицу
glTranslatef(1, -1, 10);
glScalef(2, 3, 1);

// Отрисуем объект
glDrawArrays(...);

// Восстановим modelview матрицу
glPopMatrix();
Таким образом, идеологически, ты трансформируешь систему координат перед рендером объекта, и наблюдателю кажется, что объект перестился. На самом деле, объект остается на месте в локальной системе координат, а переместился наблюдатель.

Аналогичным образом можно независимо двигать, вращать и масштабировать несколько объектов, надо просто каждого из них обернуть в вызовы push/pop:
for (int i = 0; i < OBJECT_COUNT; ++i) {
    glPushMatrix();

    // трансформируем что надо и рисуем объект

    glPopMatrix();
}
Все трансформации координат относительны.
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо alcoSHoLiK за это полезное сообщение:
Mind (26.08.2011), PackegerX (09.01.2012), St_AnGer (26.08.2011)