私はアークボールスタイルのカメラを実装しようとしています。 glm :: lookAtを使用して、カメラをターゲットに向けたままにして、方位/傾斜角を使って球を回転させて球の表面を回ってビューを回転させます。90°方位角で反転するアールボールカメラ
私は、方位角が90度に近づくとビューが上下逆さまになる問題に遭遇しています。
ゲット投影とビューmartrices:
はここに関連するコードです。メインループ
void Visual::updateModelViewProjection() { model = glm::mat4(); projection = glm::mat4(); view = glm::mat4(); projection = glm::perspective ( (float)glm::radians(camera.Zoom), (float)width/height, // aspect ratio 0.1f, // near clipping plane 10000.0f // far clipping plane ); view = glm::lookAt(camera.Position, camera.Target, camera.Up); }
マウス移動イベント、カメラの回転のための
void Visual::cursor_position_callback(GLFWwindow* window, double xpos, double ypos) { if (leftMousePressed) { ... } if (rightMousePressed) { GLfloat xoffset = (xpos - cursorPrevX)/4.0; GLfloat yoffset = (cursorPrevY - ypos)/4.0; camera.inclination += yoffset; camera.azimuth -= xoffset; if (camera.inclination > 89.0f) camera.inclination = 89.0f; if (camera.inclination < 1.0f) camera.inclination = 1.0f; if (camera.azimuth > 359.0f) camera.azimuth = 359.0f; if (camera.azimuth < 1.0f) camera.azimuth = 1.0f; float radius = glm::distance(camera.Position, camera.Target); camera.Position[0] = camera.Target[0] + radius * cos(glm::radians(camera.azimuth)) * sin(glm::radians(camera.inclination)); camera.Position[1] = camera.Target[1] + radius * sin(glm::radians(camera.azimuth)) * sin(glm::radians(camera.inclination)); camera.Position[2] = camera.Target[2] + radius * cos(glm::radians(camera.inclination)); camera.updateCameraVectors(); } cursorPrevX = xpos; cursorPrevY = ypos; }
計算カメラの向きベクトル
void updateCameraVectors() { Front = glm::normalize(Target-Position); Right = glm::rotate(glm::normalize(glm::cross(Front, {0.0, 1.0, 0.0})), glm::radians(90.0f), Front); Up = glm::normalize(glm::cross(Front, Right)); }
で実行し、私はそれが関連していますかなり確信しています私のカメラの右のベクトルを計算する方法は、私はどのように補償するかを理解することはできません。
誰もこれまでに遭遇したことはありますか?助言がありますか?
'Right'計算では、' Front'が '(0、1、0)'と同一直線上にある場合、 'Front'と'(0,1,0) 'の積を取ります。ゼロベクトルを正規化すると、奇妙な動作につながる可能性があります。 – mlkn