奇怪的行为合并两个类函数并通过引用传递变量

Weird behavior merging 2 class functions and passing variables by reference

本文关键字:类函数 引用 变量 两个 合并      更新时间:2023-10-16

我有以下两个类函数,我试图合并为一个,因为它们非常相似:

void Camera::UpdateCameraPosition(void) {
    if(cameraMode == CAMERA_MODE_THIRD_PERSON) {
        float alpha = Math::DegreesToRadians(Rotation.y);
        float beta = Math::DegreesToRadians(Rotation.x);
        Position.SetValue(
            Player.x + CAMERA_ORBIT_OFFSET * cos(beta) * sin(alpha),
            Player.y + CAMERA_ORBIT_OFFSET * sin(-beta),
            Player.z + CAMERA_ORBIT_OFFSET * cos(beta) * cos(alpha)
        );
    } else {
        Position = Player;
    }
}
void Camera::UpdatePlayerPosition(void) {
    if(cameraMode == CAMERA_MODE_THIRD_PERSON) {
        float alpha = Math::DegreesToRadians(Rotation.y);
        float beta = Math::DegreesToRadians(Rotation.x);
        Player.SetValue(
            Position.x - CAMERA_ORBIT_OFFSET * cos(beta) * sin(alpha),
            Position.y - CAMERA_ORBIT_OFFSET * sin(-beta),
            Position.z - CAMERA_ORBIT_OFFSET * cos(beta) * cos(alpha)
        );
    } else {
        Player = Position;
    }
}

可以看到,PlayerPosition是类的两个私有变量。它们的数据类型是Vector3D,另一个类。

我试着像这样合并它们:

void Camera::UpdateCameraOrPlayerPosition(Vector3D &target, Vector3D reference) {
    if(cameraMode == CAMERA_MODE_THIRD_PERSON) {
        float alpha = Math::DegreesToRadians(Rotation.y);
        float beta = Math::DegreesToRadians(Rotation.x);
        target.SetValue(
            reference.x - CAMERA_ORBIT_OFFSET * cos(beta) * sin(alpha),
            reference.y - CAMERA_ORBIT_OFFSET * sin(-beta),
            reference.z - CAMERA_ORBIT_OFFSET * cos(beta) * cos(alpha)
        );
    } else {
        target = reference;
    }
}

这可以编译,但它的行为不一样。当其他两个函数工作时,当我将这些函数调用替换为这个函数时,它不能正常工作。

我所做的替换是:

UpdatePlayerPosition() -> UpdateCameraOrPlayerPosition(Player, Position)
UpdateCameraPosition() -> UpdateCameraOrPlayerPosition(Position, Player)

我也尝试用指针代替引用,结果是一样的。我遗漏了什么吗?

您会注意到这个目标。当调整X、Y、Z坐标时,SetValue为Camera使用+,为Player使用-