gpt4 book ai didi

java - 平滑地形碰撞 - 3D

转载 作者:太空宇宙 更新时间:2023-11-04 14:29:48 26 4
gpt4 key购买 nike

我希望在我的游戏引擎中实现平滑的地形碰撞,当我说平滑时,我的意思是玩家的高度不是由一个顶点决定的。我相信重心坐标是正确的选择。我花了 7 个小时研究这个问题,但我见过的代码都没有真正起作用,也没有用简单的英语解释它。

这就是我到目前为止所拥有的一切。 :(

public float getHeightAt(float xPos, float zPos) {
Vector3f one = new Vector3f((float)xPos, ((float)new Color(heightMap.getRGB((int)xPos, (int)zPos)).getRed())/255f*exaggeration*scale, (float)zPos);
Vector3f two = new Vector3f((float)xPos+1, ((float)new Color(heightMap.getRGB((int)xPos+1, (int)zPos)).getRed())/255f*exaggeration*scale, (float)zPos);
Vector3f three = new Vector3f((float)xPos, ((float)new Color(heightMap.getRGB((int)xPos, (int)zPos+1)).getRed())/255f*exaggeration*scale, (float)zPos+1);

float height = mid(one, two, three, new Vector3f(xPos, 0f, zPos));
System.out.println(height);
return height + 0.25f;
}

private float mid(Vector3f a, Vector3f b, Vector3f c, Vector3f p) {
Vector3f AB = a.mul(b);
Vector3f BC = b.mul(c);

Vector3f norm = AB.cross(BC);
float n0 = norm.getX();
float n1 = norm.getY();
float n2 = norm.getZ();

return (n0*a.getX() + n1*a.getY() + n2*a.getZ() - n0*p.getX() - n2*p.getZ()) / n1;
}

它可以工作,但并不顺利,我什至不知道它是否是重心的。

这是我想要的示例:https://www.youtube.com/watch?v=ngJ6ISfXG3I

最佳答案

要获得平滑高度,有两个主要步骤:

I - 创建一个函数来获取位置的高度

按照以下说明创建函数 public float getHeightAt(float xPos, float zPos):

  1. 检查摄像机/播放器是否在地面方 block 内

    if(xPos > 0 && xPos < nbVerticesX && zPos > 0 && zPos < nbVerticesZ) 
  2. 获取最接近xPoszPos的点P

  3. 获取正常的N或计算它

  4. 计算平面方程的常数d

    double d = -(P.x * N.x + P.y * N.y + P.z * N.z);
  5. 返回计算高度

    return -(d + N.z * zPos + N.x * xPos)/N.y;

II - 计算大致高度

使用此函数获取平滑后的高度:

public float getHeightApprox(float x, float z)
{
return ( (getHeightAt(x,z)
+ getHeightAt(x + 1, z)
+ getHeightAt(x - 1, z)
+ getHeightAt(x, z + 1)
+ getHeightAt(x, z - 1)) / 5);
}

也许您必须调整您的代码,但这些代码对我来说工作得很好。希望这对您有帮助。

关于java - 平滑地形碰撞 - 3D,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26273131/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com