Files
three-offshore-vibe/README.md
2026-03-25 17:28:56 +08:00

213 lines
4.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 写实无尽海洋场景
一个基于 Three.js 的写实海洋场景,包含程序化生成的地形、植被、写实的水面和天空效果。
## 功能特性
### 🌊 写实海洋
- 使用 Three.js 官方 Water shader
- 动态水面波纹和反射
- 基于法线贴图的真实水面效果
- 支持天空颜色反射
### 🏔️ 程序化地形
- 使用 Simplex Noise 和 FBM分形布朗运动生成
- 多层噪声叠加创建自然起伏
- 基于高度的颜色渐变(深海、浅滩、沙滩、草地、岩石、雪山)
- 平滑的海岸线过渡
### 🌲 植被系统
- 40,000+ 片草地(实例化渲染)
- 400+ 棵程序化生成的树木
- 根据地形高度智能分布
- 逼真的树木几何形状(树干 + 多层树冠)
### ☀️ 天空与光影
- Three.js Sky shader大气散射
- 真实的太阳位置计算
- 动态雾效随太阳高度变化
- ACES Filmic 色调映射
- 高质量阴影
### 🎮 交互控制
- 轨道相机控制(拖拽旋转、右键平移、滚轮缩放)
- 太阳高度角控制(-10° 到 90°
- 太阳方位角控制(-180° 到 180°
- 曝光度调节
- 大气浑浊度控制
- 瑞利散射强度控制
## 技术栈
- **Three.js r171** - 3D 渲染引擎
- **Vite** - 现代化构建工具
- **ES Modules** - 模块化代码组织
## 项目结构
```
.
├── index.html # HTML 入口
├── package.json # 项目配置
├── vite.config.js # Vite 配置
└── src/
├── main.js # 应用入口
├── OceanScene.js # 主场景管理器
├── TerrainGenerator.js # 地形生成器
├── VegetationSystem.js # 植被系统
└── utils/
└── SimplexNoise.js # Simplex Noise 实现
```
## 安装与运行
### 安装依赖
```bash
npm install
```
### 启动开发服务器
```bash
npm run dev
```
访问 http://localhost:3000
### 构建生产版本
```bash
npm run build
```
## 使用说明
### 相机控制
- **左键拖动**: 旋转视角
- **右键拖动**: 平移相机
- **滚轮**: 缩放
### 太阳控制面板
右上角提供完整的太阳和大气控制:
1. **太阳高度角 (Elevation)**
- 范围: -10° 到 90°
- 控制太阳在天空中的高度
- 日出/日落效果在 0-15°
- 正午效果在 70-90°
2. **太阳方位角 (Azimuth)**
- 范围: -180° 到 180°
- 控制太阳的水平位置
- 180° = 正南方向
3. **曝光度 (Exposure)**
- 范围: 0.1 到 2.0
- 调节整体亮度
- 默认 0.5 适合大多数场景
4. **大气浑浊度 (Turbidity)**
- 范围: 1 到 20
- 较低值: 清澈蓝天
- 较高值: 雾霾/阴天效果
5. **瑞利散射 (Rayleigh)**
- 范围: 0 到 4
- 影响天空蓝色强度
- 较高值: 更蓝的天空
## 性能优化
- 实例化渲染草地(减少 draw calls
- 程序化生成(无需加载外部模型)
- 自适应像素比(限制最大 2x
- PCF 软阴影
- 雾效减少远处渲染负担
## 浏览器要求
- Chrome 90+
- Firefox 88+
- Safari 14+
- Edge 90+
需要支持 WebGL 2.0
## 参数调优建议
### 日出场景
```
Elevation: 5-15
Azimuth: 90-180
Exposure: 0.4-0.6
Turbidity: 8-12
Rayleigh: 2-3
```
### 正午场景
```
Elevation: 70-85
Azimuth: 180
Exposure: 0.5-0.7
Turbidity: 6-10
Rayleigh: 1.5-2.5
```
### 黄昏场景
```
Elevation: 0-10
Azimuth: 270
Exposure: 0.3-0.5
Turbidity: 12-16
Rayleigh: 2-4
```
## 自定义修改
### 调整地形大小
编辑 `src/OceanScene.js` 中的 `initTerrain()`:
```javascript
const terrainGen = new TerrainGenerator({
size: 1000, // 地形尺寸
segments: 256, // 细分程度(影响细节)
maxHeight: 50, // 最大高度
waterLevel: 0, // 水面高度
seed: 42 // 随机种子
});
```
### 调整植被密度
编辑 `src/OceanScene.js` 中的 `initVegetation()`:
```javascript
const vegSystem = new VegetationSystem(this.terrainGenerator, {
grassCount: 40000, // 草地数量
treeCount: 400, // 树木数量
terrainSize: 1000,
waterLevel: 0
});
```
### 调整水面效果
编辑 `src/OceanScene.js` 中的 `initWater()`:
```javascript
this.water = new Water(waterGeometry, {
textureWidth: 512,
textureHeight: 512,
waterColor: 0x001e0f, // 水面颜色
distortionScale: 3.7, // 波纹扭曲强度
// ...
});
```
## 许可证
MIT License
## 参考资源
- [Three.js Ocean Example](https://threejs.org/examples/webgl_shaders_ocean.html)
- [Three.js Sky Shader](https://threejs.org/docs/#api/en/objects/Sky)
- [Simplex Noise Algorithm](https://en.wikipedia.org/wiki/Simplex_noise)