Я визуализировал сцену с Землей и спутником. Положение спутника собирается и обновляется веткой. Данные о местоположении предоставляются программой расчета фона.
// 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
, пока камера не обновит свое положение и вернет спутник в поле зрения.
Если фоновая программа продолжает отправлять координаты спутника, сцена будет отображаться так, как если бы спутник мигает. И если фоновая программа перестает отправлять координаты спутника, все в порядке и стабильно. Если я управляю фоновой программой для отправки положения спутника один раз, спутник в сцене мигнет один раз, а затем останется стабильным.
Мой вопрос в том, есть ли способ одновременно обновить положение камеры и спутника? Большое спасибо и извините за мой бедный английский sh, так как это не мой родной язык.