2013-12-24 2 views
-1

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

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; 

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

+0

У вас действительно странный способ использования 'sizeof' ... Если размер массива - это стек, тогда введите это вместо' sizeof' ... Если размер не статический, то 'sizeof' не является (дайте правильную длину). – Vallentin

+0

Но я думал, что длина была sizeof (verts)/sizeof (verts [0]) –

+0

Если размер вашего массива 'verts', является статическим, тогда да, который должен вернуть размер, но, как сказано, если ваш массив isn 't static, это даст вам проблемы. – Vallentin

ответ

0

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

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

+0

Вопросы как комментарии пожалуйста. Добро пожаловать в SO. –

+1

Не все вопросы должны быть комментарии. Этот вопрос - это еще один способ сказать: «Возможно, вы захотите рассмотреть этот другой способ сделать это», что является действительной (если не благоприятной) формой ответа. –

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

Приветствия за помощь и полностью согласны с вами в отношении двигателей, гораздо лучше попытаются сделать что-то сами, без двигателя. –

 Смежные вопросы

  • Нет связанных вопросов^_^