首页 > 解决方案 > opengl更新模型位置,而相机位置未及时更新导致闪烁(模型飞出视野)

问题描述

我渲染了一个有地球和卫星的场景。卫星的位置由线程收集和更新。位置数据由后台计算程序提供。

// main.cpp
void CollectCraft(void)
{
    SetupChannel();
    int iFlag = 1;
    while(iFlag > 0)
    {
        iFlag = CollectData();
        Sleep(10);
    }
    CloseChannel();
}

int main(void)
{
    CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)CollectCraft, 0, NULL, NULL); // in collect.cpp
    RenderMainWindow(); // in render.cpp
    return 1;
}

CollectCraft函数从后台程序接收数据。一旦它接收到任何数据,它就会以双倍的形式存储

// collect.cpp
double Craft_R[3] = {0.0};
...
int CollectData(void)
{
    char chrMessage[255] = {0};
    int iFlag = CollectSocket(&sListen, &sServer, chrMessage);
    if (iFlag <= 0) return iFlag;
    else
    {
        unsigned char i = 0, j = 0;
        unsigned short usLength = 0;
        for ( i = 0; i < dimCraft; i++)
        {
            for (j=0; j<3; j++)
            {
                memcpy(&Craft_R[j], &chrMessage[usLength], 8);
                usLength += 8;
            }
        }
    }
    return iFlag;
}

我将相机固定在其中一颗卫星上(跟随它并盯着它)。它根据卫星的位置更新其位置和视图矩阵。

卫星根据最新接收到的数据更新了它的位置(我只是通过 extern double 得到它Craft_R)。

// render.cpp
extern double Craft_R[3]; // directly get latest satellite position data
...
RenderMainWindow()
{
    ...
    while (!glfwWindowShouldClose(MainWindow))
    {
        glm::dmat4 view = camera.GetViewMatrix();
        ...
        Sate1Pos = glm::dvec3(Craft_R[0], Craft_R[1], Craft_R[2]); // update satellite position
        glm::dmat4 model_sate1(1.0);
        model_sate1 = glm::translate(model_sate1, Sate1Pos);
        ...
        switch (CameraPosID)
        {
        case 0:
            camera.Focus(EarthPos);
            break;
        case 1:
            camera.Focus(Sate1Pos); // update camera position
        }
        glfwSwapBuffers(MainWindow);
        glfwPollEvents();
    }
}

问题是,最新卫星位置数据的收集总是发生在相机位置更新和卫星位置更新之间这意味着我的卫星飞到了最新位置,但我的相机仍然停留在最后一个位置。之后glfwSwapBuffers(),下一个while (!glfwWindowShouldClose(MainWindow))将把卫星渲染到远离相机视野的地方。它将持续到下一个while相机更新其位置并使卫星返回其视野的时间。

如果后台程序不断发送卫星位置,场景将呈现为卫星闪烁。如果后台程序停止发送卫星位置,则一切正常且稳定。如果我控制后台程序发送一次卫星位置,场景中的卫星会闪烁一次,然后保持稳定。

我的问题是是否有办法同时更新相机和卫星的位置?非常感谢并为我糟糕的英语感到抱歉,因为它不是我的母语。

标签: openglmodelpositionrefreshblink

解决方案


推荐阅读