opengl - 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
相机更新其位置并使卫星返回其视野的时间。
如果后台程序不断发送卫星位置,场景将呈现为卫星闪烁。如果后台程序停止发送卫星位置,则一切正常且稳定。如果我控制后台程序发送一次卫星位置,场景中的卫星会闪烁一次,然后保持稳定。
我的问题是是否有办法同时更新相机和卫星的位置?非常感谢并为我糟糕的英语感到抱歉,因为它不是我的母语。
解决方案
推荐阅读
- react-native - 与 store 中的数据不同步 react redux
- mariadb - 尝试使用 Inno Setup 使用默认用户和密码安装 MariaDB
- java - 如何在词法上检测 sql SELECT 查询?
- cesium - 有没有办法用我自己的方法覆盖渲染错误对话框
- php - 如何在 wordpress 中使用 Wp cron 修复 401 http 响应错误?
- c++ - WM_DRAWITEM 的图纸列表视图项目
- c++ - IMFSinkWriter WriteSample 方法性能不佳,RGB32 格式
- html - 如何制作带阴影的透明字母?
- python - pandas - 如何使用单元格中的数组
- python - 如何从图像集合到完整的机器学习数据集,然后我可以将其用于迁移学习(resnet50 等)?