Привет всем, я разрабатываю игру 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&Функция = youtu.be
Я нашел хотя бы одну ошибку.
Это:
float _x = x - x_pos;
float _z = z - z_pos;
Должно быть так:
float _x = (x / lato) - x_pos;
float _z = (z / lato) - z_pos;
Вот почему это работает на lato = 1.
Других решений пока нет …