Ваша проблема в том, что glRotate
всегда вращается вокруг (0,0,0)
... поэтому, чтобы сделать ваше правое преобразование, сначала поверните идентичность, а затем переведите.Но есть небольшая проблема, потому что glTranslate будет использовать локальные координаты, и вам нужны глобальные ... к счастью, вы можете установить источник матрицы напрямую.Как комментарии, где вам не хватает вот как это будет выглядеть:
glMatrixMode(GL_MODELVIEW);
glLoadIdentity(); // unit matrix
glRotatef(angle.z,0.0,0.0,1.0); // rotate around (0,0,0) and z axis
double m[16];
glGetDoublev(GL_MODELVIEW_MATRIX,m);// get actual matrix into CPU side memory/code
m[12]=position.x; // change the global position
m[13]=position.y;
m[14]=0.0;
glLoadMatrix(m); // update GL matrix with the changed one
glScalef(0.10,0.075,0.10); // scale ship
Если ваша позиция в уже масштабированных координатах, то шкала будет идти сразу после поворота.
ОстерегайтесьЯ написал это прямо в редакторе ответов, поэтому возможны незначительные синтаксические ошибки ...
кстати, вы можете использовать m
также для движения в направлении корабля m[0,1,2]
это x
направление оси и m[4,5,6]
это y
ось.не уверен, в какой точке указана модель вашего корабля.Вы просто добавляете этот forward
вектор, умноженный на speed/deltatime
к вашей позиции в некотором таймере.
Для получения дополнительной информации о матрицах см .: Понимание матриц однородного преобразования 4x4