Ладно, полностью переписал это прошлой ночью, и я надеюсь, что вы найдете его полезным, если вы еще не придумали свои собственные решения или кого-то еще, кто приходит с подобным вопросом.смотрит вниз на -Z, правый вектор смотрит вниз на + X, а вектор вверх смотрит вниз на + Y.
Когда вы решаете построить свой мир, действительно не имеет значения, куда вы смотрите, если у вас 128x128Мир X, Z и вы находитесь посередине в 64x64, как любой игрок узнает, что они повернуты на 0 или 180 градусов.Они просто не будут.
Теперь вы упомянули, что вам не нравятся glRotatef и glTranslatef.Я также не буду использовать методы, которые обрабатывают векторную и матричную математику.Во-первых, я использую способ отслеживания векторов вперед, вверх и вправо.Итак, представьте, что вы вращаетесь по кругу, это вы вращаете свой прямой вектор.Поэтому, когда игрок хочет, скажем, бежать прямо вперед.Вы будете перемещать их вдоль X, Z вашего вектора вперед, но, допустим, они также хотят повернуть вправо.Ну, вы все равно будете двигать их по переднему вектору, но представьте, что 90-градусный снимок с прямого вектораПоэтому, если мы смотрим на 45 градусов, мы указываем на сектор -Z и -X.Так что стрельба переместит нас в сектор -Z и + X.Чтобы сделать это, вы просто отрицаете значение греха.Примеры обоих ниже, но это можно сделать по-разному. Ниже приведен грубый пример, чтобы лучше объяснить вышесказанное.
Position.X -= Forward.X; //Run Forward.
Position.Z -= Forward.Z;
Position.X += Forward.Z; //Run Backwards.
Position.Z += Forward.Z
Position.X += Forward.X; //Strafe Right.
Position.Z -= Forward.Z;
Position.X -= Forward.X; //Strafe Left.
Position.Z += Forward.Z;
Ниже приведен пример инициализации матрицы представления.Это должно быть выполнено только один раз, не помещайте это ни в какой код зацикливания.
glMatrixMode(GL_MODELVIEW);
view_matrix[4] = 0.0f; //UNUSED.
view_matrix[3] = 0.0F; //UNUSED.
view_matrix[7] = 0.0F; //UNUSED.
view_matrix[11] = 0.0F; //UNUSED.
view_matrix[15] = 1.0F; //UNUSED.
update_view();
glLoadMatrix(view_matrix);
Тогда это метод update_view ().Это должно вызываться только во время изменения в матрице вида.
public void update_view()
{
view_matrix[0] = Forward[0];
view_matrix[1] = Up[1] * Forward[1];
view_matrix[2] = Up[0] * -Forward[1];
view_matrix[5] = Up[0];
view_matrix[6] = Up[1];
view_matrix[8] = Forward[1];
view_matrix[9] = Up[1] * -Forward[0];
view_matrix[10] = Up[0] * Forward[0];
}
Векторы положения являются матрицами [12], [13] и [14] и отрицаются.Вы можете сохранить их или использовать матрицы [12], [13], [14] в качестве вектора для позиции.
view_matrix[12] = -Position.x;
view_matrix[13] = -Position.y;
view_matrix[14] = -Position.z;