Странное поведение при объединении двух функций класса и передаче переменных по ссылке - PullRequest
0 голосов
/ 13 апреля 2011

У меня есть следующие две функции класса, которые я пытаюсь объединить в одну, потому что они очень похожи:

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;
    }
}

Как видите, Player и Position - две частные переменныекласса.Они имеют тип данных 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)

Я также попробовал с указателем вместо ссылки, результат был тот же.Я что-то здесь упускаю?

1 Ответ

0 голосов
/ 13 апреля 2011

Вы заметите, что target.SetValue использует + для камеры и - для игрока при настройке координат XY и Z.

...