Skip to content

Latest commit

 

History

28 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

building-3d

[TOC]

1. 概述

用户需求

    一款用于标注建筑物点云数据集的软件,其支持的核心功能有:

  • 点云流畅渲染

    • 千万数量级
  • 标准点云数据格式的导入与导出

    • .las,.ply
  • 标注信息导出

    • 线框,模型
  • 点云模型编辑

    • 点,线,面
  • 多视图便捷交互

    • 正交,透视

    • 平移,缩放,旋转

  • 多平台支持

编译环境

安装MSYS2

  • 从MSYS2官网下载安装包(推荐2024-11-16版本)。
  • 运行安装程序,选择默认路径(如 C:\msys64),完成安装。

安装Python及依赖

  • 在 MSYS2 MinGW 64-bit终端中安装Python和工具链:

    pacman -S mingw-w64-x86_64-python mingw-w64-x86_64-python-pip
  • 安装 PyGObject和 GTK 依赖:

    pacman -S mingw-w64-x86_64-gtk4 mingw-w64-x86_64-python-gobject

验证安装

  • 创建测试脚本 env_check.py:
import sys
import gi

gi.require_version("Gtk", "4.0")
from gi.repository import GLib, Gtk

class MyApplication(Gtk.Application):
    def __init__(self):
        super().__init__(application_id="com.example.MyGtkApplication")
        GLib.set_application_name('My Gtk Application')

    def do_activate(self):
        window = Gtk.ApplicationWindow(application=self, title="Hello World")
        window.present()

app = MyApplication()
exit_status = app.run(sys.argv)
sys.exit(exit_status)
  • 运行脚本:python test/env_check.py若弹出空白窗口,则环境配置成功。

  • 确保使用 MinGW 64-bit 终端运行Python脚本,而非MSYS终端。若需在VS Code等IDE中使用,需将MSYS2的MinGW路径(如 C:\msys64\mingw64\bin)添加到系统环境变量 PATH

发布

安装Pyinstller

pacman -S mingw-w64-x86_64-python-pyinstaller

打包程序

pyinstaller src/app.py --collect-all=gi --add-data "src/simtoy/data:simtoy/data" --add-data "c:/msys64/mingw64/lib/girepository-1.0:gi_typelibs" && cp -r ui dist/app && mkdir dist/app/algorithm

补全依赖库

strace python src/app.py | sed -n 's/.*\(C:\\msys64\\mingw64\\bin\\.*\.dll\).*/\1/p' | sed -n 's/\\/\//gp' | awk '{print "cp " $0 " dist/app/_internal"}' | bash

2. 工作计划

目标 任务 问题 备注
调研 跨平台发布 Windows
Linux
MAC
Building3D 文件 导入
导出
关闭
显示 法线
颜色
视图-切换 前/后/左/右/上/下
视图-控制 平移
旋转
缩放
操作 选择-点/线/面
放置-点/线/面
删除-点/线/面
挤出-点/线/面
连接-点
复制/粘贴-点/线/面
撤销/恢复
重命名
算法 降噪
重采样
特征匹配
深度学习 建筑物分割
建筑物重建
质量评估

3. 原型设计

现代布局风格

  • ​视觉风格​​:

    • ​扁平化设计​​:去除冗余装饰(如阴影、渐变),采用简洁的几何形状和高对比度色彩。

    • ​动态效果​​:微交互(如按钮点击动画)和过渡动画增强用户体验。

    • ​暗黑模式​​:提供低光环境下的舒适视觉体验。

  • ​布局管理​​:

    • ​响应式设计​​:自适应不同屏幕尺寸,优先考虑移动端操作(如触摸优化)。

    • ​模块化布局​​:卡片式设计或Bento风格(分块排列),提升信息可读性。

  • ​交互设计​​:

    • ​手势与语音控制​​:支持滑动、缩放等触控操作,或语音指令交互。

    • ​即时反馈​​:通过动画或状态提示快速响应用户操作。

传统布局风格

  • 视觉风格

    • ​拟物化设计​​:模仿真实物体质感(如立体按钮、纹理背景)。

    • ​平台原生感​​:遵循操作系统默认控件风格(如Windows窗口、macOS菜单栏)。

  • ​布局管理​​:

    • ​固定栅格系统​​:严格划分区域(如960px网页栅格),元素排列规整但灵活性低。
    • ​功能分区明确​​:工具栏、状态栏等区域划分清晰,适合复杂功能软件。
  • ​交互设计​​:

    • ​鼠标/键盘驱动​​:依赖点击、快捷键操作,交互路径固定。
    • ​静态反馈​​:通过文字提示或对话框确认操作结果。

4. 功能设计

菜单-文件-导入

sequenceDiagram
    participant 用户
    participant 界面
    participant 文件解析
    participant 渲染引擎

    用户->>界面: 点击"导入"按钮
    界面->>文件解析: 发送文件路径
    文件解析->>文件解析: 读取文件头信息
    文件解析->>文件解析: 解析点云数据
    文件解析->>渲染引擎: 传输点云数据
    渲染引擎->>渲染引擎: 创建场景对象
    渲染引擎->>界面: 返回渲染结果
    界面->>用户: 显示点云场景
Loading

菜单-文件-导出

sequenceDiagram
    participant 用户
    participant 界面层
    participant 业务逻辑
    participant 文件系统

    用户->>界面层: 点击导出按钮
    界面层->>业务逻辑: 触发导出命令(format=LAS/PLY)
    业务逻辑->>业务逻辑: 数据预处理(坐标转换/属性封装)
    业务逻辑->>文件系统: 创建目标文件(path="output.las")
    loop 分块写入
        业务逻辑->>文件系统: 写入点云数据块(chunk_size=1MB)
        文件系统-->>业务逻辑: 写入确认
    end
    业务逻辑->>界面层: 导出进度更新(percent)
    界面层->>用户: 显示完成提示
Loading

菜单-显示-法线

sequenceDiagram
    participant 用户
    participant 界面交互
    participant 面数据管理
    participant 法线计算
    participant 渲染引擎

    用户->>界面交互: 选择已标注的面(3个以上顶点)
    界面交互->>面数据管理: 获取顶点坐标列表
    面数据管理->>法线计算: 提交顶点数据[v1,v2,v3...]
    法线计算->>法线计算: 计算平面法向量(叉积法)
    alt 多边形面
        法线计算->>法线计算: 顶点排序(右手定则)
    end
    法线计算->>渲染引擎: 提交面中心点+法向量
    渲染引擎->>渲染引擎: 绘制法线(带箭头线段)
    渲染引擎-->>界面交互: 返回可视化结果
    界面交互-->>用户: 显示面法线(红色箭头)
Loading

菜单-显示-颜色

sequenceDiagram
    participant 用户
    participant 界面控制
    participant 颜色管理
    participant 渲染引擎
    participant GPU显存

    用户->>界面控制: 选择颜色模式(固定色/属性映射/纹理)
    界面控制->>颜色管理: 获取颜色配置参数
    alt 固定颜色模式
        颜色管理->>颜色管理: 生成统一RGB值(如#FF0000)
    else 属性映射模式
        颜色管理->>颜色管理: 创建颜色梯度映射表
    else 纹理贴图模式
        颜色管理->>颜色管理: 加载纹理图片
    end
    颜色管理->>渲染引擎: 提交颜色数据
    渲染引擎->>GPU显存: 上传顶点颜色属性
    GPU显存-->>渲染引擎: 确认数据就绪
    渲染引擎->>渲染引擎: 应用着色器程序
    渲染引擎-->>界面控制: 返回渲染结果
    界面控制-->>用户: 更新彩色点云显示
Loading

菜单-视图-切换-上下左右前后

sequenceDiagram
    participant 用户
    participant 视图控制
    participant 相机系统
    participant 渲染引擎

    用户->>视图控制: 点击视图切换按钮(如"前视图")
    视图控制->>相机系统: 请求视图参数(前/后/左/右/上/下)
    相机系统->>相机系统: 计算正交投影矩阵
    alt 标准正交视图
        相机系统->>相机系统: 设置相机位置(沿坐标轴方向)
        相机系统->>相机系统: 锁定旋转角度(0°/90°/180°)
    else 自定义视图
        相机系统->>相机系统: 保持当前投影比例
    end
    相机系统->>渲染引擎: 提交视图矩阵
    渲染引擎->>渲染引擎: 重绘场景
    渲染引擎-->>视图控制: 返回渲染结果
    视图控制-->>用户: 显示正交视图
Loading

技术要点说明

  1. 使用右手坐标系规范(Y轴向上,Z轴向前

  2. 正交投影不保留透视变形,适合精确对齐

  3. 建议保持1:1的投影比例(无拉伸)

  4. 可配合网格显示增强空间参考

该方案已在实际CAD软件中验证,如需添加视图过渡动画或更多自定义参数可进一步扩展。

菜单-视图-控制

sequenceDiagram 
    participant 用户
    participant 输入系统
    participant 相机控制
    participant 渲染引擎

    用户->>输入系统: 鼠标移动/滚轮事件
    输入系统->>相机控制: 传递鼠标参数(dx,dy,wheel)
    相机控制->>相机控制: 计算新相机参数
    alt 左键拖拽
        相机控制->>相机控制: 计算旋转量(绕X/Y轴)
    else 右键拖拽
        相机控制->>相机控制: 计算平移量(XY平面)
    else 中键滚轮
        相机控制->>相机控制: 计算缩放量(Z轴向)
    end
    相机控制->>渲染引擎: 更新视图矩阵
    渲染引擎->>渲染引擎: 重绘场景
    渲染引擎-->>用户: 显示新视角
Loading

技术要点说明

  1. ​坐标系转换​​:正确处理屏幕坐标到世界坐标的转换

  2. ​万向节锁避免​​:推荐使用四元数代替欧拉角存储旋转

  3. ​双击复位​​:可添加双击事件返回默认视角

  4. ​移动端适配​​:需要增加触摸手势识别逻辑

该方案支持第一人称/第三人称/正交三种相机模式切换,实际开发时可参考Three.js的OrbitControls实现。

操作-选择-点/线/面

sequenceDiagram
    participant 用户
    participant 输入系统
    participant 选择器
    participant 场景管理
    participant 渲染引擎

    用户->>输入系统: 按住鼠标左键拖动
    输入系统->>选择器: 传递屏幕坐标范围(x1,y1,x2,y2)
    选择器->>场景管理: 请求场景元素数据
    场景管理->>选择器: 返回可选集(点/线/面)
    选择器->>选择器: 执行空间检测
    alt 点选择模式
        选择器->>选择器: 射线检测+八叉树查询
    else 线选择模式
        选择器->>选择器: 线段相交测试
    else 面选择模式
        选择器->>选择器: 多边形包含检测
    end
    选择器->>渲染引擎: 提交高亮元素ID
    渲染引擎->>渲染引擎: 更新选择状态渲染
    渲染引擎-->>用户: 显示高亮选区
Loading

技术要点说明

  1. ​性能优化​​:对10万+元素场景建议采用GPU选择(如颜色拾取)
  2. ​撤销/重做​​:需要维护选择历史栈
  3. ​移动端适配​​:增加触摸选择手势识别
  4. ​多选逻辑​​:Shift键组合实现选择集累加

该方案支持与主流CAD软件(如AutoCAD)相似的选择交互体验,实际开发时可参考Three.js的SelectionBox实现。需要添加特定选择策略时可扩展SelectionPolicy接口。

操作-放置-点/线/面

sequenceDiagram
    participant 用户
    participant 输入系统
    participant 放置控制器
    participant 场景管理
    participant 渲染引擎

    用户->>输入系统: 选择放置模式(点/线/面)
    输入系统->>放置控制器: 激活对应放置模式
    放置控制器->>渲染引擎: 更新辅助线显示

    loop 放置过程
        用户->>输入系统: 鼠标移动/点击
        输入系统->>放置控制器: 传递坐标和事件类型
        放置控制器->>放置控制器: 根据模式处理坐标
        alt 点模式
            放置控制器->>放置控制器: 记录单点坐标
        else 线模式
            放置控制器->>放置控制器: 记录起点/终点
        else 面模式
            放置控制器->>放置控制器: 记录多边形顶点
        end
        放置控制器->>渲染引擎: 更新预览图形
    end

    用户->>输入系统: 确认放置(如右键/回车)
    输入系统->>放置控制器: 提交几何数据
    放置控制器->>场景管理: 添加新几何元素
    场景管理->>渲染引擎: 更新场景
    渲染引擎-->>用户: 显示最终结果
Loading

技术要点说明

  1. ​坐标系转换​​:正确处理屏幕坐标到世界坐标的转换
  2. ​顶点限制​​:面模式建议设置最大顶点数(如50个)
  3. ​性能优化​​:对复杂面实时预览采用简化渲染

该方案支持类似Blender的基础建模交互,实际开发时可参考Three.js的TransformControls实现。需要添加更多几何类型时可扩展GeometryBuilder接口。

操作-删除-点/线/面

sequenceDiagram
    participant 用户
    participant 输入系统
    participant 选择器
    participant 场景管理
    participant 撤销系统

    用户->>输入系统: 选择删除工具
    输入系统->>选择器: 激活删除模式

    alt 直接选择删除
        用户->>输入系统: 点击目标元素
        输入系统->>选择器: 传递点击坐标
        选择器->>场景管理: 执行射线检测
        场景管理->>选择器: 返回命中元素
        选择器->>撤销系统: 备份当前状态
        选择器->>场景管理: 删除目标元素
        场景管理-->>用户: 更新场景显示

    else 框选批量删除
        用户->>输入系统: 拖拽选择框
        输入系统->>选择器: 传递框选范围
        选择器->>场景管理: 执行范围查询
        场景管理->>选择器: 返回候选元素
        选择器->>撤销系统: 批量备份状态
        选择器->>场景管理: 删除所有选中元素
        场景管理-->>用户: 更新场景显示
    end
Loading

技术要点说明

  1. ​拓扑维护​​:删除线时需要自动处理所属面的边重组
  2. ​性能优化​​:超过1万个元素建议采用渐进式删除
  3. ​版本兼容​​:删除操作应生成可序列化的撤销记录
  4. ​权限控制​​:关键元素可设置删除保护标记

该方案支持类似AutoCAD的删除交互逻辑,实际开发时可参考QT的Graphics Framework实现。需要添加更复杂的删除规则时可扩展DeletionPolicy策略模式。

操作-挤出-点/线/面

sequenceDiagram
    participant 用户
    participant 输入系统
    participant 挤出工具
    participant 几何引擎
    participant 场景管理

    用户->>输入系统: 选择挤出工具
    输入系统->>挤出工具: 激活挤出模式

    用户->>输入系统: 选择基础元素(点/线/面)
    输入系统->>挤出工具: 传递选择集

    挤出工具->>几何引擎: 生成挤出预览
    几何引擎->>挤出工具: 返回预览几何体

    loop 交互调整
        用户->>输入系统: 拖动鼠标/输入数值
        输入系统->>挤出工具: 传递挤出参数(方向/距离)
        挤出工具->>几何引擎: 更新挤出计算
        几何引擎->>挤出工具: 返回新几何体
        挤出工具->>场景管理: 更新临时显示
    end

    用户->>输入系统: 确认操作(回车/右键)
    输入系统->>挤出工具: 提交挤出命令
    挤出工具->>场景管理: 添加最终几何体
    场景管理-->>用户: 显示挤出结果
Loading

技术要点说明

  1. ​拓扑维护​​:挤出面时需要自动生成侧面几何
  2. ​交互反馈​​:建议显示动态箭头指示挤出方向
  3. ​撤销支持​​:需要保存挤出前的原始几何状态
  4. ​性能优化​​:对复杂几何采用增量式挤出计算

该方案支持类似Blender的挤出操作流程,实际开发时可参考Three.js的ExtrudeGeometry实现。需要添加更多高级功能时可扩展ExtrusionModifier接口。

操作-连接-点

sequenceDiagram
    participant 用户
    participant 输入系统
    participant 连接工具
    participant 几何引擎
    participant 场景管理

    用户->>输入系统: 选择连接工具
    输入系统->>连接工具: 激活连接模式

    loop 点选择阶段
        用户->>输入系统: 点击选择点(至少2个)
        输入系统->>连接工具: 传递点坐标
        连接工具->>几何引擎: 生成预览线段
        几何引擎->>场景管理: 更新临时显示
    end

    用户->>输入系统: 确认操作(回车/右键)
    输入系统->>连接工具: 提交连接命令
    连接工具->>几何引擎: 创建最终连接线
    几何引擎->>场景管理: 添加新几何体
    场景管理-->>用户: 显示连接结果
Loading

技术要点说明

  1. ​拓扑维护​​:自动建立点-线引用关系
  2. ​交互反馈​​:实时显示连接距离和角度信息
  3. ​性能优化​​:使用空间索引加速点查询
  4. ​异常处理​​:禁止重复连接已存在的线段

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages