Раньше у меня был проект, в котором использовалось изображение в оттенках серого, чтобы установить высоту вершин в простой плоской области me sh, что привело к хорошему виду ландшафта, отображаемого по высоте. Однако с тех пор я преобразовал свой проект в C ++ и больше не могу использовать помощь BufferedImage и т. Д., Чтобы использовать старый подход с использованием серой шкалы для создания рельефной местности из плоского me sh.
Из-за этот мой проект C ++ теперь использует файл .obj для ландшафта, но мне очень трудно обновлять высоту проигрывателя / камеры, когда пользователь ходит по местности, вместо этого я просто перемещаюсь по всему, поскольку высота игрока никогда не меняется или только делает это очень часто (поэтому я знаю, что высота, по крайней мере, обновляется, но не правильно).
Ниже приведен небольшой пример кода, который выполняет фактическое обновление высоты проигрывателя на основе файла terrain.obj. , он делает это, сохраняя все вершины файла .obj и сравнивая каждый из их компонентов x и z с компонентами x и z проигрывателя, и, если есть совпадение, тогда устанавливает значение y проигрывателя в текущие вершины. позиция y:
Vector3f *playerPos = freeMoveObjects[0]->GetParent()->GetTransform()->GetPos();
float playerXPos = playerPos->GetX();
float playerZPos = playerPos->GetZ();
int playerXPosInt = (int)playerXPos;
int playerZPosInt = (int)playerZPos;
for (Vector3f currentVector : meshObjects[0]->getMeshVertices()) {
int meshHeightXInt = (int)currentVector.GetX();
int meshHeightZInt = (int)currentVector.GetZ();
if (meshHeightXInt == playerXPosInt & meshHeightZInt == playerZPosInt){//currentVector.GetX() <= playerXPos & currentVector.GetZ() <= playerZPos) {
freeMoveObjects[0]->GetParent()->GetTransform()->GetPos()->SetY(currentVector.GetY());
}
}