opengl обновить положение модели, когда положение камеры не обновляется вовремя, вызывает мигание (модель вылетает из поля зрения) - PullRequest
0 голосов
/ 29 мая 2020

Я визуализировал сцену с Землей и спутником. Положение спутника собирается и обновляется веткой. Данные о местоположении предоставляются программой расчета фона.

// 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, так как это не мой родной язык.

...