Я немного смущен. Мне нужна помощь, я пытался реализовать камеру Arcball. Теория, которой я придерживался, следующая: https://www.khronos.org/opengl/wiki/Object_Mouse_Trackball
Он "работает", за исключением того, что он не ведет себя как камера для игры в мяч в Renderdo c:
Mine:
Renderdo c
Так что в моем случае, когда вы пытаетесь повернуть слишком далеко от центра экрана, вращение кажется в противоположном направлении от того, где оно должно быть
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, а верхний левый угол (-, -) верхний правый угол (+, -), нижний левый (-, +) и, наконец, последний вариант (+, +).
Так что я не знаю, зачем мне работать в отрицательной системе координат, чтобы это работало.