我正在使用C ++在OpenGL中制作游戏。我有一个山丘等地形,我希望这个角色能够在山上走来走去。要做到这一点,我已经创建了一个函数,试图找到最近的坐标并返回相应的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;
有人知道如何修复我的代码吗?
答案 0 :(得分:0)
如果我理解正确的话,你会尝试通过比较物体的位置和给定位置的地形高度来进行地形夹紧;但最常见的方法是从对象的位置到地形执行光线投射。然后检查光线是否截取地形及其发生的位置。
但是从openGL制作游戏真的很难,你为什么不尝试像OGRE这样的3D引擎?
答案 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];
}
老实说,我真的很喜欢这个旧代码,这几乎是一样的,我只是检查新距离是否小于nearestValSoFar而不是之前的顶点。我希望这有帮助!
我感谢你努力用简单的OpenGL制作游戏,因为我也拒绝引擎(出于什么原因我不知道,我发现它们很无聊。我不是艺术家,我是程序员,引擎是艺术家和简化的东西)!我很想看到你的成品,听起来很酷!