Я не уверен, как прокомментировать или добавить ответ Кендалла, поэтому я просто добавлю его как новый ответ.
Я думаю, что вы можете использовать Y для вверх, так что вы бы использовали этоесли направление в радианах:
movementX = sin(direction);
movementZ = cos(direction);
если направление в градусах, вам придется преобразовать его в радианы:
radians = degrees*(PI/180);
Просто умножьте движение на 1 или -1 в зависимости от того,вы двигаетесь вперед или назад:
movementX = sin(direction)*forwardsBackwards;
movementZ = cos(direction)*forwardsBackwards;
Если вам также нужен страйфинг, вы можете сделать:
movementX = sin(direction)*forwardsBackwards+sin(direction+1.5707)*sideToSide;
movementZ = cos(direction)*forwardsBackwards+cos(direction+1.5707)*sideToSide;
Где sideToSide равен 1 или -1 в зависимости от того, стреляете ли вы влево илиправо.1.5707 - это 90 градусов в радианах (PI / 2), что означает, что независимо от того, в каком направлении вы находитесь, он принимает угол 90 градусов справа от него.Вы также можете добавить 90 градусов к повороту градуса перед преобразованием, если хотите.
Умножьте всю вещь на желаемую скорость движения:
movementX = (sin...eToSide)*speed;
movementZ = (cos...eToSide)*speed;
Это, однако, создаст эффект перебоя, когдаВы будете двигаться быстрее, если будете двигаться в двух направлениях одновременно.Если вы хотите, чтобы этого не происходило, добавьте это перед вычислением движения:
if (!forwardsBackwards && !sideToSide )
{
forwardsBackwards *= 0.7071;
sideToSide *= 0.7071;
}
Вы также можете заменить .7071 на cos (45), если вам это нужно, чтобы быть чрезвычайно точным.
В качестве альтернативы вы можете:
float diagonalMod = 1;
if (!forwardsBackwards && !sideToSide)
diagonalMod = 0.7071; // or cos(45)
movementX = (sin...eToSide)*speed*diagonalMod;
movementZ = (cos...eToSide)*speed*diagonalMod;
Сначала вы захотите повернуть, а затем перевести. Другой способ, если я правильно об этом думаю, в основном похожперемещение точки, в которой ваша камера будет вращаться, точка поворота.Вот почему вы должны обрезать объекты при вращении.
Кроме того, вы должны выполнять вращение «камеры» и перевод сразу после glLoadIdentity ();так как вы хотите, чтобы все остальное в вашей сцене двигалось и вращалось, именно так функционирует «камера» OpenGL.Вот как это будет сделано:
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glRotated(yrot, 0, 1, 0);
glTranslated(xposition, 0, zposition);
glPushMatrix();
И для дальнейшего использования в случае, если вы расширите его:
glRotatef(Pitch, 1, 0, 0); // Up and down look
glRotatef(Yaw, 0, 1, 0); // Left and right look
glRotatef(Roll, 0, 0, 1); // Like a barrel roll in a jet
glTranslatef(X,Y,Z);