1

この問題の背後にある数学を理解できません。マウス入力で自由に見ることができる 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
    );
};
4

2 に答える 2

2

U_Cam_X_angleは左右回転U_Cam_Y_angle、上下回転です。

view_radiusU_look_point_xU_look_point_yおよびまでの表示距離 (ズーム)U_look_point_zです。これは常に負の数です。これは、常にポジティブな方向を見ているからです。画面の奥にあるほどポジティブです。これはすべてラジアンです。

最後の 3..はeyeX、カメラが 3D 空間内にある場所ですeyeYeyeZ

このコードは VB.net にあります。VB から C++ へのコンバーターをオンラインで見つけるか、手動で行います。

Public Sub set_eyes()

    Dim sin_x, sin_y, cos_x, cos_y As Single
    sin_x = Sin(U_Cam_X_angle + angle_offset)
    cos_x = Cos(U_Cam_X_angle + angle_offset)
    cos_y = Cos(U_Cam_Y_angle)
    sin_y = Sin(U_Cam_Y_angle)
    cam_y = Sin(U_Cam_Y_angle) * view_radius
    cam_x = (sin_x - (1 - cos_y) * sin_x) * view_radius
    cam_z = (cos_x - (1 - cos_y) * cos_x) * view_radius

    Glu.gluLookAt(cam_x + U_look_point_x, cam_y + U_look_point_y, cam_z + U_look_point_z, _
                        U_look_point_x, U_look_point_y, U_look_point_z, 0.0F, 1.0F, 0.0F)

    eyeX = cam_x + U_look_point_x
    eyeY = cam_y + U_look_point_y
    eyeZ = cam_z + U_look_point_z

End Sub
于 2019-10-21T14:59:02.253 に答える