Я делаю игру в 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;
Кто-нибудь знает, как я могу исправить свой код?
Если я вас правильно понял, вы пытаетесь выполнить захват ландшафта, сравнивая положение объекта и высоту ландшафта в данной позиции; но самый распространенный способ сделать это — выполнить приведение лучей от позиции объекта к местности. Затем вы проверяете, пересекает ли луч местность и где это происходит.
Но сделать игру из openGL действительно сложно, почему бы вам не попробовать 3d движок, такой как OGRE?
Если вы планируете сделать это так, как мне нравится этот простой метод, я бы просто немного переписал функцию. Честно говоря, я думаю, что ваш метод может быть упрощен немного больше.
Я сделал несколько модификаций и разместил здесь. Я изменил добавление к теореме Пифагора для небольшого увеличения точности, но если это приводит к значительной потере производительности, я уверен, что старое добавление будет работать почти так же, как новый метод.
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, так как я тоже отрицаю движки (по какой причине я не знаю, я просто нахожу их скучными. Я не художник, я программист, и движки увлекаются художники и упрощающие вещи)! Я хотел бы увидеть ваш готовый продукт, звучит круто!