Если вы создаете орбитальную камеру (oribitng вокруг LookAt) для openGL, я рекомендую вам сделать это со следующими данными:
LookAtPosition- 3D vector
CamUp - 3D unit vector
RelativeCamPosition - 3D unit vector
CamDistance - decimal number
LookAtPosition - это точка, на которую вы будете смотреть.CamUp - это вектор, направленный вверх от камеры, вы можете увидеть его на этом изображении .Лучше всего инициализировать камеру без поворота, чтобы CamUp = [0,1,0].Обратите внимание, что это единичный вектор, поэтому его величина / размер / длина всегда равны 1. RelativeCamPosition снова является единичным вектором.Вы получите его, взяв LookAt на вектор камеры и разделив его на величину, которую вы сохраните в CamDistance.В инициализированном состоянии это может выглядеть так:
LookAtPosition = [0,0,0]
CamUp = [0,1,0]
RelativeCamPosition = [1,0,0]
CamDistance = 10
Теперь вы можете получить положение камеры на
CamPosition = LookAtPosition + RelativeCamPosition * CamDistance
Но вам нужно повернуть камеру вокруг вправо?Ну, есть причина для единичных векторов - их легко использовать в расчетах.Я считаю, что вы используете углы для вращения, поэтому вам нужно использовать только синус и косинус.Функция поворота может выглядеть следующим образом:
Rotate(angleX, angleY){
RelativeCamPosition.x = sin(angleX)*cos(angleY);
RelativeCamPosition.z = cos(angleX)*cos(angleY);
RelativeCamPosition.y = sin(angleY);
}
, где angleX и angleY - абсолютные (НЕ ОТНОСИТЕЛЬНЫЕ) повороты в горизонтальном и вертикальном направлении.Вы должны всегда использовать абсолютное вращение, потому что при добавлении могут быть ошибки с плавающей запятой.Во всяком случае, я только что сделал эти расчеты на клочке бумаги, поэтому я надеюсь, что они в порядке.
Редактировать: Я только что заметил, что это будет работать, только если ваше начальное состояние, как я написал RelativeCamPosition = [1,0,0]
.Однако их не должно быть сложно отредактировать, чтобы они работали для начального состояния.