0
Administrator
#1
前言
这是一个非常老的玩意了,由MTA社区的一位大佬CrystalMV所开发,但是可惜的是,对于内部的文件结构描述,作者并没有做过详细的描述,交通地图文件又是二进制的,所以从直观上来看并没有那么好入手。
在此我挖了下这座屎山的源码,稍微吧它的文件结构做一下文档,以方便后人填坑(如果有)
由于原帖我是直接发布在MTA官方论坛上的,所以再次我就不在图片上直接翻译了,我会把翻译附在下面描述。
变量
[图: attachment.php?aid=1]
交通地图文件结构
[图: attachment.php?aid=2]
Node Block (节点路径)
  • X float (4 字节), 除以1000获取实际坐标
  • Y float (4 字节), 除以1000获取实际坐标
  • Z float (4 字节), 除以1000获取实际坐标
  • RX float (4 字节), 除以1000获取实际坐标
  • RY float (4 字节), 除以1000获取实际坐标
  • RZ float (4 字节), 除以1000获取实际坐标
Connection Block (连通路径)
  • Start int (4 字节) 起点节点ID
  • End int (4字节) 终点节点ID
  • Bend int(4字节) 拐点ID (用于平滑载具过弯)
  • TrafficType unsigned integer (1 字节) 交通路径类型 (1: 行人, 2: 车辆, 3: 船, 4: 飞机)
  • Lights unsigned shorts(2 字节) 路径的朝向, (1: “南北”, 2: “东西” 3: “无方向” (全交通灯红灯,只允许行人过,类似步行街)
  • Speed unsigned integer (1 字节) 速度,用来限制该路径交通能通过的最大速度。
  • LeftLanes 左行道数
  • RightLanes 右行道数
  • Density  密度,用来控制该路径生成的最大交通密度
ForbbidenTurns 禁止通行(控制禁止右行/左行)
  • C1 int (4 字节) 起始节点ID
  • C2 int (4 字节) 终点节点ID
使用例:

输出
 
function testGenerateTrafficFile() 
    local nodes_block = {
        {0,0,10,0,0},
        {5,5,10,0,0},
        {10,10,10,0,0},
    }

    local connection_block = {
        {1,2,-1,2,1+1*4,50,1,1,1000}
    }

    local forbidden_block = {}
    -- write header
    local f = fileCreate("testpath")
    fileWrite(f,dataToBytes("3i",#nodes_block,#connection_block,#forbidden_block))

    -- write nodes
    for node_index,node in ipairs(nodes_block) do 
        local x,y,z,rx,ry = unpack(node)
        x,y,z = math.floor(x*1000),math.floor(y*1000),math.floor(z*1000)
 rx,ry = math.floor(rx*1000),math.floor(ry*1000)
        fileWrite(f,dataToBytes("3i2s",x,y,z,rx,ry))

    end
 
    -- write connections
    for node_index,conn in ipairs(connection_block) do 
        local n1,n2,nb,trtype,lights,speed,ll,rl,density = unpack(conn)
        fileWrite(f,dataToBytes("3i2ubus2ubus",n1,n2,nb,trtype,lights,speed,ll,rl,density))
        iprint(conn)

    end


    fileClose(f)
    print("path wroted")
end



附件 缩略图
       
回复



论坛跳转:


正在浏览该主题的用户:
1 个游客