Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何降低从BVH文件读取opengl动画的速度?_C++_Opengl_Glfw_Glm Math_Skeletal Animation - Fatal编程技术网

C++ 如何降低从BVH文件读取opengl动画的速度?

C++ 如何降低从BVH文件读取opengl动画的速度?,c++,opengl,glfw,glm-math,skeletal-animation,C++,Opengl,Glfw,Glm Math,Skeletal Animation,使用GLFW3,我目前制作了一个bvh文件解析器,它在中读取文件并将其转换为我在opengl中制作的人体模型。但是,每当我启动它时,它的移动速度非常快,以至于眼睛看不到动画。所以我想把动画速度调低一点。这是我的渲染循环 while (!glfwWindowShouldClose(window)) { // per-frame time logic // -------------------- float currentFrame = gl

使用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
resetmatrix
是分别按下空格键和r按钮时设置的标志)


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

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

MOTION
Frames:     20
Frame Time: 0.033333
您应该提取
帧时间
值,即帧之间的时间(以秒为单位)。现在,根据您的代码体系结构,您需要正确调整渲染时间。我习惯吃一些

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

对于改变时间的东西,我通常也有一个功能:

void update(double dt);
从应用程序处理插值/模拟和填充周期性调用,从上次调用到
dt
经过的时间。现在,
dt
可以是调用此函数的计时器间隔,或者在需要更高精度的情况下,我直接使用windows
PerformanceCounter
测量
dt
。如果您刚刚得到了无止境的循环,您仍然可以使用:

Sleep(dt*1000.0);
这并不精确,但会起作用

有关动画和计时主题的更多信息,请参见此处和子链接:

现在回到BVH这里是我的C++更新方法的样子:

void bvh::update()//定期调用以设置动画
{
如果((播放)和&(dt>1e-6))
{ 
int f=帧;
t+=tper(&t0);
而(t>=dt)
{
t-=dt;
frame++;
如果(帧>=帧)
{
帧=0;
如果(!_循环){stop();break;}
}
}
如果(f!=帧)设置帧(帧);
}
}
以下是我的BVH课程中的一些精选内容:

列出根目录;//根骨ix
列出骨骼;//层次结构
列出数据;//运动数据
整数帧;//运动帧
双dt;//运动增量时间[ms]
int通道;//频道/帧
//渲染
bool_redraw;//需要重新绘制吗?
//动画
bool_loop;//循环播放?
播放、暂停、停止;//退出动画按钮状态?
int帧;//实际设定帧
双t,t0;//从实际帧开始经过的时间,测量开始时间
void play(){tper(&t0);t=0.0;如果(!\u pause)frame=0;\u play=1;\u pause=0;\u stop=0;setframe(frame);\u 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;如果(\u stop)返回;\u play=\u pause;\u pause=!\u pause;}
void setframe(int frame);//从帧数据计算骨骼
tper
函数测量从my timing lib执行的后续调用之间的时间:

const int performance\u max=64;//推平
双性能_Tms=-1.0,//计数器周期[ms]
性能_tms=0.0,//趋向后测量的时间[ms]
性能_t0[性能_最大值];//测量的开始时间[ms]
int performance_ix=-1;//实际时间堆栈索引
double-tper(double*t0=NULL)//在tper()调用之间返回持续时间[ms]
{
双t,tt;
大整数i;

if(performance_tms)你需要一个计时器,或者至少需要一个时差。请参阅《谢谢你,斯佩克特先生》中的一个例子!我就是那个问我如何在opengl中将bvh文件解析为给定模型的人。我在周末成功地制作了一个解析器:)谢谢你的最后建议!@皮特高兴地帮助你,很高兴知道你正在进步……在我把旧BVH类从~ 6 KB重新编码到~18KB的C++代码中,添加更精确的定时(代码在这里),一些网格计算和编辑器,如果拓扑允许的话,将单个对象分解成子网格。