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

3D跑道进近线段转2D原点测量飞行器偏离的可行性与实现

可行,以下是低成本实现方案

核心思路

将3D进近线段转化为局部坐标系:以线段为中心轴(1D进度轴),构建垂直于线段的二维平面(对应左右/上下偏移)。把飞行器坐标投影到这个局部系中,就能直接得到相对线段的偏移方向和距离,计算量远低于复杂的坐标变换,完全适配你的需求。

分步实现(Lua代码)

1. 向量辅助函数(基础运算)

因为Lua没有内置向量类型,先实现几个极简的向量运算函数,都是O(1)计算:

-- 向量减法:a - b
local function vec_sub(a, b)
    return {x = a.x - b.x, y = a.y - b.y, z = a.z - b.z}
end

-- 向量点积
local function vec_dot(a, b)
    return a.x*b.x + a.y*b.y + a.z*b.z
end

-- 向量叉积
local function vec_cross(a, b)
    return {
        x = a.y*b.z - a.z*b.y,
        y = a.z*b.x - a.x*b.z,
        z = a.x*b.y - a.y*b.x
    }
end

-- 向量长度
local function vec_length(v)
    return math.sqrt(v.x*v.x + v.y*v.y + v.z*v.z)
end

-- 向量归一化(转为单位向量)
local function vec_normalize(v)
    local len = vec_length(v)
    if len < 1e-6 then return {x=0,y=0,z=0} end -- 避免除零
    return {x = v.x/len, y = v.y/len, z = v.z/len}
end

2. 核心偏移计算函数

构建局部坐标系,分解飞行器位置得到偏移量:

function calculate_approach_offset(line_start, line_end, aircraft_pos)
    -- 步骤1:构建局部坐标系的三个正交轴
    local dir = vec_normalize(vec_sub(line_end, line_start)) -- 进近路径方向轴(单位向量)
    
    -- 选择初始参考上方向,避免与路径方向平行(比如路径是竖直向下时,不用y轴)
    local initial_up = {x=0, y=1, z=0}
    if math.abs(vec_dot(dir, initial_up)) > 0.99 then
        initial_up = {x=1, y=0, z=0}
    end
    
    -- 计算左右轴:与路径方向、初始上方向都垂直
    local right = vec_normalize(vec_cross(dir, initial_up))
    -- 修正上方向:确保与路径方向、左右轴严格正交
    local up = vec_normalize(vec_cross(right, dir))

    -- 步骤2:计算飞行器相对于路径起点的向量
    local aircraft_vec = vec_sub(aircraft_pos, line_start)

    -- 步骤3:分解向量到局部轴,得到结果
    return {
        progress = vec_dot(aircraft_vec, dir), -- 沿路径的进度(正=向终点前进,负=未到起点)
        offset_right = vec_dot(aircraft_vec, right), -- 左右偏移(正=偏右,负=偏左)
        offset_up = vec_dot(aircraft_vec, up) -- 上下偏移(正=偏高,负=偏低)
    }
end

3. 偏移判断与提示逻辑

根据设定的阈值,触发对应提示:

-- 示例参数:路径起点、终点、当前飞行器位置
local approach_start = {x=0, y=150, z=0}
local approach_end = {x=0, y=0, z=1200}
local plane_pos = {x=7, y=160, z=600}

-- 获取偏移信息
local offset_data = calculate_approach_offset(approach_start, approach_end, plane_pos)

-- 设定偏移阈值(单位:米,可根据需求调整)
local RIGHT_THRESHOLD = 6
local UP_THRESHOLD = 10

-- 左右偏移判断
if math.abs(offset_data.offset_right) > RIGHT_THRESHOLD then
    if offset_data.offset_right > 0 then
        print("提示:飞行器偏右,向左调整")
    else
        print("提示:飞行器偏左,向右调整")
    end
end

-- 上下偏移判断
if math.abs(offset_data.offset_up) > UP_THRESHOLD then
    if offset_data.offset_up > 0 then
        print("提示:飞行器过高,降低高度")
    else
        print("提示:飞行器过低,提升高度")
    end
end

方案优势

  • 计算成本极低:所有运算都是基础算术,没有复杂矩阵变换,适合游戏实时帧更新场景
  • 方向明确:直接输出左右/上下的偏移方向和具体数值,解决了「最近点距离无法判断方向」的问题
  • 适配任意路径:自动处理水平、竖直、倾斜的进近路径,不存在轴固定的适配问题

内容的提问来源于stack exchange,提问作者Wetter42

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 12:43:23