この問題の背後にある数学を理解できません。マウス入力で自由に見ることができる FPS カメラを作成しようとしています。
180 度の自由度でルックアット ポイントを回転させて配置しようとしています。私の視点に合わせて世界を glRotate するのがより簡単な解決策であることは理解していますが、このアプローチは望んでいません。私はここに含まれる三角法にかなり慣れておらず、この問題を自分が望む方法で解決する方法を理解できません...
これまでのところこれを行う私の試みはここにあります...
ウィンドウの中心に対するマウス座標を取得し、それをカメラ オブジェクトで処理するコード
#define DEG2RAD(a) (a * (M_PI / 180.0f))//convert to radians
static void glutPassiveMotionHandler(int x, int y) {
glf centerX = WinWidth / 2; glf centerY = WinHeight / 2;//get windows origin point
f speed = 0.2f;
f oldX = mouseX; f oldY = mouseY;
mouseX = DEG2RAD(-((x - centerX)));//get distance from 0 and convert to radians
mouseY = DEG2RAD(-((y - centerY)));//get distance from 0 and convert to radians
f diffX = mouseX - oldX; f diffY = mouseY - oldY;//get difference from last frame to this frame
if (mouseX != 0 || mouseY != 0) {
mainCamera->Rotate(diffX, diffY);
}
カメラを回転させるコード
void Camera::Rotate(f angleX, f angleY) {
Camera::refrence = Vector3D::NormalizeVector(Camera::refrence * cos(angleX)) + (Camera::upVector * sin(angleY));//rot up
Camera::refrence = Vector3D::NormalizeVector((Camera::refrence * cos(angleY)) - (Camera::rightVector * sin(angleX)));//rot side to side
};
Camera::refrence はルックアット ポイントです。ルックアット ポイントの処理は次のように処理されます。
void Camera::LookAt(void) {
gluLookAt(
Camera::position.x, Camera::position.y, Camera::position.z,
Camera::refrence.x, Camera::refrence.y, Camera::refrence.z,
Camera::upVector.x, Camera::upVector.y, Camera::upVector.z
);
};