OpenGL - у движения камеры есть защелка, когда я перехожу из ячейки в другую

Привет всем, я разрабатываю игру OpenGL с использованием библиотек C++ и GLFW + GLEW. Я сгенерировал ландшафт из карты высот, и теперь я пытаюсь двигаться по ней, вычисляя высоту камеры (координату y) при каждом шаге, который я делаю. Моя карта разделена на треугольники, это пример изображения с GL_LINE, а затем режимом многоугольника GL_FILL введите описание изображения здесь

Я вычислил высоту, вычислив два вектора, которые переходят от вершины треугольника к другой, и затем я сделал перекрестное произведение, чтобы вычислить его нормальный вектор; Я получил свою координату y от нее, и она работает, но я заметил, что при перемещении моя высота не получает плавного изменения при переходе от треугольника к другому, и я не знаю почему, потому что при движении по тому же треугольнику y масштабируется Что ж.

Сейчас я покажу вам свой код с множеством возможных объяснений, а затем покажу пример запуска.

float Terrain::getCollisionHeight(float x, float z) {
    //lato is the side of my triangle and it seems to work when is 1.0f but not with other values, now I put it at 5.0f
    //x_pos and z_pos gives the triangle coordinates in the heightmap ( I THINK THE ERROR MIGHT BE IN THE FOLLOWING 2 LINES)
    float x_pos = (int)(x / lato);
    float z_pos = (int)(z / lato);

    cout << "x: " << (int)x << " - z: " << (int)z << endl;

    cout << "x pos: " << x_pos << " - z pos: " << z_pos << endl;
    cout << "I'm in triangle: " << x_pos << ", " << z_pos << endl;

    //i calculate _x and _z  to understand if I am in an upper triangle or lower triangle (my draw function draws two triangles at the time as a square)
    float _x = x - x_pos;
    float _z = z - z_pos;

    //then I calculate the coordinates of the two vectors: p(x,y,z) v1 is p1-p0 and v2 is p2-p1
    //I always get the height value from a height function that returns the corresponding value of the heightmap given x,z
    float x0, x1, x2, y0, y1, y2, z0, z1, z2;
    x0 = x_pos*lato;
    z0 = z_pos*lato;
    y0 = hm->getHeight(x_pos, z_pos);

    x2 = x0 + lato;
    z2 = z0 + lato;
    y2 = hm->getHeight(x_pos + 1, z_pos + 1);

    if (_x >= _z) {
        cout << "upper triangle" << endl;
        x1 = x0 + lato;
        z1 = z0;
        y1 = hm->getHeight(x_pos + 1, z_pos);
    } else {
        cout << "lower triangle" << endl;
        x1 = x0;
        z1 = z0 + lato;
        y1 = hm->getHeight(x_pos, z_pos + 1);
    }

    //i make the cross product and then I return the calculated y (height) value
    vec3 v = cross(vec3(x1 - x0, y1 - y0, z1 - z0), vec3(x2 - x1, y2 - y1, z2 - z1));
    float y =(-v[0] * x - v[2] * z + v[0] * x0 + v[1] * y0 + v[2] * z0) / v[1];
    cout << "p0: " << x0 << " " << y0 << " " << z0 << endl;
    cout << "p1: " << x1 << " " << y1 << " " << z1 << endl;
    cout << "p2: " << x2 << " " << y2 << " " << z2 << endl;

    cout << "PP:" << x << " " << y<< " " << z << endl;
    return y;

}

Теперь я покажу, насколько сильно меняется моя позиция при смене треугольника:

Это то же движение треугольника и у получает правильное значение введите описание изображения здесь

И это защелка, которую я получаю при переходе от треугольника к другому введите описание изображения здесь

Эта защелка высоко воспринимается во время игры. Что я могу сделать, чтобы это исправить? большое спасибо

Это видео проблемы, артефакты горизонта присутствуют из-за фрапс https://www.youtube.com/watch?v=CiRKVK89Fkk&feature=youtu.be

1 ответ

Решение

Я нашел хотя бы одну ошибку.

Это:

 float _x = x - x_pos;
 float _z = z - z_pos;

Должно быть так:

float _x = (x / lato) - x_pos;
float _z = (z / lato) - z_pos;

Вот почему это работает при lato = 1.

Другие вопросы по тегам