当前位置: 首页 > article >正文

Godot游戏开发实战:如何用OpenStreetMap数据快速生成3D城市模型(附完整代码)

Godot游戏开发实战如何用OpenStreetMap数据快速生成3D城市模型附完整代码当独立游戏开发者想要构建一个真实的城市环境时手动建模往往耗时费力。而OpenStreetMapOSM这个开源地理数据库正成为越来越多开发者的秘密武器。本文将带你从零开始探索如何将OSM的二维地图数据转化为Godot引擎中可交互的3D城市模型。1. 理解OSM数据结构与获取方法OpenStreetMap的数据结构就像乐高积木由三种基本元素构成节点Nodes地图上的点用经纬度坐标定义路径Ways连接节点的线可形成道路或建筑轮廓关系Relations组合多个元素的容器如公交路线获取OSM数据最直接的方式是通过官网的导出功能# 示例通过Overpass API获取数据 wget -O city.osm https://overpass-api.de/api/map?bbox经度1,纬度1,经度2,纬度2提示bbox参数定义区域边界框按左下经度,左下纬度,右上经度,右上纬度格式填写2. 数据预处理从XML到Godot可读格式原始OSM数据是XML格式我们需要转换为更易处理的JSON。以下Python脚本完成转换import xml.etree.ElementTree as ET import json def osm_to_json(osm_file): tree ET.parse(osm_file) root tree.getroot() features [] for elem in root: if elem.tag in [node, way]: feature { type: elem.tag, id: elem.attrib[id], tags: {t.attrib[k]: t.attrib[v] for t in elem.findall(tag)} } if elem.tag node: feature.update({ lat: float(elem.attrib[lat]), lon: float(elem.attrib[lon]) }) else: # way feature[nodes] [nd.attrib[ref] for nd in elem.findall(nd)] features.append(feature) with open(city_data.json, w) as f: json.dump(features, f)3. Godot中的3D模型生成在Godot中创建新场景添加Spatial节点作为根节点。以下是生成建筑物的核心代码extends Spatial var building_height 10.0 # 默认建筑高度 var scale_factor 0.01 # 坐标缩放因子 func create_building(way_points, tags): var mesh_instance MeshInstance.new() var st SurfaceTool() st.begin(Mesh.PRIMITIVE_TRIANGLES) # 生成底面 var vertices [] for node_id in way_points: var node osm_data.get_node(node_id) var vertex Vector3( node.lon * scale_factor, 0, node.lat * scale_factor ) vertices.append(vertex) # 生成侧面和顶面 generate_walls(st, vertices) generate_roof(st, vertices) st.generate_normals() mesh_instance.mesh st.commit() mesh_instance.name tags.get(name, building_str(way_points[0])) add_child(mesh_instance) func generate_walls(st, vertices): # 生成建筑侧面代码... pass4. 道路网络生成技术道路生成与建筑类似但需要考虑宽度和连接点func create_road(way_points, tags): var road_width 5.0 match tags.get(highway): motorway: road_width 12.0 primary: road_width 8.0 secondary: road_width 6.0 var st SurfaceTool() st.begin(Mesh.PRIMITIVE_TRIANGLES) # 计算道路中心线 var centerline [] for node_id in way_points: var node osm_data.get_node(node_id) centerline.append(Vector3( node.lon * scale_factor, 0.1, # 略高于地面避免z-fighting node.lat * scale_factor )) # 生成道路网格 for i in range(centerline.size()-1): var dir (centerline[i1] - centerline[i]).normalized() var normal Vector3(-dir.z, 0, dir.x) var left1 centerline[i] normal * road_width/2 var right1 centerline[i] - normal * road_width/2 var left2 centerline[i1] normal * road_width/2 var right2 centerline[i1] - normal * road_width/2 # 添加两个三角形构成四边形 st.add_vertex(left1) st.add_vertex(right1) st.add_vertex(left2) st.add_vertex(right1) st.add_vertex(right2) st.add_vertex(left2) var mesh_instance MeshInstance.new() mesh_instance.mesh st.commit() add_child(mesh_instance)5. 性能优化技巧当处理大型城市数据时性能成为关键考量细节层次LOD系统var lod_distances [100, 300, 500] # 单位米 var lod_meshes [] func _process(delta): var cam_pos get_viewport().get_camera().global_transform.origin var dist global_transform.origin.distance_to(cam_pos) var lod_level 0 for i in range(lod_distances.size()): if dist lod_distances[i]: lod_level i1 mesh_instance.mesh lod_meshes[lod_level]空间分区与视锥剔除使用Godot的VisibilityNotifier节点将城市划分为网格区块实例化渲染var building_template preload(res://building.tscn) var multimesh MultiMesh.new() multimesh.instance_count 1000 multimesh.mesh building_template.mesh func add_building_instance(pos, rot, scale): var idx find_free_instance_index() var transform Transform(Basis(rot).scaled(scale), pos) multimesh.set_instance_transform(idx, transform)6. 材质与光照增强为提升视觉效果我们需要精心设计材质func _ready(): var building_material SpatialMaterial.new() building_material.albedo_color Color(0.8, 0.8, 0.8) building_material.metallic 0.2 building_material.roughness 0.7 building_material.uv1_scale Vector3(5, 5, 5) var road_material SpatialMaterial.new() road_material.albedo_color Color(0.3, 0.3, 0.3) road_material.roughness 0.9对于动态光照建议使用Godot 4.x的SDFGISigned Distance Field Global Illumination# 在WorldEnvironment节点中配置 environment.gi_mode Environment.GI_MODE_SDFGI environment.sdfgi_active true environment.sdfgi_cascades 47. 完整项目结构建议一个组织良好的Godot项目目录应包含res:// ├── assets/ │ ├── osm_data/ # 原始OSM数据 │ └── textures/ # 建筑纹理 ├── scripts/ │ ├── osm_parser.gd # 数据解析 │ ├── city_generator.gd # 主生成逻辑 │ └── utilities.gd # 辅助函数 ├── scenes/ │ ├── main.tscn # 主场景 │ └── building.tscn # 建筑模板 └── shaders/ # 自定义着色器在实现过程中我发现建筑高度处理是个常见痛点。OSM数据通常不包含高度信息但可以通过以下方式解决根据建筑层数标签估算building:levels标签×3米/层使用SRTM等高程数据补充对重要地标手动指定高度

相关文章:

Godot游戏开发实战:如何用OpenStreetMap数据快速生成3D城市模型(附完整代码)

Godot游戏开发实战:如何用OpenStreetMap数据快速生成3D城市模型(附完整代码) 当独立游戏开发者想要构建一个真实的城市环境时,手动建模往往耗时费力。而OpenStreetMap(OSM)这个开源地理数据库,正…...

中兴ZXR10-2950交换机VLAN配置实战:从创建到删除的完整流程

中兴ZXR10-2950交换机VLAN配置实战:从创建到删除的完整流程 在企业网络管理中,VLAN(虚拟局域网)技术是实现网络逻辑隔离、提升安全性和管理效率的核心手段。中兴ZXR10-2950作为一款经典的中端交换机,其VLAN配置逻辑清晰…...

立创开源:树莓派Zero/Zero W专用扩展坞硬件设计全解析(含SL2.1A HUB、SR9900A网卡、ETA9742充电)

立创开源:树莓派Zero/Zero W专用扩展坞硬件设计全解析 最近在捣鼓树莓派Zero这个小巧的开发板,发现它虽然体积小、功耗低,但接口也确实少得可怜,只有一个Micro USB口和一个Mini HDMI口。想接个键盘鼠标、U盘,再连个有线…...

告别多窗口直播:5步实现全平台同步推流的高效方案

告别多窗口直播:5步实现全平台同步推流的高效方案 【免费下载链接】obs-multi-rtmp OBS複数サイト同時配信プラグイン 项目地址: https://gitcode.com/gh_mirrors/ob/obs-multi-rtmp 多平台直播已成为内容创作者扩大影响力的必备策略,但同时管理多…...

Web渗透实战:冰蝎工具连接一句话木马完整指南(2024最新版)

Web渗透实战:冰蝎工具连接一句话木马完整指南(2024最新版) 深夜的渗透测试实验室里,显示器蓝光映照着技术文档和半杯冷掉的咖啡。作为一名专注Web安全的工程师,我深知在合法授权测试中,理解攻击者工具链的重…...

Unity模型管理神器:用预制体自动生成预览图的完整流程(含GitHub Demo)

Unity模型管理神器:用预制体自动生成预览图的完整流程(含GitHub Demo) 在游戏开发团队中,资源管理往往是最容易被忽视却又最影响效率的环节。想象一下这样的场景:美术同事刚更新了200个角色模型,你需要手动…...

GLM-4v-9b部署教程:支持LoRA微调接口,适配垂直领域视觉问答任务

GLM-4v-9b部署教程:支持LoRA微调接口,适配垂直领域视觉问答任务 1. 引言:为什么选择GLM-4v-9b? 如果你正在寻找一个既强大又实用的多模态AI模型,GLM-4v-9b绝对值得关注。这个模型有90亿参数,不仅能看懂图…...

TranslateGemma部署避坑指南:常见CUDA错误解决方法大全

TranslateGemma部署避坑指南:常见CUDA错误解决方法大全 1. 为什么你的TranslateGemma部署总在CUDA上栽跟头 你兴冲冲地下载了TranslateGemma镜像,准备体验企业级本地翻译的丝滑,结果一运行,屏幕上蹦出一堆看不懂的CUDA错误代码。…...

Phi-3-vision-128k-instruct部署案例:基于vLLM的轻量多模态模型镜像免配置实践

Phi-3-vision-128k-instruct部署案例:基于vLLM的轻量多模态模型镜像免配置实践 1. 模型简介 Phi-3-Vision-128K-Instruct是一个轻量级的多模态模型,属于Phi-3模型家族的最新成员。这个模型特别之处在于它同时支持文本和视觉数据的处理,并且…...

从内核到应用层:全面解析安卓系统中dmesg和logcat的工作原理与区别

从内核到应用层:全面解析安卓系统中dmesg和logcat的工作原理与区别 在安卓系统开发与调试过程中,日志工具如同开发者的"听诊器",能够精准定位系统运行时的各类问题。对于需要深入系统底层或优化应用性能的开发者而言,掌…...

SNMPv3配置避坑指南:如何用snmp4j实现企业级安全监控

SNMPv3配置避坑指南:如何用snmp4j实现企业级安全监控 在数字化转型浪潮中,网络设备监控已成为企业IT基础设施的"神经系统"。我曾亲眼目睹某金融企业因SNMPv2c协议漏洞导致交换机配置被恶意篡改,造成全网瘫痪6小时的重大事故。这促使…...

Qwen3-14B企业应用案例:用vLLM+Chainlit部署Qwen3-14b_int4_awq做客服话术生成

Qwen3-14B企业应用案例:用vLLMChainlit部署Qwen3-14b_int4_awq做客服话术生成 1. 项目背景与价值 在客服行业,高效的话术生成系统能显著提升服务质量和响应速度。传统人工编写话术存在效率低、一致性差等问题。本文将介绍如何利用Qwen3-14b_int4_awq模…...

RimSort:智能模组编排系统如何重构《边缘世界》玩家体验

RimSort:智能模组编排系统如何重构《边缘世界》玩家体验 【免费下载链接】RimSort 项目地址: https://gitcode.com/gh_mirrors/ri/RimSort 在《边缘世界》(RimWorld)的游玩生态中,模组管理长期以来是玩家体验的主要痛点。…...

丹青识画系统AI编程辅助工具:根据描述自动生成艺术鉴赏代码

丹青识画系统AI编程辅助工具:根据描述自动生成艺术鉴赏代码 最近在做一个艺术类数据分析的小项目,需要频繁调用图像分析API来处理画作。每次写调用代码、处理返回的JSON数据、再画图展示,一套流程下来,虽然不复杂,但重…...

Zotero Style插件:重构学术文献管理的效率引擎

Zotero Style插件:重构学术文献管理的效率引擎 【免费下载链接】zotero-style zotero-style - 一个 Zotero 插件,提供了一系列功能来增强 Zotero 的用户体验,如阅读进度可视化和标签管理,适合研究人员和学者。 项目地址: https:…...

黑丝空姐-造相Z-Turbo快速部署:5分钟搭建专属AI绘画服务

黑丝空姐-造相Z-Turbo快速部署:5分钟搭建专属AI绘画服务 1. 引言 想不想拥有一个能随时为你生成高质量“黑丝空姐”主题图片的AI助手?不用羡慕别人,也不用去排队等待在线服务,今天我就带你用5分钟时间,在自己的服务器…...

MedGemma 1.5效果实测:看AI如何一步步推理高血压病因

MedGemma 1.5效果实测:看AI如何一步步推理高血压病因 1. 引言:当AI成为你的私人医学顾问 想象一下,你拿到一份体检报告,上面写着“血压偏高”。你心里一紧,马上打开搜索引擎,输入“高血压怎么办&#xff…...

ServiceAccount 与 RBAC 的关系

什么是 ServiceAccount 与精细化的 RBAC 策略在 Kubernetes 里,很多人一开始会把注意力放在 Pod、Deployment、Service 这些资源上,觉得把应用跑起来就差不多了。可问题是,应用跑起来之后,如果它要去访问 Kubernetes API 呢&#…...

HI3516DV300的SDIO1接口实战:RTL8822BS WiFi模块移植避坑指南

HI3516DV300的SDIO1接口实战:RTL8822BS WiFi模块移植避坑指南 在嵌入式系统开发中,WiFi模块的集成往往是项目成功的关键因素之一。海思HI3516DV300作为一款广泛应用于智能摄像头领域的SoC,其SDIO1接口与RTL8822BS WiFi模块的配合使用&#xf…...

UPF实战指南:解锁芯片低功耗设计的自动化与验证核心

1. UPF:芯片低功耗设计的自动化基石 当你面对一个包含7个电压域、300多万个逻辑单元的芯片设计时,手动插入电源开关和电平转换器就像用绣花针建造摩天大楼——不仅效率低下,而且错误百出。这正是UPF(统一功耗格式)的价…...

Youtu-VL-4B-Instruct实战:手把手教你用图片做OCR文字识别

Youtu-VL-4B-Instruct实战:手把手教你用图片做OCR文字识别 1. 引言:为什么选择Youtu-VL做OCR? 在日常工作和生活中,我们经常遇到需要从图片中提取文字的场景:可能是扫描的文件、路牌标识、商品包装或是会议白板上的笔…...

ofa_image-caption实操手册:批量处理CSV图片路径列表并导出结构化Excel

ofa_image-caption实操手册:批量处理CSV图片路径列表并导出结构化Excel 1. 工具概述 今天给大家介绍一个特别实用的图像处理工具——ofa_image-caption,它能自动为你的图片生成英文描述,还支持批量处理,特别适合需要处理大量图片…...

Qwen3多模态内容创作:结合AIGC技术生成营销素材

Qwen3多模态内容创作:结合AIGC技术生成营销素材 每次看到那些制作精良的广告海报和短视频,你是不是也好奇,背后得有一个多么庞大的创意团队在支撑?从文案策划到视觉设计,再到视频脚本,每一个环节都耗时耗力…...

成本优化:CLIP-GmP-ViT-L-14模型推理的GPU显存与算力消耗分析

成本优化:CLIP-GmP-ViT-L-14模型推理的GPU显存与算力消耗分析 最近在帮一个朋友的项目做技术选型,他们想用视觉语言模型来处理大量的商品图片和描述,但预算有限,对云上GPU的成本特别敏感。他们看中了CLIP-GmP-ViT-L-14模型的效果…...

利用LiuJuan20260223Zimage进行技术文章创作:以CSDN博文为例

利用LiuJuan20260223Zimage进行技术文章创作:以CSDN博文为例 作为一名技术博主,最头疼的事情是什么?对我来说,不是技术本身有多难,而是“如何把我知道的,清晰、有趣、有结构地写出来”。从构思大纲、填充内…...

从零到一:基于Ollama与Qwen2.5-VL-7B构建企业级多模态AI应用

1. 为什么企业需要多模态AI? 想象一下这样的场景:电商平台的客服系统收到用户上传的商品图片,要求"找同款更便宜的"。传统AI只能处理文字,而多模态AI能同时理解图片和文字,准确识别商品特征并比价。这就是Qw…...

【老电脑焕新】华硕A456U升级全攻略(固态替换+光驱改造+系统重装与故障排除)

1. 华硕A456U升级前的准备工作 十年前的老伙计华硕A456U还能开机运行,但每次打开浏览器都要等上十几秒,任务管理器里CPU常年100%占用。这种情况我太熟悉了,很多老用户都遇到过类似的困扰。在决定给这台老机器动手术之前,我们需要做…...

Windows下Vivim环境搭建实战:causal_conv1d与mamba_ssm的避坑指南

1. Windows下Vivim环境搭建全攻略 最近在复现Vivim这个基于Mamba的医疗视频分割模型时,发现很多小伙伴在Windows环境下配置causal_conv1d和mamba_ssm这两个核心库时频频踩坑。作为一个在Windows平台折腾过无数次环境搭建的老司机,今天我就把实战中积累的…...

WeMod Pro功能解锁:面向游戏玩家的高效补丁技术实践指南

WeMod Pro功能解锁:面向游戏玩家的高效补丁技术实践指南 【免费下载链接】Wemod-Patcher WeMod patcher allows you to get some WeMod Pro features absolutely free 项目地址: https://gitcode.com/gh_mirrors/we/Wemod-Patcher 一、核心价值:为…...

神经形态芯片测试:模拟人脑突触的疲劳极限

神经形态芯片通过模拟生物神经元和突触的脉冲通信机制,实现低功耗、高并行的智能计算,但突触疲劳问题——即长期使用中突触连接性能的退化——直接影响芯片可靠性,尤其在边缘计算等实时场景中可能导致决策失误。 本文基于事件驱动模型&#x…...