Skip to content

jiabao-wang/junshi

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Three.js Dynamic GLTF Model Viewer

系统简介

Three.js Dynamic GLTF Model Viewer 是一个基于 Three.js 构建的 3D 模型展示和交互系统,旨在提供一个动态的 Web 环境,用于加载、展示和管理 GLTF 格式的 3D 模型。该系统支持实时渲染多个模型,允许用户添加新模型、修改模型位置和旋转,并通过后端接口动态获取模型坐标,实现模型的动态路径更新。系统适用于教育演示、虚拟场景设计或简单的 3D 模拟应用。

当前系统包含一个固定背景模型和多个动态模型,运行在浏览器中,并通过前端与后端协同工作,提供流畅的 3D 体验。

系统截图

demo

核心功能

  1. 3D 模型展示:
  • 使用 Three.js 渲染 GLTF 格式的 3D 模型,支持多模型同时展示。
  • 包含一个固定背景模型(默认加载 ./background/scene.gltf),替代传统的平面地图。
  • 动态模型支持缩放、位置调整和旋转控制。
  1. 模型增删:
  • 提供“添加模型”按钮,用户可以通过提示输入模型文件路径、缩放比例和动画路径,动态添加新模型。
  • 支持删除模型(通过手动移除或刷新页面清空)。
  1. 模型位置修改:
  • 提供交互式控制面板,用户可以手动调整动态模型的 X、Z 坐标(步长 0.1)和 X、Y、Z 轴旋转(步长 0.1)。
  • 背景模型位置固定在 (0, -6, 0),无法修改。
  1. 模型坐标动态获取:
  • 每 2 秒通过后端接口(/api/update_path/{model_id})异步获取动态模型的最新坐标序列。
  • 更新后,模型会平滑过渡到新路径,增强动态效果。
  1. 场景交互:
  • 集成 OrbitControls,支持用户通过鼠标拖动、缩放和旋转视角,查看 3D 场景。
  • 提供坐标轴辅助工具,便于定位模型。

如何使用

运行环境准备

推荐前端开发工具WebStorm,运行本项目超级方便,无需配置环境。

下载链接 运行

由于模型文件较大,完整可运行项目请到我的网盘下载百度网盘下载链接

视角控制

使用鼠标左键拖动:旋转视角。

使用鼠标滚轮:缩放视角(受 minDistance 和 maxDistance 限制)。

使用鼠标右键拖动:平移视角(受 screenSpacePanning 限制)。

新增模型

  1. 页面添加模型: 添加模型 添加模型 添加模型 添加模型

点击“添加模型”按钮,输入模型文件路径、缩放比例和动画路径。

  • 输入 GLTF 文件的相对路径(例如 ./model/scene.gltf)。
  • X 轴缩放比例:输入 X 轴缩放值(默认 1)。
  • Y 轴缩放比例:输入 Y 轴缩放值(默认 1)。
  • Z 轴缩放比例:输入 Z 轴缩放值(默认 1)。
  • 动画序列:输入坐标序列,格式为 x1,z1;x2,z2;...(例如 0,0;5,5;10,0),表示模型移动路径。

提交后,新模型将加载并显示,初始位置基于动画序列的第一个点。

  1. 代码动态添加模型:

调用 addModel 函数,传入模型文件路径、缩放比例和动画序列。 添加模型

修改模型位置和旋转:

  1. 页面修改: 添加模型
  • 在左侧控制面板中,找到目标模型的控制区域(以 model-{数字} 命名)。
  • 使用以下按钮调整位置: (1). X +0.1 / X -0.1:沿 X 轴移动 0.1 单位。 (2). Z +0.1 / Z -0.1:沿 Z 轴移动 0.1 单位。
  • 使用以下按钮调整旋转: (1). Rotate X +0.1 / Rotate X -0.1:沿 X 轴旋转 0.1 弧度。 (2). Rotate Y +0.1 / Rotate Y -0.1:沿 Y 轴旋转 0.1 弧度。 (3). Rotate Z +0.1 / Rotate Z -0.1:沿 Z 轴旋转 0.1 弧度。
  • 调整后,模型位置会实时更新。
  1. 代码修改: 调用 model.position[axis] += value; model.rotation[axis] += value; 函数,更改新的 X、Z 坐标。

动态获取模型坐标

每 2 秒,系统通过后端接口 /api/update_path/{model_id} 获取动态模型的最新坐标序列。

更新后的路径会平滑应用,模型会移动到新坐标。

后台需提供 /api/update_path/{model_id} 接口返回 JSON 格式数据(见后端接口部分)。 添加模型

删除模型:

调用 scene.remove(model); 或刷新页面清空所有模型。

后端接口

后端使用 FastAPI 提供动态坐标更新服务,运行在 http://localhost:8000。 以下是接口详情:

  1. 获取模型路径更新
  • URL: /api/update_path/{model_id}
  • 方法: GET
  • 参数:
    • model_id (string): 模型的唯一标识符,例如 model-0、model-1。
  • 响应:
    • 成功:返回 JSON 数组,包含坐标序列。 格式: [{ "x": float, "z": float }, ...] 示例: [{"x": 0, "z": 0}, {"x": 5, "z": 5}, {"x": 10, "z": 0}]
    • 失败: 返回错误信息(由前端记录至控制台)。
  • 用途: 每 2 秒由前端调用,更新动态模型的动画路径。

示例代码:

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
from typing import List
import random
from datetime import datetime

app = FastAPI()

# 允许跨域请求
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)


# 定义坐标点模型
class Point(BaseModel):
    x: float
    z: float


# 模拟数据库:存储每个模型的坐标序列
model_paths = {
    "model-0": [
        {"x": 0, "z": 0},
        {"x": 5, "z": 5},
        {"x": 10, "z": 0},
        {"x": 5, "z": -5},
        {"x": 0, "z": 0}
    ],
    "model-1": [
        {"x": -10, "z": -10}
    ],
    "model-2": [
        {"x": 0, "z": 0},
        {"x": -5, "z": 5},
        {"x": -10, "z": 0}
    ],
    "model-3": [
        {"x": 0, "z": 0}
    ]
}


# API 端点:返回指定模型的初始路径
@app.get("/api/path/{model_id}", response_model=List[Point])
async def get_path(model_id: str):
    return model_paths.get(model_id, [{"x": 0, "z": 0}])


# API 端点:返回指定模型的动态更新路径
@app.get("/api/update_path/{model_id}", response_model=List[Point])
async def update_path(model_id: str):
    base_path = model_paths.get(model_id, [{"x": 0, "z": 0}])
    current_time = datetime.now().second
    if model_id == 'model-3':
        return base_path
    new_path = base_path.copy()  # 基于初始路径生成动态变化
    new_path = [new_path[-1]]
    # 模拟动态更新:根据时间添加随机偏移
    point = new_path[-1]
    point["x"] += random.uniform(-2, 2)
    point["z"] += random.uniform(-2, 2)
    if len(new_path) < 3:  # 确保至少有 3 个点
        new_point = {"x": point["x"] + random.uniform(-5, 5), "z": point["z"] + random.uniform(-5, 5)}
        new_path.append(new_point)

    return new_path

运行:

安装依赖: pip install fastapi uvicorn

运行: uvicorn main:app --reload --port 8000

注意事项

  1. 模型文件 确保所有 GLTF 文件路径正确且可访问。
  2. 系统性能 过多模型或频繁更新可能影响性能,建议优化后端响应时间或调整 setInterval 间隔。
  3. 跨域请求 后端需启用 CORS(已包含在示例代码中),否则前端请求可能失败。
  4. 前端调试 使用浏览器的开发者工具查看控制台,检查错误和调试信息。

技术栈

  • 前端:Three.js、HTML5、CSS3、JavaScript
  • 后端:FastAPI (Python)

相关资源

  1. Three.js 文档: Three.js Documentation
  2. FastAPI 文档: FastAPI Documentation
  3. GLTF 文件格式: glTF
  4. 3d 模型资源: Sketchfab
  5. 3d 模型资源: Cgmszj
  6. 3d 模型资源: Free3d
  7. 在线 3D 查看器: 3d viewer
  8. 在线 3D 编辑器: gltf nsdt
  9. 在线 3D 文件转换: Convertio

版本

  • 2025-05-19 06:21 PM PDT: 初始版本发布,支持基本模型展示、添加、位置修改和动态坐标获取。新增支持多个动态模型(tank, soldier, tent, car)。

联系方式

  • QQ: 1307854753
  • 微信: 1307854753
  • email: jiabaow@mail.nwpu.edu.cn

后续开发计划

  • 实现更复杂的动画和交互效果。
  • 支持更多类型的 3D 文件格式。
  • 优化性能和加载速度。
  • 提供用户自定义视角保存与分享功能。

贡献者

该项目由多位开发者共同完成,具体贡献者可查阅项目的历史提交记录。

许可证

本项目采用 MIT 许可证,详情请参阅 LICENSE 文件。

如何贡献

欢迎任何形式的贡献!你可以通过以下方式参与项目:

  1. Fork 本仓库。
  2. 创建你的特性分支 (git checkout -b feature/amazing-feature)。
  3. 提交你的更改 (git commit -am 'Add some amazing feature')。
  4. 推送分支到 GitHub (git push origin feature/amazing-feature)。
  5. 创建新的 Pull Request。

About

Three.js Dynamic GLTF Model Viewer

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages