如何获取3D倾斜表面上指定点的碰撞高度(Z值)?
解决Godot 2D引擎中伪3D倾斜表面的Z值计算问题
核心思路:利用平面方程反推Z值
倾斜表面本质是一个3D平面,只要通过其顶点计算出平面的数学方程,就能代入目标点的2D(X,Y)坐标,直接解出对应的Z高度。
具体实现步骤(GDScript)
- 计算平面法向量:取倾斜表面的任意三个不共线顶点(
v0,v1,v2,均为Vector3),通过向量叉乘得到平面的法向量(A,B,C):var edge1 = v1 - v0 var edge2 = v2 - v0 var normal = edge1.cross(edge2) var A = normal.x var B = normal.y var C = normal.z - 计算平面方程常数项D:代入其中一个顶点到平面一般式
Ax + By + Cz + D = 0,解出D:var D = -(A * v0.x + B * v0.y + C * v0.z) - 代入目标点求Z值:对于目标2D点
target_2d(Vector2,对应3D的X、Y坐标),代入平面方程解Z:# 避免除以0(平面垂直于XY平面的情况,类Doom场景中极少出现) if abs(C) < 0.0001: # 可根据需求返回默认值或抛出提示 return 0.0 var z = (-A * target_2d.x - B * target_2d.y - D) / C return z
封装成可复用函数
把上述逻辑封装成静态函数,方便在项目中调用:
static func get_sloped_surface_z(v0: Vector3, v1: Vector3, v2: Vector3, target_2d: Vector2) -> float: var edge1 = v1 - v0 var edge2 = v2 - v0 var normal = edge1.cross(edge2) var A = normal.x var B = normal.y var C = normal.z # 处理平面垂直于XY平面的极端情况 if abs(C) < 0.0001: push_warning("倾斜表面垂直于XY平面,无法计算Z值") return 0.0 var D = -(A * v0.x + B * v0.y + C * v0.z) return (-A * target_2d.x - B * target_2d.y - D) / C
注意事项
- 确保输入的三个顶点不共线,否则叉乘会得到零向量,无法计算平面方程。
- 若倾斜表面是四边形,可任意取其中三个不共线的顶点计算(类Doom伪3D中的倾斜面均为平面多边形)。
- 浮点运算时加入极小值判断(如
0.0001)避免除以零的错误。
内容的提问来源于stack exchange,提问作者weg
相关产品推荐
相关产品推荐

