engvis 0.1.0

Engineering visualization framework with GPU rendering
# engvis

工程可视化框架 - 基于Rust和wgpu的高性能3D工程可视化工具

## 项目简介

engvis是一个用Rust编写的工程可视化框架,专为工程应用设计。它提供了完整的3D渲染管线,支持glTF模型加载、PBR材质渲染、灵活的相机控制和丰富的UI界面。

## 主要特性

- **GPU加速渲染**: 基于wgpu实现跨平台GPU渲染
- **glTF模型支持**: 支持加载glTF格式的3D模型
- **PBR材质系统**: 完整的物理渲染材质系统
- **灵活的相机控制**: 轨道相机,支持多种视图模式(前视图、顶视图、右视图、等轴测视图)
- **顶点和边线渲染**: 可视化显示网格的顶点和边线
- **高级光照系统**: 支持环境光、方向光和点光源
- **实时UI界面**: 基于egui的实时参数调整界面
- **场景管理**: 完整的场景图和节点管理系统

## 项目结构

```
engvis/
├── crates/
│   ├── engvis-core/      # 核心数据类型和算法
│   └── engvis-renderer/  # GPU渲染实现
└── src/
    └── main.rs           # 主应用程序
```

### engvis-core

核心库,提供:
- 相机系统(OrbitCamera)
- 网格数据结构(Mesh, SubMesh, MeshVertex)
- 材质系统(PbrMaterial)
- 光照系统(AmbientLight, DirectionalLight, PointLight)
- 场景管理(Scene, SceneNode)
- 输入处理(InputState)
- 包围盒(Aabb)

### engvis-renderer

渲染库,提供:
- GPU上下文管理(GpuContext, GpuResources)
- 网格渲染器(MeshRenderer)
- 材质管线(MaterialPipeline)
- 网格渲染(GridRenderer)
- 覆盖层渲染(OverlayRenderer)
- 光照缓冲(LightingBuffer)
- 纹理缓存(TextureCache)
- glTF加载器
- egui集成

## 快速开始

### 环境要求

- Rust 1.70或更高版本
- 支持Vulkan、Metal或DirectX 12的GPU

### 运行示例

```bash
# 克隆仓库
git clone https://github.com/yourusername/engvis.git
cd engvis

# 运行程序
cargo run --release
```

### 使用方法

程序启动后会显示一个默认的立方体场景。你可以:

1. **加载glTF模型**:
   - 点击菜单栏 `File` -> 输入模型路径 -> 点击 `Load glTF`

2. **相机控制**:
   - 鼠标左键拖动:旋转视图
   - 鼠标右键拖动:平移视图
   - 鼠标滚轮:缩放
   - 底部面板提供预设视图按钮:Front、Top、Right、Iso、Fit

3. **调整渲染参数**:
   - 左侧面板:场景信息
   - 右侧面板:材质、光照、渲染选项
   - 可以调整表面透明度、边线颜色和宽度、顶点大小等

4. **光照调整**:
   - 在右侧面板调整环境光和方向光的颜色和强度

## 作为库使用

### 添加依赖

在你的 `Cargo.toml` 中添加:

```toml
[dependencies]
engvis-core = "0.1.0"
engvis-renderer = "0.1.0"
```

### 示例代码

```rust
use engvis_core::{OrbitCamera, Scene, SceneNode, Mesh, PbrMaterial};
use engvis_renderer::{Renderer, create_window_and_gpu};
use glam::{Vec3, Affine3A};

// 创建场景
let mut scene = Scene::default();

// 添加网格和材质
scene.meshes.push(your_mesh);
scene.materials.push(PbrMaterial::default());

// 添加场景节点
scene.nodes.push(SceneNode {
    name: "MyObject".to_string(),
    local_transform: Affine3A::IDENTITY,
    mesh_index: Some(0),
    children: Vec::new(),
    visible: true,
});

// 创建相机
let camera = OrbitCamera::new(Vec3::ZERO, 5.0);

// 渲染
// ... 参考examples目录中的完整示例
```

## 技术栈

- **wgpu**: 跨平台GPU抽象层
- **winit**: 窗口管理和事件处理
- **egui**: 即时模式GUI库
- **glam**: 数学库
- **bytemuck**: 零拷贝类型转换

## 许可证

本项目采用 MIT 许可证。详见 [LICENSE](LICENSE) 文件。

## 贡献

欢迎提交Issue和Pull Request!

## 作者

nil (nil_lilin@163.com)