C++ 平滑过渡到标准三维视图方向

C++ 平滑过渡到标准三维视图方向,c++,math,opengl,c++11,C++,Math,Opengl,C++11,目前,我有一种机制,可以通过修改模型视图矩阵将视图定向为标准方向。 我希望通过提供一个平滑的动画来增强用户体验,该动画将用户从当前视图方向平滑过渡到标准视图方向->(方向的恒定变化率)。 理想情况下,转换时间应少于500毫秒 我已经实现了以下内容 矩阵类 四元数(我可以从中提取矩阵) 我可以提取当前视图方向,并且我知道所有标准视图的视图方向 我的问题是: 应允许用户在转换过程中进行交互和更改视图方向。我想是的,但不确定这种行为。我不希望应用程序冻结,无论系统状态如何 如何在开始和结束时分别以

目前,我有一种机制,可以通过修改模型视图矩阵将视图定向为标准方向。
我希望通过提供一个平滑的动画来增强用户体验,该动画将用户从当前视图方向平滑过渡到标准视图方向->(方向的恒定变化率)。
理想情况下,转换时间应少于500毫秒

我已经实现了以下内容

  • 矩阵类
  • 四元数(我可以从中提取矩阵)
我可以提取当前视图方向,并且我知道所有标准视图的视图方向

我的问题是:

  • 应允许用户在转换过程中进行交互和更改视图方向。我想是的,但不确定这种行为。我不希望应用程序冻结,无论系统状态如何
  • 如何在开始和结束时分别以加速度和减速度保持恒定的方向变化率
  • 在进行转换时(500毫秒),应如何渲染帧。有一种优雅的方式吗 在C++11中使用std::thread执行此操作

  • 如果已经在渲染时处理用户输入,则不需要单独的线程。如果你想让用户仍然拥有控制权,那就不要让他们直接控制视图矩阵——而是控制一个目标视图矩阵,只需将当前视图矩阵朝着目标移动一部分即可


    这将使平稳的加速/减速变得复杂-比如,你以一个小的加速开始,提高速度,然后用户移动相机:你是以低速重新开始,还是以同样的速度继续?这是一个设计决策,但我认为如果视图在中途旋转的速度发生变化,控件会感到奇怪。此外-如果你有加速/减速,根据定义,变化率不是恒定的,所以你真的需要决定你想要什么,可能尝试两种解决方案,看看它是否“感觉正确”,因为没有更好的短语。

    如果它很快,你可以锁定输入一段时间。如果实现自己的计时器功能,则不必使用线程(可能会更简单)。而对于b)-四元数就是为了这样做的,这似乎不是正确的做法,因为用户可能会发现系统在转换打开时没有响应。不幸的是,还有其他几个同步更新,如场景中的更改,应该由线程处理。我不确定C++11是否有内置计时器。如果C++11/STL中没有可用的东西,我很乐意编写一个。我认为您也可以在这种值修改中使用
    std::promise
    ,但我不确定第1部分如何成为一个好问题,如果还没有类似的内容。我以前玩过带电动音量旋钮(由遥控器控制)的放大器,看到当旋钮试图朝一个方向转动而我实际朝另一个方向转动时会发生什么。在我看来,这是一个类似的情况。事实上,就方向的变化率而言,我尝试了恒定的变化率,但在开始和结束时都感觉到了不平稳。因此,我计划实施第二种方法,不断加速到中途阶段,然后减速到0。我现在在主线程上执行此操作,这将阻止场景更新。我仍然在寻找一个“优雅”的解决方案。但是,我仍然不确定是否阻止用户输入。