Вершины двигать не нужно. Важно понимать, что происходит во время рендера. Каждая вершина, которая поступает на графический конвеер, умножается на матрицу 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();
}
Все трансформации координат относительны.