我有点困惑。我需要帮助,我试着装了个弧线球相机。我遵循的理论是:https://www.khronos.org/opengl/wiki/Object_Mouse_Trackball
它“工作”,只是它的行为不像Renderdoc中的arcball相机:
我的:

Renderdoc

因此,在我的屏幕中,当你试图旋转离屏幕中心太远时,旋转似乎与它应该在的方向相反。
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链接所描述的有什么不同。
我通过将位置乘以-1;来修复它。
我不明白为什么这能解决数学问题。输入coorindate是我所期望的。位置从-1规范化到1,左上角是(-,-),右上角是(+,-),左下角是(-,+),最后一个是(+,+)。
所以我不知道为什么我需要在一个否定的坐标系中工作。
发布于 2020-04-14 01:58:04
问题是,我所在的网站定义了OpenGL坐标系的公式。
然而,我在vulkan上工作,其中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))};
}https://stackoverflow.com/questions/61193138
复制相似问题