首页 > 其他分享 >ThreeJS入门(123):THREE.Skeleton 知识详解,示例代码

ThreeJS入门(123):THREE.Skeleton 知识详解,示例代码

时间:2024-10-17 09:21:25浏览次数:3  
标签:动画 ThreeJS const Skeleton 骨骼 示例 绑定 THREE

作者: 还是大剑师兰特 ,曾为美国某知名大学计算机专业研究生,现为国内GIS领域高级前端工程师,CSDN知名博主,深耕openlayers、leaflet、mapbox、cesium,webgl,ThreeJS,canvas,echarts等技术开发,欢迎加微信(gis-dajianshi),一起交流。

在这里插入图片描述

查看本专栏目录 - 本文是第 123篇入门文章

文章目录

THREE.Skeleton 是 Three.js 中用于管理骨骼动画的一个类。它提供了一种方式来定义和管理一组骨骼,这些骨骼可以被用来驱动模型的动画。THREE.Skeleton 通常与 THREE.Bone 一起使用,以创建复杂的角色动画。

构造函数

构造函数 new THREE.Skeleton(bones, bindMatrix) 接受两个参数来定义骨骼:

  • bones:一个包含所有骨骼的数组,每个元素都是一个 THREE.Bone 实例。
  • bindMatrix:一个可选的 THREE.Matrix4 对象,用于表示骨骼在绑定姿势下的全局矩阵。如果未提供,则默认为单位矩阵。

属性

THREE.Skeleton 的实例拥有以下属性:

  • bones:一个包含所有骨骼的数组。
  • bindMatrix:骨骼在绑定姿势下的全局矩阵。
  • bindMode:一个布尔值,表示当前是否处于绑定模式。默认为 false
  • bindTarget:一个 THREE.Object3D 实例,表示与骨骼绑定的目标对象。

方法

THREE.Skeleton 的实例提供了一些方法来操作和更新骨骼:

  • computeBindMatrix():计算并设置绑定矩阵。
  • update():更新骨骼的状态。
  • pose():将骨骼恢复到其初始的绑定姿势。
  • applyTo(mesh):将骨骼应用到指定的网格对象上,使网格跟随骨骼的变换。

使用示例

假设你想创建一个带有骨骼的角色,并为其添加动画:

// 创建骨骼
const bones = [];

// 创建多个骨骼
for (let i = 0; i < 10; i++) {
    const bone = new THREE.Bone();
    bones.push(bone);
}

// 创建 Skeleton
const skeleton = new THREE.Skeleton(bones);

// 计算绑定矩阵
skeleton.computeBindMatrix();

// 创建几何体
const geometry = new THREE.BoxGeometry(1, 1, 1);

// 创建材质
const material = new THREE.MeshSkinMaterial({
    skinHelper: true,
    morphTargets: false,
    wireframe: false,
    skinning: true,
});

// 创建网格对象,并与骨骼绑定
const mesh = new THREE.SkinnedMesh(geometry, material);
mesh.add(skeleton.bones[0]);
mesh.bind(skeleton);

// 将网格添加到场景中
scene.add(mesh);

// 在渲染循环中更新骨骼
function animate() {
    requestAnimationFrame(animate);

    // 更新骨骼的位置
    skeleton.bones[0].position.x = Math.sin(Date.now() * 0.001) * 10;

    // 更新骨骼
    skeleton.update();

    // 更新网格
    mesh.updateMatrixWorld(true);

    renderer.render(scene, camera);
}
animate();

在这个例子中,我们创建了一个包含 10 个骨骼的 THREE.Skeleton,并将骨骼绑定到了一个 THREE.SkinnedMesh 上。通过更新骨骼的位置并在渲染循环中更新骨骼状态,我们可以看到网格随着骨骼的变化而变化。

骨骼动画

为了实现骨骼动画,通常需要导入一个包含骨骼动画序列的模型文件(如 .gltf, .glb, .fbx 等)。Three.js 支持导入这些格式的模型,并自动处理骨骼动画。你可以使用 GLTFLoaderFBXLoader 等加载器来加载这些模型。

// 使用 GLTFLoader 加载模型
const loader = new THREE.GLTFLoader();
loader.load('path/to/model.gltf', function (gltf) {
    const model = gltf.scene;

    // 添加到场景
    scene.add(model);

    // 在渲染循环中播放动画
    function animate() {
        requestAnimationFrame(animate);

        // 更新动画
        if (model.animations && model.animations.length > 0) {
            const mixer = new THREE.AnimationMixer(model);
            const action = mixer.clipAction(model.animations[0]);
            action.play();

            mixer.update(deltaTime); // deltaTime 是当前帧与前一帧之间的时间差
        }

        renderer.render(scene, camera);
    }
    animate();
});

在这个例子中,我们使用 GLTFLoader 加载了一个包含骨骼动画的模型,并使用 AnimationMixer 来播放动画。

总结

THREE.Skeleton 是 Three.js 中用于管理骨骼动画的一个类。通过定义一组骨骼并与网格绑定,你可以创建复杂的角色动画。理解和熟练使用 THREE.Skeleton 对于开发高质量的 Three.js 应用程序是非常有帮助的。在实际应用中,通常还需要结合使用动画混合器(AnimationMixer)来播放动画序列。

需要注意的是,Three.js 的版本可能会有所不同,因此具体的方法和属性可能会有所变化。在实际使用时,请参考最新的 Three.js 文档。

标签:动画,ThreeJS,const,Skeleton,骨骼,示例,绑定,THREE
From: https://blog.csdn.net/cuclife/article/details/142165712

相关文章

  • APP视频活体检测API代码示例-动作活体检测开发
    视频活体检测技术是一种用于判断摄像头前的对象是否为真实活人的方法。传统的面部识别技术虽然能够有效地识别面部特征,但在面对照片、视频甚至是高精度的3D面具时,却显得力不从心。视频活体检测技术通过分析面部的微表情、皮肤纹理以及光线反射等多维度信息,能够有效地区分真实......
  • vue3简单使用threejs立方缓冲几何体(BoxGeometry)
    文章目录前言一、安装three二、使用步骤1.导入three、建立场景、相机和渲染器2.添加立方体3.渲染循环三、其他1.轨道控制器OrbitControls和坐标轴辅助对象AxesHelper2.GUI创建可交互的控件(点击全屏+退出全屏)3.监听窗口的变化执行一些重置操作四、完整代码五、效......
  • 支付宝沙箱版(什么是支付宝沙箱、配置支付宝沙箱、配置内网穿透、在SpringBoot项目中对
    文章目录0.前言1.什么是支付宝沙箱2.配置支付宝沙箱2.1沙箱应用的应用信息(获取app-id和gateway-url)2.2沙箱账号的商家信息和买家信息2.3下载秘钥工具2.4生成秘钥(获取private-key)2.5配置秘钥(获取alipay-public-key)3.配置内网穿透3.1使用cpolar实现内网穿透3.2......
  • 识别图形验证码 (Elixir 示例)
    安装所需依赖在你的mix.exs文件中添加以下依赖:elixirdefpdepsdo[{:httpoison,"~>1.8"},{:mogrify,"~>0.7"},{:tesseract,"~>0.1"}]更多内容联系1436423940end然后运行mixdeps.get来安装这些库。下载并保存验证码图片使用HTTPoison下载验证码图片并保存......
  • 识别图形验证码 (Scala 示例)
    安装所需依赖在你的build.sbt文件中添加以下依赖:scalalibraryDependencies+="org.scalaj"%%"scalaj-http"%"2.4.2"下载并保存验证码图片使用scalaj-http下载验证码图片并保存到本地:scalaimportscalaj.http._importjava.nio.file.{Files,Paths}objectCaptch......
  • 识别图形验证码 (Julia 示例)
    安装所需依赖在JuliaREPL中使用以下命令安装所需的包:juliausingPkgPkg.add("HTTP")Pkg.add("Images")Pkg.add("Tesseract")下载并保存验证码图片使用HTTP下载验证码图片并保存到本地:juliausingHTTPusingFileIOfunctiondownload_captcha(url::String,save_pa......
  • python+eel入门示例
    安装eelpipinstalleelpyimporteelimportrandom#笑话列表jokes=["为什么电脑经常生病?因为窗户(Windows)总是开着!","为什么数学书看起来总是很悲伤?因为它里面有太多的问题(problems)","为什么海洋里没有电脑?因为它们总是遇到短路(seals)","为什么冰......
  • Vue3 + Openlayers10示例 台风轨迹和台风圈
    前言假装已经完成了vue3和Openlayers10开发环境的搭建,如果有需要,可搜索vue+Openlayers环境搭建的相关文章。本示例基于Vue3和Openlayers10的环境,实现台风轨迹和台风圈的效果。一、安装插件安装Element-plus插件,其实只在台风列表的地方用到了el-checkbox,可根据实际需......
  • 例2.3列表操作示例
    '''首先先定义一个列表,列表是写在[]里,用逗号隔开的,元素是可以改变的列表的截取语法结构是:变量[头下标:尾下标]'''L=['abc',12,3.45,'python',2.789]#输出完整列表print(L)#输出列表的第一个元素print(L[0])#将列表的第一个元素修改为‘a’L[0]='a'#将列表的第2个元素到第3个元素......
  • MinIO部署及示例
    docker部署dockerrun\-p9000:9000\-p9001:9001\-d\--nameminio\-v/Users/ivan/code/black/dockerData/minio:/data\-e"MINIO_ROOT_USER=ROOT"\-e"MINIO_ROOT_PASSWORD=MINIO123"\quay.io/minio/mi......