Нахождение ближайших координат на местности OpenGL

Я делаю игру в OpenGL с C ++. У меня есть местность с холмами и тому подобным, и я хочу, чтобы персонаж мог ходить вверх и вниз по холму. Для этого я сделал функцию, которая пытается найти ближайшие координаты и вернуть соответствующие координаты y, но она не работает, мой персонаж просто остается на той же высоте. Вот моя функция:

float ViewPort::comparePosition(float xPos, float zPos) {
int closestValSoFar = 0;

for (int unit = 0; unit < sizeof(desert_scene_plainVerts)/sizeof(desert_scene_plainVerts[0]); unit++){
int xDifference = terrainxPos[unit] - xPos;
int zDifference = terrainzPos[unit] - zPos;
int combinedDifferece = xDifference + zDifference;

if (unit == 0) {
closestValSoFar = unit;
}
if (combinedDifferece < (terrainxPos[unit-1] - xPos) + (terrainzPos[unit-1] - zPos)) {
closestValSoFar = unit - 1;
}
else {
closestValSoFar = unit;
}
if ((unit - 1) < sizeof(desert_scene_plainVerts)/sizeof(desert_scene_plainVerts[0])) {
return terrainyPos[closestValSoFar];
}

}

return terrainyPos[closestValSoFar];

}

Я звоню это и использую это с этим кодом:

float yPos = ViewPort::comparePosition(Camera::position.x, Camera::position.z);
Camera::position.y = yPos+1.65;

Кто-нибудь знает, как я могу исправить свой код?

-1

Решение

Если я вас правильно понял, вы пытаетесь выполнить захват ландшафта, сравнивая положение объекта и высоту ландшафта в данной позиции; но самый распространенный способ сделать это — выполнить приведение лучей от позиции объекта к местности. Затем вы проверяете, пересекает ли луч местность и где это происходит.

Но сделать игру из openGL действительно сложно, почему бы вам не попробовать 3d движок, такой как OGRE?

0

Другие решения

Если вы планируете сделать это так, как мне нравится этот простой метод, я бы просто немного переписал функцию. Честно говоря, я думаю, что ваш метод может быть упрощен немного больше.

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

float ViewPort::comparePosition(float xPos, float zPos) {
int closestValSoFar = 0;

for (int unit = 0; unit < sizeof(desert_scene_plainVerts)/sizeof(desert_scene_plainVerts[0]); unit++){
int xDifference = terrainxPos[unit] - xPos;
int zDifference = terrainzPos[unit] - zPos;
int combinedDifferece = sqrt(xDifference*xDifference + zDifference*zDifference);

if (unit == 0) {
closestValSoFar = unit;
}
else if (combinedDifferece < closesValSoFar) {
closestValSoFar = combinedDifference;
}

}

return terrainyPos[closestValSoFar];

}

Честно говоря, мне действительно понравился этот старый код, и это практически то же самое, я просто проверил, меньше ли новое расстояние, чем closestValSoFar, а не вершина ранее. Надеюсь, это поможет!

Я ценю ваше стремление сделать игру с простым OpenGL, так как я тоже отрицаю движки (по какой причине я не знаю, я просто нахожу их скучными. Я не художник, я программист, и движки увлекаются художники и упрощающие вещи)! Я хотел бы увидеть ваш готовый продукт, звучит круто!

0

По вопросам рекламы [email protected]