首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Arcball相机行为异常

Arcball相机行为异常
EN

Stack Overflow用户
提问于 2020-04-14 01:21:02
回答 1查看 31关注 0票数 0

我有点困惑。我需要帮助,我试着装了个弧线球相机。我遵循的理论是:https://www.khronos.org/opengl/wiki/Object_Mouse_Trackball

它“工作”,只是它的行为不像Renderdoc中的arcball相机:

我的:

Renderdoc

因此,在我的屏幕中,当你试图旋转离屏幕中心太远时,旋转似乎与它应该在的方向相反。

代码语言:javascript
复制
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,左上角是(-,-),右上角是(+,-),左下角是(-,+),最后一个是(+,+)。

所以我不知道为什么我需要在一个否定的坐标系中工作。

EN

回答 1

Stack Overflow用户

发布于 2020-04-14 01:58:04

问题是,我所在的网站定义了OpenGL坐标系的公式。

然而,我在vulkan上工作,其中Y坐标被翻转,这改变了系统的惯用手。因此,按原样使用公式会使用球体的错误半部分。

Vulkan的正确实现只需要否定z分量,即:

代码语言:javascript
复制
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))};
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61193138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档