与AI协作开发3d应用

in STEEM CN/中文7 hours ago

提示词:
{
"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水上交通事故模拟应用开发指南

  1. 实现思路说明
    本项目将创建一个基于Godot的3D船舶航行模拟应用,主要包含以下核心组件:
  • 3D场景搭建:创建水面环境和船舶模型
  • 水面渲染:使用Shader实现真实感水面效果
  • 数据读取:通过GDScript连接SQLite数据库获取AIS轨迹数据
  • 轨迹动画:根据经纬度坐标序列控制船舶移动
  1. 详细的Godot操作步骤
    步骤1:创建新项目
  2. 打开Godot引擎
  3. 点击"新建项目"
  4. 选择项目路径,命名为"ShipSimulation"
  5. 点击"创建并编辑"
    步骤2:设置3D场景结构
  6. 在场景面板中,点击"添加节点"
  7. 选择"Node3D"作为根节点,重命名为"Main"
  8. 右键点击"Main",添加子节点:
  • 添加"MeshInstance3D"节点,重命名为"WaterSurface"
  • 添加"MeshInstance3D"节点,重命名为"Ship"
  • 添加"Camera3D"节点
  • 添加"DirectionalLight3D"节点
    步骤3:创建水面
  1. 选择"WaterSurface"节点
  2. 在检查器中,点击"Mesh"旁的下拉箭头
  3. 选择"新建PlaneMesh"
  4. 设置PlaneMesh参数:
  • Size: X=100, Z=100
  • Subdivide Width: 50
  • Subdivide Depth: 50
    步骤4:创建水面Shader
  1. 在"WaterSurface"节点的Material中,点击"新建ShaderMaterial"
  2. 在ShaderMaterial中,点击"新建Shader"
  3. 双击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:设置船舶模型
  4. 选择"Ship"节点
  5. 在Mesh中选择"新建BoxMesh"(临时使用,后续可替换为船舶模型)
  6. 设置BoxMesh大小为(2, 1, 6)
    步骤6:配置摄像机
  7. 选择"Camera3D"节点
  8. 设置Position为(0, 10, 10)
  9. 设置Rotation为(-30, 0, 0)
    步骤7:创建主控制脚本
  10. 右键点击"Main"节点
  11. 选择"附加脚本"
  12. 保持默认设置,点击"创建"
  13. 完整的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:保存和测试

  1. 按Ctrl+S保存场景为"Main.tscn"
  2. 在项目设置中将"Main.tscn"设为主场景
  3. 按F5运行项目测试
    注意事项:
  • 需要安装SQLite插件来实现数据库连接功能
  • 可以通过AssetLib导入更真实的船舶3D模型
  • 水面Shader可以进一步优化以获得更好的视觉效果
  • GPS坐标转换算法需要根据实际地理位置进行调整
    这个基础框架提供了船舶模拟的核心功能,可以根据具体需求进行扩展和优化。
Sort:  

Upvoted! Thank you for supporting witness @jswit.