three.js进阶之骨骼绑定

article/2025/10/4 23:21:07

使用three.js也能实现3D模型的骨骼绑定,使用代码控制模型!参考这里的呈现效果。
在这里插入图片描述
更加常见的应用场景应该是:给一个模型设置多套骨骼动画如唱、跳、Rap等,然后在浏览器中根据用户的输入选择执行不同的动画,这就需要对骨骼动画进行管理,本文先基于three.js官网提供的demo学习其实现机制。

源码解析

这里参考官方提供的demo应用的实现源码,关键代码片段,我已经在代码中作了详细的注释:

const loader = new GLTFLoader();
loader.load( 'models/gltf/Xbot.glb', function ( gltf ) {// 将模型加载到场景中model = gltf.scene;scene.add( model );// 遍历模型,对其中的Mesh添加投射阴影model.traverse( function ( object ) {if ( object.isMesh ) object.castShadow = true;} );// 创建骨骼工具skeleton = new THREE.SkeletonHelper( model );// visible属性是类Object3D的,设置为false将不会被渲染skeleton.visible = false;// 将骨骼工具添加到场景中scene.add( skeleton );// 读取模型中的动画数据const animations = gltf.animations;// 创建AnimationMixer实例mixer = new THREE.AnimationMixer( model );// 读取动画的个数numAnimations = animations.length;// 遍历每一个动画for ( let i = 0; i !== numAnimations; ++ i ) {let clip = animations[ i ];const name = clip.name;/*** 已经预定义了基础动作集合,包括未激活状态、走、跑,这三个动作* const baseActions = {*		idle: { weight: 1 },*		walk: { weight: 0 },*		run: { weight: 0 }*	};* 同时也预定义了额外的动作集合:* const additiveActions = {*		sneak_pose: { weight: 0 },*		sad_pose: { weight: 0 },*		agree: { weight: 0 },*		headShake: { weight: 0 }*	};*/if ( baseActions[ name ] ) {// 如果是基础动作,将其激活并保存到动作集合中const action = mixer.clipAction( clip );// 自定义函数,用于给动作activateAction( action );baseActions[ name ].action = action;allActions.push( action );} else if ( additiveActions[ name ] ) {// 如果是附加的动画,使用AnimationUtils工具类将给定动画剪辑的关键帧转换为附加格式THREE.AnimationUtils.makeClipAdditive( clip );// 这是针对特定动作的定制化需求,可以忽略if ( clip.name.endsWith( '_pose' ) ) {// 创建新剪辑,仅保留2到3帧之间的内容,fps为30,clip = THREE.AnimationUtils.subclip( clip, clip.name, 2, 3, 30 );}const action = mixer.clipAction( clip );activateAction( action );additiveActions[ name ].action = action;allActions.push( action );}}animate();
} );function activateAction( action ) {const clip = action.getClip();const settings = baseActions[ clip.name ] || additiveActions[ clip.name ];setWeight( action, settings.weight );action.play();
}function setWeight( action, weight ) {action.enabled = true;action.setEffectiveTimeScale( 1 );action.setEffectiveWeight( weight );
}

下面是animate()函数的代码:

function animate() {// Render looprequestAnimationFrame( animate );for ( let i = 0; i !== numAnimations; ++ i ) {const action = allActions[ i ];const clip = action.getClip();const settings = baseActions[ clip.name ] || additiveActions[ clip.name ];settings.weight = action.getEffectiveWeight();}// Get the time elapsed since the last frame, used for mixer updateconst mixerUpdateDelta = clock.getDelta();// Update the animation mixer, the stats panel, and render this framemixer.update( mixerUpdateDelta );stats.update();renderer.render( scene, camera );
}

SkeletonHelper介绍

通过阅读上面的源码, 发现SkeletonHelper是使得模型能够运动起来的关键,在three.js官网中也给出了简短的介绍:

A helper object to assist with visualizing a Skeleton. The helper is rendered using a LineBasicMaterial.
翻译过来就是:这个辅助化工具能够使得骨骼可视化,使用LineBasicMaterial材质进行渲染。

属性

总而言之,这个工具类非常简单,只有如下三个属性:

  • bones : Array
    当前模型的骨骼列表,这些骨骼将会以线性的形式渲染出来,如下图:
    在这里插入图片描述

  • isSkeletonHelper : Boolean
    这是一个只读的标志变量,用于检查传入的object是否为SkeletonHelper类型。

  • root : Object3D
    该属性保存的是构造函数中传入的模型。

方法

该工具类的方法和 LineSegments类的方法保持一致,说明是继承自 LineSegments类,而 LineSegments是继承自Line类,因此其基本方法就是和Line的绘制相关的方法,这一块直接查看官方文档即可。

AnimationMixer

AnimationMixer能够控制播放模型中包含的动画,如果一个场景中有多个模型存在动画,需要使用多个AnimationMixer分别控制。
The AnimationMixer is a player for animations on a particular object in the scene. When multiple objects in the scene are animated independently, one AnimationMixer may be used for each object.

方法

  • clipAction (clip : AnimationClip, optionalRoot : Object3D) : AnimationAction
    该方法将会返回一个AnimationAction对象。

AnimationClip

动画剪辑(AnimationClip)是一个可重用的关键帧轨道集,它表示一个对象的一个动作

AnimationAction

AnimationActions 用来调度存储在 AnimationClips 中的动画,它可以管理单个动作,让这个动作开始暂停等。


http://chatgpt.dhexx.cn/article/jbmDsBhL.shtml

相关文章

blender绑定骨骼法 2 rig

image.png image.png 生成一个body_temp add neck 脖子 add chin 下巴 image.png add shoulder肩膀 image.png add wrist手腕 add spline root .额那个位置 image.png add ankle脚踝 image.png FACIAL setup是面部的骨骼绑定,这里没眼球啥的就不弄了直接 点go 就生成了骨骼. im…

【ADV5】adv绑定不想创建那么多骨骼怎么设置

在maya做动画用ADV5有时候只是想做一些简单的绑定做动作不需要用上这么多骨骼,但是每次都生成太多导致权重处理增加 解决方法① 在Build之前选择需要调整的关节,如肩关节,在adv面板 属性(Body edit Attribute)- 移除…

Blender人物骨骼绑定

Blender人物骨骼绑定 1. 建立骨骼父子关系: 某些物体依附到其他物体上并成为它的子物体,可由骨骼按E键直接分裂出子骨骼。 2.将骨骼建立和三维模型的父子关系: 3. 设置反向运动学 正常的正向运动学是FK,也就是父骨骼带动子骨骼…

3dsmax-骨骼绑定及动作导出流程

title: 3dsmax-骨骼绑定及动作导出流程 categories: 3dsmax tags: [max, ta, 骨骼] date: 2018-06-28 17:06:18 comments: false 3dsmax-骨骼绑定及动作导出流程 以导出到 unity 为例 创建 模型 及 骨骼 蒙皮 给模型添加一个 蒙皮修改器 添加进 骨骼 封套, 给 骨骼 分配 顶…

骨骼绑定流程4

选择骨骼,右键选择层级,点亮左上角的问号,可编辑骨骼的坐标轴。要把结尾的关节轴向旋转回来。可以给骨骼设置标签。选择层级可以选中全部骨骼。 先给模型人物创建一个层,打开T。 腿部骨骼创建,移动单个骨骼按住d键。…

Unity+Kinect骨骼绑定的两种方法和问题(六)

下载链接: Unity3D 最新版Kinect v2 Examples with MS-SDK 2.21 体感识别 https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.6781645eHgkE2H&ftt&id693349554570 https://item.taobao.com/item.htm?spma230r.1.14.28.56ab4073MaY0XB&id6874…

C4D骨骼绑定和骨骼动画

模型完成之后,需要绑定骨骼,才能进行动作,骨骼绑定有多种方式 mixamo网站在线绑定 C4D导出 网站绑定需要我们现将模型导出,推荐FBX格式,这里说一下导出的选项勾选注意事项 几何——只勾选“法线”,不勾选…

3DMax基础骨架绑定教程

日常工作中经常要拿到3dmax bip骨去UE里和小白人骨架校对,因此学习骨架绑定可以自己绑定一些测试骨架便于调试。 第一步.导入测试绑定模型,这里用斯坦福犰狳兽为例: 第二步.创建bip骨,创建按钮在此处: 第三步.修改…

Blender里的三种绑定 (三)骨骼

文章目录 Blender里的三种绑定.骨骼.骨骼基础.骨骼的父子关系.挤出骨骼.细分骨骼.骨骼分层.骨骼分组.骨骼约束.骨骼被遮挡.对称骨骼.为模型绑定骨骼.刚体物体,只跟随骨骼的移动,不随骨骼移动发生形变,如机械.软体物体,跟随骨骼的移…

Unity2D—骨骼绑定、IK系统、动画(一)

目标:使用素材实现特定的2D人物动画 一、导入包资源和素材 (本人的Unity版本为2021.1.7) (1)Unity注册表中:2D Animation、2D PSD Importer。 (2)导入素材:推荐unity资源…

blender骨骼绑定

blender骨骼绑定 这里直接通过一个案例来测试! 在这之前,我们熟悉一些快捷键! shifta 跳出应用框! ctrlp 绑定物体! altp 解绑物体 altg 恢复位置 altr 恢复旋转 alts 恢复缩放! 大概这些&am…

人物快速绑定骨骼

1.登录Mixamo网站,上传自己的人物模型或者使用网站中的模型都行-->next 2.绑定骨骼 chin:下巴 wrists:手腕 elbows:肘部 knees:膝盖 groin:腹股沟 3.点击左侧选择动画,即可导出对应动画 4.模型导入unity,创建A…

安卓文字转语音——其实可以很简单——TextToSpeech用法解析

前言 很多时候我们会碰到文字转语音的需求,使用第三方sdk是个不错的选择,其实也可以更简单,安卓原生就提供了一个类处理这个事务。TextToSpeech无需集成,直接使用 局限 支持22种语言,不过中文支持并不很好&#xff…

Android TTS(TextToSpeech)实践

一、介绍 TextToSpeech:将文本合成语音,立即播放或创建声音文件。 最简单的流程如下: 1.创建TextToSpeech后,它会找到一个适合的Engine进行连接,然后回调onInit,如果status不为0,则没有找到引…

Android TextToSpeech实现文字转语音,进行播报

1. 下载讯飞语音引擎 2.初始化 TextToSpeech。 使用下面的构造函数进行初始化 TextToSpeech(android.content.Context context, android.speech.tts.TextToSpeech.OnInitListener listener, java.lang.String engine) 其中语音引擎的名称填写:com.iflytek.speec…

Android TextToSpeech简单使用

Android TextToSpeech简单使用 文章目录 Android TextToSpeech简单使用前言一、TTS是什么?二、使用步骤1.赋予相关权限2.初始化TTS3.使用 总结 前言 最近项目需要文字朗读内容,看了官方文档,简单记录一下 一、TTS是什么? TTS是T…

Android 离线文字转语音功能-TTS(Text To Speech)

前言 在 Android 中,TTS全称叫做 Text to Speech,从字面就能理解它解决的问题是什么,把文本转为语音服务,意思就是你输入一段文本信息,然后Android 系统可以把这段文字播报出来。这种应用场景目前比较多是在各种语音助…

使用TextToSpeech朗读文字

1.使用TextToSpeech将一段文字转换为语音 android也可以实现把输入的文字朗读出来,使用到的是TextToSpeech,将一段文字转换为成语音,可根据需要合成出不同音色、语速和语调的声音,让机器像人一样开口说话。 不过目前只支持5种语言…

Android通过TextToSpeech实现文字转语音

一、直接上代码: import android.app.Activity; import android.os.Bundle; import android.speech.tts.TextToSpeech; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widge…

Android中TextToSpeech的使用

系列文章目录 Android中TextToSpeech的使用 文章目录 系列文章目录前言实现1.初始化语音。这是一个异步操作。初始化完成后调用oninitListener(第二个参数)。2.实现TextToSpeech.OnInitListener3.写一个朗读方法,在需要的时候触发(如:点击事…