Камера Arcball ведет себя странно - PullRequest
0 голосов
/ 13 апреля 2020

Я немного смущен. Мне нужна помощь, я пытался реализовать камеру Arcball. Теория, которой я придерживался, следующая: https://www.khronos.org/opengl/wiki/Object_Mouse_Trackball

Он "работает", за исключением того, что он не ведет себя как камера для игры в мяч в Renderdo c:

Mine: enter image description here

Renderdo center image description here

Так что в моем случае, когда вы пытаетесь повернуть слишком далеко от центра экрана, вращение кажется в противоположном направлении от того, где оно должно быть

vec3 ScreenToArcSurface(vec2 pos)
{
    const float radius = 0.9f; // Controls the speed
    if(pos.x * pos.x + pos.y * pos.y >= (radius * radius) / 2.f - 0.00001)
    {
        // This is equal to (r^2 / 2) / (sqrt(x^2 + y^2)) since the magnitude of the
        // vector is sqrt(x^2 + y^2)
        return {pos, (radius * radius / 2.f) / (length(pos))};
    }

    return {pos.x, pos.y, sqrt(radius * radius - (pos.x * pos.x + pos.y * pos.y))};
}


void ArcballCamera::UpdateCameraAngles(void* ptr, glm::vec2 position, glm::vec2 offset)
{
    auto camera = reinterpret_cast<ArcballCamera*>(ptr);

    vec3 vb = ScreenToArcSurface(position);
    vec3 va = ScreenToArcSurface(position - offset);

    float angle = acos(glm::min(1.f, dot(vb, va)));
    vec3 axis = cross(va, vb);

    camera->rotation *= quat(cos(angle) / 2.f, sin(angle) * axis);
    camera->rotation = normalize(camera->rotation);
}

glm::mat4 ArcballCamera::GetViewMatrix()
{
    return glm::lookAt(
        look_at_point + rotation * (position - look_at_point),
        look_at_point,
        rotation * up);
}

Я не понимаю, какая разница между тем, что я реализовал, и тем, что описывает ссылка на khronos.

I исправил это, умножив позицию на -1;.

Я не понимаю, почему это исправляет математику. Входные координаты - это то, что я ожидаю. положение нормализовано от -1 до 1, а верхний левый угол (-, -) верхний правый угол (+, -), нижний левый (-, +) и, наконец, последний вариант (+, +).

Так что я не знаю, зачем мне работать в отрицательной системе координат, чтобы это работало.

1 Ответ

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

Проблема в том, что Веб-сайт, из которого я взял это, определил формулу для системы координат OpenGL.

Однако я работаю над вулканом, где перевернута координата Y, которая меняет управляемость системы. В связи с этим при использовании формулы как есть используется неправильная половина сферы.

Для правильной реализации Vulkan нужно просто отменить компонент z, т. Е .:

vec3 ScreenToArcSurface(vec2 pos)
{
    const float radius = 0.9f; // Controls the speed
    if(pos.x * pos.x + pos.y * pos.y >= (radius * radius) / 2.f - 0.00001)
    {
        // This is equal to (r^2 / 2) / (sqrt(x^2 + y^2)) since the magnitude of the
        // vector is sqrt(x^2 + y^2)
        return {pos, -(radius * radius / 2.f) / (length(pos))};
    }

    return {pos.x, pos.y, -sqrt(radius * radius - (pos.x * pos.x + pos.y * pos.y))};
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...