与AI协作开发3d应用
提示词:
{
"template_name": "Software_Development_Prompt_V1",
"request_id": "DEV-2025-01-001",
"developer_role": "高级 godot游戏开发 工程师",
"project_context": {
"project_name": "3D水上交通事故模拟",
"technology_stack": [
"godot",
"GDscript",
"sqlite",
"python"
],
"goals": "开发一个使用godot游戏引擎的3d水上交通事故模拟应用"
},
"primary_task": "请实现一个3D的模拟内河船舶航行的实时渲染动画应用",
"technical_requirements": [
"可以使用用户指定的不同的船舶模型",
"具有真实感的水面shader",
"船舶模型按照给定的AIS经纬度序列所描述的轨迹在水面上航行",
"AIS经纬度序列从sqlite数据库文件中读取"
],
"expected_output_format": {
"format_type": "markdown",
"content_structure": [
"1. 简要的实现思路说明(Markdown 文本)",
"2. 详细的godot操作步骤(用户是初学者,不要遗漏或跳过任何步骤)",
"2. 完整的 GDScript 代码块"
],
"explanation_required": true
},
"constraints": {
"max_length_lines": 200,
"language": "中文"
}
}
claude 4.5的方案:
3D水上交通事故模拟应用开发指南
- 实现思路说明
本项目将创建一个基于Godot的3D船舶航行模拟应用,主要包含以下核心组件:
- 3D场景搭建:创建水面环境和船舶模型
- 水面渲染:使用Shader实现真实感水面效果
- 数据读取:通过GDScript连接SQLite数据库获取AIS轨迹数据
- 轨迹动画:根据经纬度坐标序列控制船舶移动
- 详细的Godot操作步骤
步骤1:创建新项目 - 打开Godot引擎
- 点击"新建项目"
- 选择项目路径,命名为"ShipSimulation"
- 点击"创建并编辑"
步骤2:设置3D场景结构 - 在场景面板中,点击"添加节点"
- 选择"Node3D"作为根节点,重命名为"Main"
- 右键点击"Main",添加子节点:
- 添加"MeshInstance3D"节点,重命名为"WaterSurface"
- 添加"MeshInstance3D"节点,重命名为"Ship"
- 添加"Camera3D"节点
- 添加"DirectionalLight3D"节点
步骤3:创建水面
- 选择"WaterSurface"节点
- 在检查器中,点击"Mesh"旁的下拉箭头
- 选择"新建PlaneMesh"
- 设置PlaneMesh参数:
- Size: X=100, Z=100
- Subdivide Width: 50
- Subdivide Depth: 50
步骤4:创建水面Shader
- 在"WaterSurface"节点的Material中,点击"新建ShaderMaterial"
- 在ShaderMaterial中,点击"新建Shader"
- 双击Shader进入编辑器,输入以下代码:
shader_type canvas_item;
varying vec2 world_position;
uniform float wave_speed : hint_range(0.0, 10.0) = 2.0;
uniform float wave_height : hint_range(0.0, 2.0) = 0.5;
uniform vec4 water_color : hint_color = vec4(0.1, 0.3, 0.8, 0.8);
void vertex() {
world_position = VERTEX;
}
void fragment() {
vec2 uv = world_position * 0.1;
float wave = sin(uv.x + TIME * wave_speed) * cos(uv.y + TIME * wave_speed * 0.5);
COLOR = water_color + vec4(wave * 0.1, wave * 0.1, wave * 0.2, 0.0);
}
步骤5:设置船舶模型 - 选择"Ship"节点
- 在Mesh中选择"新建BoxMesh"(临时使用,后续可替换为船舶模型)
- 设置BoxMesh大小为(2, 1, 6)
步骤6:配置摄像机 - 选择"Camera3D"节点
- 设置Position为(0, 10, 10)
- 设置Rotation为(-30, 0, 0)
步骤7:创建主控制脚本 - 右键点击"Main"节点
- 选择"附加脚本"
- 保持默认设置,点击"创建"
- 完整的GDScript代码
extends Node3D
船舶节点引用
@onready var ship = $Ship
@onready var water_surface = $WaterSurface
AIS数据相关
var ais_data = []
var current_waypoint = 0
var ship_speed = 5.0 # 船舶移动速度
var is_moving = false
数据库连接(需要安装SQLite插件)
var db_path = "res://ais_data.db"
func _ready():
初始化场景
setup_scene()
加载AIS数据
load_ais_data()
开始船舶移动
start_ship_movement()
func setup_scene():
设置水面材质动画
var water_material = water_surface.get_surface_override_material(0)
if water_material:
可以在这里添加水面动画逻辑
pass
func load_ais_data():
模拟从SQLite数据库读取AIS数据
实际项目中需要使用SQLite插件
ais_data = [
{"lat": 31.2304, "lon": 121.4737, "timestamp": "2024-01-01 10:00:00"},
{"lat": 31.2354, "lon": 121.4787, "timestamp": "2024-01-01 10:05:00"},
{"lat": 31.2404, "lon": 121.4837, "timestamp": "2024-01-01 10:10:00"},
{"lat": 31.2454, "lon": 121.4887, "timestamp": "2024-01-01 10:15:00"},
{"lat": 31.2504, "lon": 121.4937, "timestamp": "2024-01-01 10:20:00"}
]
print("加载了 ", ais_data.size(), " 个AIS数据点")
func start_ship_movement():
if ais_data.size() > 0:
is_moving = true
move_to_next_waypoint()
func move_to_next_waypoint():
if current_waypoint >= ais_data.size():
print("船舶已到达终点")
is_moving = false
return
var target_pos = convert_gps_to_world(
ais_data[current_waypoint]["lat"],
ais_data[current_waypoint]["lon"]
)
使用Tween实现平滑移动
var tween = create_tween()
var current_pos = ship.global_position
var distance = current_pos.distance_to(target_pos)
var duration = distance / ship_speed
tween.tween_property(ship, "global_position", target_pos, duration)
tween.tween_callback(on_waypoint_reached)
func on_waypoint_reached():
current_waypoint += 1
if is_moving:
move_to_next_waypoint()
func convert_gps_to_world(lat: float, lon: float) -> Vector3:
简化的GPS坐标转换为世界坐标
实际项目中需要更精确的地理坐标转换
var base_lat = 31.2304
var base_lon = 121.4737
var x = (lon - base_lon) * 111320.0 * cos(deg_to_rad(lat)) * 0.01
var z = (lat - base_lat) * 110540.0 * 0.01
return Vector3(x, 0.5, z) # Y=0.5 让船舶稍微浮在水面上
func _input(event):
添加用户交互控制
if event.is_action_pressed("ui_accept"): # 空格键
if is_moving:
is_moving = false
print("暂停船舶移动")
else:
is_moving = true
move_to_next_waypoint()
print("恢复船舶移动")
可选:添加实时数据库读取功能
func load_ais_from_database():
这里需要使用SQLite插件
示例SQL查询:SELECT lat, lon, timestamp FROM ais_data ORDER BY timestamp
pass
可选:更换船舶模型
func change_ship_model(model_path: String):
var new_mesh = load(model_path)
if new_mesh:
ship.mesh = new_mesh
print("船舶模型已更换为: ", model_path)
步骤8:保存和测试
- 按Ctrl+S保存场景为"Main.tscn"
- 在项目设置中将"Main.tscn"设为主场景
- 按F5运行项目测试
注意事项:
- 需要安装SQLite插件来实现数据库连接功能
- 可以通过AssetLib导入更真实的船舶3D模型
- 水面Shader可以进一步优化以获得更好的视觉效果
- GPS坐标转换算法需要根据实际地理位置进行调整
这个基础框架提供了船舶模拟的核心功能,可以根据具体需求进行扩展和优化。
Upvoted! Thank you for supporting witness @jswit.