模型苏醒计划:Threejs 让静态模型「叛逆」起来

模型类型

  • GLTF(.gltf,.glb): 是由 Khronos Group 开发的一种新型 3D 文件格式,具有高效、紧凑、支持 PBR 材质等优点,是当前主流的 3D 模型格式。

  • FBX(.fbx): 是由 Autodesk 开发的一种 3D 模型格式,支持几何体、材质、骨骼动画等丰富信息,但文件较大,加载速度较慢,常用于 3D 内容制作和动画。

  • OBJ(.obj): 是由 Wavefront Technologies 开发的一种 3D 模型格式,文件较小,但缺少动画和材质信息。

  • Collada(.dae): 是由 Khronos Group 开发的一种 3D 模型格式,支持几何体、材质、动画等多种信息,但文件较大,加载速度较慢。

  • STL(.stl): 是由 3D Systems 开发的一种 3D 模型格式,主要用于 3D 打印,文件较小,但缺少动画和材质信息。

  • PLY(.ply): 是一种用于存储 3D 扫描数据的文件格式,支持几何体和材质信息,但文件较大,加载速度较慢。

  • 3DS(.3ds): 是由 Autodesk 开发的一种 3D 模型格式,支持几何体、材质和简单动画。

  • VRML(.wrl): 是一种早期的 3D 模型格式,支持几何体、材质和简单动画。

  • JSON(.json): 是一种轻量级的数据交换格式,可以用于存储 3D 模型信息,支持几何体、材质、动画等信息,但需要自己解析和处理。

加载器

GLTFLoader

是 Three.js 提供的一个用于加载 GLTF 格式模型的加载器。

js 复制代码
//导入GLTFLoader
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js";

//创建GLTFLoader实例
const gltfLoader = new GLTFLoader();

//加载模型
gltfLoader.load(
  "./models/scene.gltf",
  (gltf) => {
    scene.add(gltf.scene);
  },
  (xhr) => {
    console.log(xhr);
    let progress = (xhr.loaded / xhr.total) * 100;
    processDom.innerText = `加载进度:${progress.toFixed(2)}%`;
  },
  (err) => {
    console.log(err);
  }
);

gltfLoader.load(): 加载模型的方法。

  • 第一个参数: 模型的路径。

  • 第二个参数: 加载成功后的回调函数,参数为加载的模型对象。

  • 第三个参数: 加载过程中的回调函数,参数为加载进度。

  • 第四个参数: 加载失败的回调函数,参数为错误信息。

OBJLoader

是 Three.js 提供的一个用于加载 OBJ 格式模型的加载器。

js 复制代码
//导入OBJLoader
import { OBJLoader } from "three/examples/jsm/loaders/OBJLoader.js";

//创建OBJLoader实例
const objLoader = new OBJLoader();

//加载模型
objLoader.load("./models/scene.obj", (obj) => {
  scene.add(obj);
  //添加贴图
  obj.traverse((child) => {
    if (child.isMesh) {
      child.material.map = new THREE.TextureLoader().load("./models/nezha.png");
    }
  });
});

objLoader.load(): 加载模型的方法。

  • 第一个参数: 模型的路径。

  • 第二个参数: 加载成功后的回调函数,参数为加载的模型对象。

  • 第三个参数: 加载过程中的回调函数,参数为加载进度。

  • 第四个参数: 加载失败的回调函数,参数为错误信息。

obj.traverse(): 遍历模型对象的所有子对象。

FBXLoader

是 Three.js 提供的一个用于加载 FBX 格式模型的加载器。

js 复制代码
//导入FBXLoader
import { FBXLoader } from "three/examples/jsm/loaders/FBXLoader.js";

ColladaLoader

是 Three.js 提供的一个用于加载 Collada 格式模型的加载器。

js 复制代码
//导入ColladaLoader
import { ColladaLoader } from "three/examples/jsm/loaders/ColladaLoader.js";

STLLoader

是 Three.js 提供的一个用于加载 STL 格式模型的加载器。

js 复制代码
//导入STLLoader
import { STLLoader } from "three/examples/jsm/loaders/STLLoader.js";

PLYLoader

是 Three.js 提供的一个用于加载 PLY 格式模型的加载器。

js 复制代码
//导入PLYLoader
import { PLYLoader } from "three/examples/jsm/loaders/PLYLoader.js";

VRMLLoader

是 Three.js 提供的一个用于加载 VRML 格式模型的加载器。

js 复制代码
//导入VRMLLoader
import { VRMLLoader } from "three/examples/jsm/loaders/VRMLLoader.js";

TDSLoader

是 Three.js 提供的一个用于加载 3DS 格式模型的加载器。

js 复制代码
//导入TDSLoader
import { TDSLoader } from "three/examples/jsm/loaders/TDSLoader.js";

JSONLoader

是 Three.js 提供的一个用于加载 JSON 格式模型的加载器。

js 复制代码
//导入JSONLoader
import { JSONLoader } from "three/examples/jsm/loaders/JSONLoader.js";

注意: 以上加载器的使用方法基本相同,只是加载的模型格式不同。另外加载模型的时候可能需要添加光源,不然加载的模型是黑的。

模型对象

gltf 模型对象

  • scene: 模型场景,包含模型的所有子对象。

  • scenes: 模型场景数组,包含模型的所有场景。

  • animations: 模型动画,包含模型的所有动画。

  • asset: 模型资源,包含模型的元数据。

  • parser: 模型解析器,用于解析模型文件。

  • camera: 模型相机,用于渲染模型。

  • userData: 模型用户数据,用于存储用户自定义数据。

obj 模型对象

  • children: 模型子对象数组,包含模型的所有子对象。

位置操作

不管从 gltf 对象 scene 中还是 obj 对象中可以看到很多熟悉的属性,比如 position、scale 等,这些属性都是 Three.js 中常用的属性。加载模型成功后就可以操作模型的这些属性了。

以 Obj 模型为例,加载成功后可以看到模型对象中有一个 children 属性,这个属性是一个数组,里面包含了模型的所有子对象。每个子对象都是一个 Mesh 对象,Mesh 对象是 Three.js 中用于渲染几何体的对象,它包含了几何体和材质两个属性。我们可以通过操作这些属性来改变模型的显示效果。

js 复制代码
//获取模型对象
objLoader.load("./models/scene.obj", (obj) => {
  //缩放
  obj.scale.set(0.5, 0.5, 0.5);
  //位移
  obj.position.set(0.5, 0, 0);
  // 旋转180度
  obj.rotation.y = Math.PI;
  scene.add(obj);
});

材质操作

js 复制代码
//获取模型对象
objLoader.load("./models/scene.obj", (obj) => {
  // 设置材质颜色
  obj.children[0].material.color.set(0xff0000); 
  // 设置材质纹理
  obj.children[0].material.map = new THREE.TextureLoader().load("./models/nezha.png");
  scene.add(obj);
});

动画操作

js 复制代码
let mixer; // 动画混合器
//获取模型对象
gltfLoader.load("./models/Soldier.glb", (gltf) => {
  //获取动画
  const animations = gltf.animations;
  //创建动画混合器
  mixer = new THREE.AnimationMixer(gltf.scene);
  //创建动画动作
  const action = mixer.clipAction(animations[1]);
  //播放动画
  action.play();
  scene.add(gltf.scene);
});

let clock = new THREE.Clock();
//更新动画
function animate() {
  requestAnimationFrame(animate);
  if (mixer) {
    mixer.update(clock.getDelta());
  }
  renderer.render(scene, camera);
}

1. 创建 AnimationMixer 实例,传入模型对象。

AnimationMixer(模型对象): 动画混合器是用于场景中特定对象的动画的播放器。

2. 调用 clipAction() 方法创建动画动作,传入动画剪辑。

clipAction(动画剪辑): 创建动画动作,用于播放动画。

  • fadeIn(时间): 动画淡入时间。

  • fadeOut(时间): 动画淡出时间。

  • play(): 播放动画。

  • stop(): 停止动画。

  • reset(): 重置动画。

  • setLoop(循环方式): 设置动画循环方式。

3. 调用 play() 方法播放动画。

play(): 播放动画。

4. 在渲染循环中调用 update() 方法更新动画。

update(时间差): 更新动画。

书洞笔记

相关推荐
喝拿铁写前端5 小时前
前端与 AI 结合的 10 个可能路径图谱
前端·人工智能
codingandsleeping5 小时前
浏览器的缓存机制
前端·后端
灵感__idea7 小时前
JavaScript高级程序设计(第5版):扎实的基本功是唯一捷径
前端·javascript·程序员
摇滚侠7 小时前
Vue3 其它API toRow和markRow
前端·javascript
難釋懷7 小时前
JavaScript基础-history 对象
开发语言·前端·javascript
beibeibeiooo7 小时前
【CSS3】04-标准流 + 浮动 + flex布局
前端·html·css3
拉不动的猪7 小时前
刷刷题47(react常规面试题2)
前端·javascript·面试
浪遏7 小时前
场景题:大文件上传 ?| 过总字节一面😱
前端·javascript·面试
Bigger7 小时前
Tauri(十八)——如何开发 Tauri 插件
前端·rust·app
355984268550558 小时前
医保服务平台 Webpack逆向
前端·webpack·node.js