You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取3D倾斜表面上指定点的碰撞高度(Z值)?

解决Godot 2D引擎中伪3D倾斜表面的Z值计算问题

核心思路:利用平面方程反推Z值

倾斜表面本质是一个3D平面,只要通过其顶点计算出平面的数学方程,就能代入目标点的2D(X,Y)坐标,直接解出对应的Z高度。

具体实现步骤(GDScript)

  1. 计算平面法向量:取倾斜表面的任意三个不共线顶点(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
    
  2. 计算平面方程常数项D:代入其中一个顶点到平面一般式Ax + By + Cz + D = 0,解出D:
    var D = -(A * v0.x + B * v0.y + C * v0.z)
    
  3. 代入目标点求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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 02:23:12