Понимание этого, безусловно, может быть проблематичным. Я думаю, что проблема, с которой вы сталкиваетесь, заключается в том, что вы используете одни и те же матрицы преобразования для вращений независимо от того, как «корабль» уже ориентирован. Но вы не хотите вращать свой корабль в зависимости от того, как он будет поворачиваться, когда он направлен вперед, вы хотите вращаться в зависимости от того, как он смотрит сейчас. Чтобы сделать это, вы должны трансформировать свои матрицы контролируемого поворота так же, как вы трансформируете свой корабль.
Например, скажем, у нас есть три матрицы, каждая из которых представляет виды поворотов, которые мы хотим сделать.
float theta = 10.0*(pi/180.0)
matrix<float> roll = [[ cos(theta), sin(theta), 0]
[ -sin(theta), cos(theta), 0]
[ 0, 0, 1]
matrix<float> pitch = [[ cos(theta), 0, sin(theta)]
[ 0, 1, 0]
[ -sin(theta), 0, cos(theta)]
matrix<float> yaw = [[1, 0, 0]
[0, cos(theta), sin(theta)]
[0, -sin(theta), cos(theta)]]
matrix<float> orientation = [[1, 0, 0]
[0, 1, 0]
[0, 0, 1]]
каждая, представляющая 10 градусов вращения по каждой из трех осей ориентации полета. Кроме того, у нас есть матрица для ориентации вашего корабля, первоначально просто сойти вперед. Вы преобразуете вершины своего корабля с помощью этой матрицы ориентации, чтобы отобразить ее.
Затем, чтобы получить свою ориентацию после хода, вам нужно немного поработать, сначала преобразовать матрицы управления ориентацией в координаты игрока, а затем применить это к ориентации, чтобы получить новую ориентацию: что-то вроде * 1008. *
function do_roll(float amount):
matrix<float> local_roll = amount * (roll * orientation)
orientation = orientation * local_roll
function do_pitch(float amount):
matrix<float> local_pitch = amount * (pitch * orientation)
orientation = orientation * pitch_roll
function do_yaw(float amount):
matrix<float> local_yaw = amount * (yaw * orientation)
orientation = orientation * local_yaw
так что каждый раз, когда вы хотите повернуть тем или иным способом, вы просто вызываете одну из этих функций.