FPS 相机上不需要的滚动

Posted

技术标签:

【中文标题】FPS 相机上不需要的滚动【英文标题】:Unwanted Roll on FPS Camera 【发布时间】:2017-04-04 21:58:57 【问题描述】:

所以最近我一直在学习使用四元数,我有一个 fps 相机,但是当我从本地 upright 旋转时,我得到了一些“不需要的”滚动> 向量,但是我很确定这是正常的,但是如何防止它这样做呢?我尝试了here 和here 的一些方法,但都不起作用,并且在旋转相机时给出了奇怪的结果。任何帮助将不胜感激!

Download Executable

void Transform::Update()

    transform = position * glm::toMat4(quatRot) * scale;


void Transform::ApplyRotation(glm::vec3 rot, bool isDegr = true)

    if (isDegr)
        quatRot = glm::quat(GetRads(rot)) * quatRot;
    else
        quatRot = glm::quat(rot) * quatRot;


glm::vec3 Transform::Forward() const

    return glm::normalize(glm::vec3(transform[2][0], transform[2][1], transform[2][2]));


glm::vec3 Transform::Right() const

    return glm::normalize(glm::vec3(transform[0][0], transform[0][1], transform[0][2]));


glm::vec3 Transform::Up() const

    return glm::normalize(glm::vec3(transform[1][0], transform[1][1], transform[1][2]));


void FPCamera::Update()

    Transform *trans = GetOwner()->GetTransform();

    Vec2_i difference = GetWindow()->GetDifference();

    glm::vec3 tmpDiff(-(static_cast<float>(difference[1]) * 0.5f), -(static_cast<float>(difference[0]) * 0.5f), 0.0f);

    trans->ApplyRotation(trans->Right() * tmpDiff[0]);
    trans->ApplyRotation(trans->Up() * tmpDiff[1]);

    view = glm::inverse(trans->GetMatrix());

【问题讨论】:

标准化你的向量 @TonyJ 我假设您的意思是ApplyRotation 上的rot 参数?我把它标准化了,但还是会有滚动。 我会说通过调试器运行它,添加一些断言来检查向量是否被规范化。如果没有一个最小的例子,我不能说向量在什么时候没有被规范化,你需要弄清楚。此外,这只是一个建议,不一定是问题,我只是在向量和 quats 未标准化时看到了足够多的错误。 您是否将您的结果与矩阵数学函数的参考实现进行了比较,例如Sony Vector Math one? 我明白你为什么会推荐它。我从未听说过它在未标准化时会导致“错误”。我的意思是,当我在脑海中思考时,它可能会做的最糟糕的事情是它可能会旋转更多 0.0f-1.0f 的倍数。 【参考方案1】:

我找到了答案,当我使用this 解决方案时,我不知道我需要使用世界向量而不是局部向量来作为我从this 解决方案中找到的轴角。

void Transform::ApplyRotation(glm::quat yaw, glm::quat pitch)

    quatRot = pitch * quatRot * yaw;


void FPCamera::Update()

    Transform *trans = GetOwner()->GetTransform();

    Vec2_i difference = GetWindow()->GetDifference();

    glm::vec3 tmpDiff(-(static_cast<float>(difference[1]) * 0.5f), -(static_cast<float>(difference[0]) * 0.5f), 0.0f);

    trans->ApplyRotation(glm::quat(GetRads(glm::vec3(tmpDiff[0], 0.0f, 0.0f))), glm::quat(GetRads(glm::vec3(0.0f, tmpDiff[1], 0.0f))));

    view = glm::inverse(trans->GetMatrix());

【讨论】:

以上是关于FPS 相机上不需要的滚动的主要内容,如果未能解决你的问题,请参考以下文章

css 60 fps滚动

编写 Javascript HTML5 滚动“相机”

Jquery滚动功能在iphone设备上不起作用

滚动视图上不显示文本视图

RichTextBox 滚动条在某些 PC 上不显示

jQuery 平滑滚动在 iPad 和 iPhone 上不起作用