如何减慢从BVH文件读取opengl动画的速度?

2024-04-08

使用 GLFW3,我目前制作了一个 bvh 文件解析器,它读取文件并将其转换为我在 opengl 中制作的人体模型。然而,每当我启动它时,移动速度太快,以至于眼睛看不到动画。所以我想把动画速度调低一点。这是我的渲染循环

while (!glfwWindowShouldClose(window))
    {
        // per-frame time logic
        // --------------------
        float currentFrame = glfwGetTime();
        deltaTime = currentFrame - lastFrame;
        lastFrame = currentFrame;

        // input
        // -----
        processInput(window);

        // render
        // ------
        glClearColor(0.9f, 0.9f, 0.9f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        (Some Shader Settings)

        glm::mat4 model = glm::mat4(1.0f);

        if (moveFlag == true) {
            bvh.clearVISITED();
            bvh.setMotionPerFrame(bvh.root, 0);
        }
        if (resetMatrices == true) {
            bvh.clearVISITED();
            bvh.resetMatrices(bvh.root);
        }

        drawBones(shader, bvh.root, model);

        glfwSwapBuffers(window);
        glfwPollEvents();
    }

if语句中的函数bvh.setMotionPerFrame(bvh.root, 0)是动画读取文件内每帧数据的关节配置的位置,并相应地设置每个关节的旋转矩阵和平移矩阵。 (moveFlag and resetMatrices是分别按下空格键和 r 按钮时设置的标志)

由于在每个渲染循环中读取每帧的通道数据是不可更改的,因此我想想出一种可以减慢渲染循环速度本身的方法。有什么建议么?


您需要在代码中添加计时。当您像这样解析 BVH MOTION 时:

MOTION
Frames:     20
Frame Time: 0.033333

你应该提取Frame Time值是帧之间的时间(以秒为单位)。现在,根据您的代码架构,您需要正确调整渲染时间。我习惯有一些

bool _redraw=false;

告诉整个应用程序在下一个可能的场合(例如计时器)重绘,这是由从鼠标/键盘事件更改视图或场景到调整窗口大小等任何事件设置的...

对于时间变化的东西,我通常还有一个函数:

void update(double dt);

定期从处理插值/模拟等的应用程序中调用dt自上次通话以来已过去的时间。现在dt可以是调用此的计时器间隔,或者如果我需要更好的精度,我可以测量dt直接使用windowsPerformanceCounter。如果你刚刚遇到无限循环,你仍然可以使用:

Sleep(dt*1000.0);

这并不精确,但会起作用。

有关动画和计时主题的更多信息可以在此处和子链接中找到:

  • 通过DeltaTime控制精灵序列 https://stackoverflow.com/a/41920247/2521214

现在回到 BVH,我的 C++ 更新方法如下所示:

void bvh::update() // call periodically to animate
 {
 if ((_play)&&(dt>1e-6))
  { 
  int f=frame;
  t+=tper(&t0);
  while (t>=dt)
   {
   t-=dt;
   frame++;
   if (frame>=frames)
    {
    frame=0;
    if (!_loop){ stop(); break; }
   }
  }
  if (f!=frame) setframe(frame);
 }
}

这是我的 BVH 课程中精选的一些内容:

List<int> root;             // root bones ix
List<bvh_bone> bone;        // HIERARCHY bvh
List<double> data;          // MOTION data
int frames;                 // MOTION frames
double dt;                  // MOTION delta time [ms]
int channels;               // channels/frame
// render
bool _redraw;               // out redraw needed?
// animation
bool _loop;                 // in loop playback?
bool _play,_pause,_stop;    // out animation buttons state?
int frame;                  // actual set frame
double t,t0;                // time elapsed from start of actual frame, measurement start time
void play() { tper(&t0); t=0.0; if (!_pause) frame=0; _play=1; _pause=0; _stop=0; setframe(frame); _redraw=true; }
void stop() { tper(&t0); t=0.0;                       _play=0; _pause=0; _stop=1; frame=0; setframe(frame); _redraw=true; }
void pause(){ tper(&t0); t=0.0; if (_stop) return;    _play=_pause; _pause=!_pause; }
void setframe(int frame);   // compute bones from frame data

And tper函数测量从我的计时库中获取的后续调用之间的时间:

const int   performance_max=64;                 // push levels
double      performance_Tms=-1.0,               // counter period [ms]
            performance_tms=0.0,                // measured time after tend [ms]
            performance_t0[performance_max];    // measured start times [ms]
int         performance_ix=-1;                  // actual time stack index

double tper(double *t0=NULL)    // return duration [ms] between tper() calls
    {
    double t,tt;
    LARGE_INTEGER i;
    if (performance_Tms<=0.0)
        {
        for (int j=0;j<performance_max;j++) performance_t0[j]=0.0;
        QueryPerformanceFrequency(&i); performance_Tms=1000.0/double(i.QuadPart);
        }
    QueryPerformanceCounter(&i); t=double(i.QuadPart); t*=performance_Tms;
    if (t0) { tt=t-t0[0]; t0[0]=t; performance_tms=tt; return tt; }
    performance_ix++;
    if ((performance_ix>=0)&&(performance_ix<performance_max))
        {
        tt=t-performance_t0[performance_ix];
        performance_t0[performance_ix]=t;
        }
    else { t=0.0; tt=0.0; };
    performance_ix--;
    performance_tms=tt;
    return tt;
    }

现在在主应用程序循环/计时器中只需定期调用update and if _redraw为 true 将其设置为 false 并重新绘制您的应用程序。当心我的bvh::dt已转换为 [ms] !!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何减慢从BVH文件读取opengl动画的速度? 的相关文章

随机推荐

  • Maven 无法使用 OpenJDK 11 找到 jaxb-api,即使它存在于存储库中

    我有一台装有 Windows 操作系统的机器 它用于构建一些 WAR 项目 它有已安装 Java 8在上面 我在用Maven 3 2 5构建这些 WAR 项目 一切正常 但由于 Java 8 由于免费更新的结束而在未来会成为一个问题 所以我
  • 将轮分解添加到不定筛

    我正在修改埃拉托色尼的不定筛here https stackoverflow com a 10733621因此 它使用轮分解来跳过比当前仅检查所有赔率的形式更多的组合 我已经弄清楚了如何生成到达轮子上所有间隙所需的步骤 从那里我想我可以用
  • Azure DevOps 扩展中的节点密码警告 - 发布任务

    我正在开展一个开发 Azure DevOps 发布任务扩展的项目 最近 当发布任务运行时 我在日志中多次打印此警告消息 警告 使用 Cipheriv 作为 aes 256 ctr 的计数器模式 我没有更早得到它 当我开始收到此错误时 我只更
  • C 到 MIPS - 函数和数组

    我正在尝试将以下 C 代码转换为 MIPS 程序集 数组的基地址存储在 a0中 变量索引存储在 a1中 变量 x 存储在 t0 中 void ld array char array int index x array index 当索引是一
  • 如何通过 Grails 使用 imgscalr

    我最近几天才开始使用 Groovy 和 Grails 我之前没有任何 Java 经验 所以您必须原谅这个 可能 非常基本的问题 我搜索了 Google 和 Stack Overflow 但没有找到任何可以帮助我实际安装的内容 我已经可以上传
  • Elasticsearch 通过另一个文档查找文档

    我想在elasticsearch中搜索与id docId给定文档具有完全相同字段的文档 例如用户使用 docId 调用 api 我想过滤文档 以便返回的所有文档都满足 docId 中的某些参数 例如 我可以像这样查询 Elasticsear
  • TypeScript“保存时编译”功能在 Visual Studio 2015 中不起作用

    升级到 Visual Studio 2015 后 保存时编译 功能对我不起作用 当我对 ts将文件添加到我的项目中并保存 IDE 底部的状态栏显示Output s generated successfully 但是生成的 js文件没有改变
  • Linux/C下判断两个文件路径是否指向同一个文件?

    在Linux下 我有两个文件路径A和B const char A const char B 我现在想确定 我是否应该open 2 他们俩 int fda open A int fdb open B 我会在文件系统中打开同一个文件的两个文件句
  • Asp.Net Mvc 3 客户端验证、属性生成

    Asp net Mvc3 在输入元素上添加了一些自定义属性 例如 data val required 以执行验证 我知道这背后的所有理论 以及它是如何运作的 我想知道的是 当我在 using Html BeginForm 中创建表单时 它会
  • 如何使用seaborn为我的DataFrame创建堆积条形图[重复]

    这个问题在这里已经有答案了 我有一个数据框df df pd DataFrame columns App Feature1 Feature2 Feature3 Feature4 Feature5 Feature6 Feature7 Featu
  • 如何解析非结构化表状数据?

    我有一个text file保存操作的一些结果 数据显示在human readable format 就像一张桌子 我如何解析这些数据 以便形成一个数据结构 例如dictionaries有了这个数据 的一个例子unstructured dat
  • 获取所有不到一个月的物品

    有没有办法在 Django 中获取日期小于一个月前的所有对象 就像是 items Item objects filter less than a month old order by 你对 月 的定义是什么 30天 31天 除此之外 这应该
  • 如何将参数值传递给 a4j:jsFunction

    在我的页面上有一个按钮 可以在弹出窗口中打开项目列表 当我在列表中选择一个项目时 我想将该项目的 id 传递给我的第一页的 backingbean 是否可以 它尝试这样做a4j jsFunction and a4j param但它不起作用
  • 如何在 php 中创建可编辑的 Pdf 表单

    我有一个简单的表单 我想使用 php 使其可以在 pdf 中编辑 但是 pdf 正在创建表单 但我无法编辑和提交它 有什么原因或者我无法使用 php 编辑 pdf 我的代码是
  • 从 Firebase 数据库检索特定数据

    我正在使用 Firebase 数据库和 Java 在 Android 上创建一个聊天应用程序 每当用户首次注册时 它会将其用户名存储到节点下的数据库中user UserID profile username 用户名使用 User 类存储 这
  • 包含 iframe 中的 iframe 的目标父 div

    所以基本上我有这样的东西 div class iframe holder span span div gt div class iframe holder span span div gt div class iframe holder s
  • 为加权图生成邻接矩阵

    我正在尝试实施弗洛伊德 沃歇尔算法 http en wikipedia org wiki Floyd E2 80 93Warshall algorithm 为此 我需要设置一个adjacency matrix的加权图 我该怎么做呢 我知道这
  • 如何在没有 DOTALL 的情况下匹配任何内容 (DOTALL)?

    我的正则表达式需要默认的非换行符匹配点和re DOTALL dot 匹配换行符 我需要前几个 只是one后者在单个正则表达式中 尽管如此 因为我需要一个点来匹配换行符 所以我必须使用DOTALL 并使用 n 多次以获得默认的 除换行符之外的
  • 以编程方式隐藏和显示 WKInterfaceGroup

    我正在使用 xCode 6 2 beta 2 并尝试以编程方式隐藏和显示组 但没有显示我可以编写的方法group hidden YES or group hidden NO还有其他方法可以做到同样的事情吗 是的 WKInterfaceGro
  • 如何减慢从BVH文件读取opengl动画的速度?

    使用 GLFW3 我目前制作了一个 bvh 文件解析器 它读取文件并将其转换为我在 opengl 中制作的人体模型 然而 每当我启动它时 移动速度太快 以至于眼睛看不到动画 所以我想把动画速度调低一点 这是我的渲染循环 while glfw