【Three.js】手把手教你在三维场景中实现人物行走动画效果

three.js的官方例程里面有个人物行走的案例,链接如下:

three.js官方案例-人物行走

这里简单剖析下人物行走的原理:

(1)

首先需要有个动画素材。gltf是可以集成动画的,像行人行走的动画,一般是通过骨骼动画实现的。一个gltf里面可以有多组动画,加载到three.js引擎里面之后,可以选择所需要的动画进行播放。

(2)

一般来说,人物行走的轨迹需要通过程序指定。当然,glb里面直接集成了位移的动画也不是不可以,但这样的轨迹控制就不方便。所以一般来说,glb动画就是人物在原地走动甩腿就可以了,通过程序来变更其位置。

官方的glb可以在windows下的3d查看器打开。

右下角可以切换不同的动画,这个例程里面有4个动画,奔跑、慢走、站立、伸展。有兴趣的小伙伴自己切换来看下。

那接下来我们开始写代码。

1、首先引入threejs的相关库

		<script type="importmap">{"imports": {"three": "./threejs/build/three.module.js","three/addons/": "./threejs/jsm/"}}</script>
		<script type="module">import * as THREE from 'three';import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';import * as SkeletonUtils from 'three/addons/utils/SkeletonUtils.js';</script>

2、定义好相关的变量。

各个变量的含义可以直接根据变量名读出来

		let camera, scene, renderer;let clock;let model1,model2;const mixers = [];

3、接下来写一个初始化函数init。

这个是搭建three环境的厂员工操作了

			function init() {camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 1000 );camera.position.set( 2, 10, -25 );camera.lookAt( 0, 1, 0 );clock = new THREE.Clock();scene = new THREE.Scene();scene.background = new THREE.Color( 0xa0a0a0 );scene.fog = new THREE.Fog( 0xa0a0a0, 10, 50 );const hemiLight = new THREE.HemisphereLight( 0xffffff, 0x444444 );hemiLight.position.set( 0, 20, 0 );scene.add( hemiLight );const dirLight = new THREE.DirectionalLight( 0xffffff );dirLight.position.set( - 3, 10, - 10 );dirLight.castShadow = true;dirLight.shadow.camera.top = 4;dirLight.shadow.camera.bottom = - 4;dirLight.shadow.camera.left = - 4;dirLight.shadow.camera.right = 4;dirLight.shadow.camera.near = 0.1;dirLight.shadow.camera.far = 40;scene.add( dirLight );// scene.add( new THREE.CameraHelper( dirLight.shadow.camera ) );// groundconst mesh = new THREE.Mesh( new THREE.PlaneGeometry( 200, 200 ), new THREE.MeshPhongMaterial( { color: 0x999999, depthWrite: false } ) );mesh.rotation.x = - Math.PI / 2;mesh.receiveShadow = true;scene.add( mesh );const loader = new GLTFLoader();loader.load( 'models/gltf/Soldier.glb', function ( gltf ) {gltf.scene.traverse( function ( object ) {if ( object.isMesh ) object.castShadow = true;} );model1 = SkeletonUtils.clone( gltf.scene );model2 = SkeletonUtils.clone( gltf.scene );// const model3 = SkeletonUtils.clone( gltf.scene );const mixer1 = new THREE.AnimationMixer( model1 );const mixer2 = new THREE.AnimationMixer( model2 );// const mixer3 = new THREE.AnimationMixer( model3 );// mixer1.clipAction( gltf.animations[ 2 ] ).play(); // idlemixer1.clipAction( gltf.animations[ 1 ] ).play(); // runmixer2.clipAction( gltf.animations[ 3 ] ).play(); // walkmodel1.position.x = - 2;model2.position.x = 0;// model3.position.x = 2;// scene.add( model1, model2, model3 );scene.add( model1, model2);// mixers.push( mixer1, mixer2, mixer3 );mixers.push( mixer1, mixer2);animate();} );renderer = new THREE.WebGLRenderer( { antialias: true } );renderer.setPixelRatio( window.devicePixelRatio );renderer.setSize( window.innerWidth, window.innerHeight );renderer.outputEncoding = THREE.sRGBEncoding;renderer.shadowMap.enabled = true;document.body.appendChild( renderer.domElement );window.addEventListener( 'resize', onWindowResize );}

关键代码剖析:

加载gltf、glb的函数是:loader.load( 'models/gltf/Soldier.glb', function ( gltf ) {}),

第二个参数是一个回调函数,当加载完毕之后,我们就开始调用骨骼动画了。这里用到了SkeletonUtils这个类。

注意选择具体的动画的地方就是mixer1.clipAction一句。gltf.animations就是上面提到的动画数组,有4个元素。

4、增加一个animate方法。

			function animate() {requestAnimationFrame( animate );const delta = clock.getDelta();for ( const mixer of mixers ) mixer.update( delta );model1.position.z -= 0.03;model2.position.z -= 0.01;renderer.render( scene, camera );}

代码剖析:

在这段代码里面,model1和model2的position属性被不停地更改,所以在场景刷新的时候,人物就走动起来了。

5、当然最后还是要调用一下这两个方法:

			init();animate();

至此,整个步行动画效果就出来了。

threejs下人物行走

完整的代码下载:

完整代码包下载(含模型资源)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/70107.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Unity3D插件】Alembic插件分享《abc动画文件导入Unity》

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客QQ群&#xff1a;1040082875 文章目录 一、前言二、参考网站及下载三、正文abc文件导入abc导入Unity之后的格式AlembicStreamPlayer组件AlembicExporter组件 一、前言 今天分享一下Alembic插件的使用教程&…

Unity角色动画之面部动画——SALSA插件

目录 概述组件LipSyncEmoteREyes 2D面部动画搭建2D模型添加SALSA 2D组件添加RandomEyes2D组件运行效果 3D面部动画添加SALSA 3D组件添加RandomEyes3D组件运行效果 概述 SALSA&#xff08;简单自动唇形同步近似&#xff09;是一种实时系统&#xff0c;用于从音频输入创建唇形同…

家里两个孩子,你们会一个跟爸姓,一个跟妈姓吗?

生老大的时候&#xff0c;刚开始不知道男女&#xff0c;就取了好几个名字&#xff0c;四个月四维查出男孩&#xff0c;就确定了一个&#xff0c;把剩下的名字分给以后的弟弟或妹妹&#xff01;后来意外二胎&#xff0c;没有查男女&#xff0c;老公就说要不二胎跟我姓吧&#xf…

Mother and child 妈妈与孩子

我拿起那条链子。她用双手接过它&#xff0c;向前探了探身&#xff0c;在我的脖子后把简易的项链钩系好。然后她向后退了几步&#xff0c;好像在看看是否合适。我低下头看着闪闪发亮的玻璃珠和已失去光泽的金色链子&#xff0c;然后抬起头望着她。我很认真地轻声说道&#xff1…

怎样要一个儿子和女儿

[转] 女人的最佳生育年限 及怎样要一个儿子和女儿 2011.11.30 阅读(4) 返回日志列表 转载(10.62万)分享评论复制地址更多 教你如何生一个漂亮宝宝&#xff0c;怕以后找不到&#xff0c;先收藏了1.教你如何生一个漂亮宝宝 2.男人的最佳生育年限 及怎样要一个儿子 3.受用一生的维…

Surrogate mother是代孕妈妈,那么,Surrogate parent呢?

文 / 王不留&#xff08;微信公众号&#xff1a;王不留&#xff09; 上午有位同学找我探讨了一个问题。 2021年3月20号刊《经济学人》有一篇文章《Panic Womb》&#xff08;恐慌的子宫&#xff09;。引言中有一段话“Conservatives fret that surrogate parents may be gay or …

Android开发之向桌面添加快捷方式

Android开发之向桌面添加快捷方式 对于一个希望拥有更多用户的应用来说&#xff0c;用户桌面可以说是所有软件的必争之地&#xff0c;如果用户在手机桌面上建立了该软件的快捷方式&#xff0c;用户将会更频繁地使用该软件。因此&#xff0c;所有 Android程序都应该允许用户把软…

如何为Android App 添加快捷方式

文章目录 概述效果好处 添加方式静态添加动态添加 概述 效果 好处 可以方便用户直接在桌面跳到目标页面可以让你的App显得更加专业(不过切忌添加过多&#xff0c;1-3个就够了) 添加方式 静态添加 在资源文件中添加 xml 目录&#xff0c;并在里面创建 shortcuts.xml 文件 …

Android之添加固定图标到桌面

我的QQ群 1 需求 Android之添加固定图标到桌面 2 部分实现 在AndroidManifest.xml里面添加如下权限 <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /><uses-permission android:name="com.android.launcher.perm…

Android中程序向桌面和Launcher添加快捷方式【安卓进化三十二】

最近感觉这个添加快捷方式挺有趣的&#xff0c;就查资料自己写了个demo---简单的例子&#xff0c;这个例子就是有两个按钮&#xff0c;点击“将此程序添加到快捷方式”&#xff0c;则手机桌面增加一个快捷方式&#xff0c;同时launcher中也多了一个快捷方式&#xff0c;点击退出…

Android 在Launcher桌面添加应用快捷图标(适用于Android 7.0(API24) 及以下)

Launcher为了应用程序能够定制自己的快捷图标&#xff0c;就注册了一个 BroadcastReceiver 专门接收其他应用程序发来的快捷图标定制信息。所以只需要根据该BroadcastReceiver构造出相对应的Intent并装入我们的定制信息&#xff0c;最后调用 sendBroadcast 方法就可以创建一个快…

Android 桌面工具,安卓怎样添加桌面工具

桌面工具(Widget)是Android系统的一大特色&#xff0c;通过桌面工具可以快速得到所需的信息&#xff0c;不必打开程序即可了解最新的内容。Android系统自带了一些常用的桌面工具&#xff0c;其他一些经过定制的系统也带有具有特色的桌面工具&#xff0c;同时&#xff0c;有很多…

【答辩问题】计算机专业本科毕业设计答辩技巧

下面是总结的一些答辩期间的问题&#xff08;结合论文中出现过的整理&#xff09; 1、MVC设计模式是指什么&#xff0c;其优缺点&#xff0c;怎样用到在你的程序里 2、SSM/SSH框架是指什么&#xff0c;其优缺点&#xff0c;怎样用到在你的程序里 3、前端用到了什么技术&…

基于SSM的毕业论文答辩系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

计算机专业毕业答辩问代码吗,计算机专业毕业论文答辩技巧

在做计算机毕业设计的整个过程中&#xff0c;一般有三个答辩&#xff0c;即开始答辩、中期答辩和最终答辩。有些学校简化为两个&#xff0c;即开题答辩和期末答辩。还有的学校将直接保留了最终答辩&#xff0c;省略了开始答辩和中期答辩。 当然不管你要参加几次答辩&#xff0c…

计算机专业毕业设计论文答辩PPT模板,10套计算机毕业设计答辩PPT模板

计算机专业毕业设计论文答辩PPT模板,10套计算机毕业设计答辩PPT模板 完整PPT模板包下载地址&#xff1a;计算机专业毕业设计论文答辩PPT模板 PPT模板预览 完整PPT模板包下载地址&#xff1a;10套计算机毕业设计答辩PPT模板

【答辩问题】计算机专业本科毕业设计答辩自述

各位老师,你们好!我叫XXX,来自计算机XX,我的论文题目是《在线考试系统》,论文是在XXX老师的指点下完成的,在这里我向X老师表示深深的谢意,向参加我的论文答辩各位老师表示衷心的感谢,并对我三年来的各位授课老师表示由衷的敬意。下面我将本论文设计的目的和主要内容向各位老师作…

outlook服务器邮件满了怎么办,Outlook邮箱不能接收邮件提示邮件箱已满的解决方法...

Outlook是一款很多用户都会用来收发邮件的邮箱工具&#xff0c;但是有时候邮件多了&#xff0c;可能会遇到不能接收邮件并提示邮箱已满的情况&#xff0c;该如何解决呢&#xff0c;为此这就给大家带来Outlook邮箱不能接收邮件提示邮件箱已满的解决方法吧。 存储的电子邮件数量有…

群晖端口转发 路由器配置

控制面板 - 外部访问 - 路由器配置 点击新增&#xff0c;可以增加内置的&#xff0c;或者自定义的转发机制 本机端口表示的是内部开启的端口号&#xff0c;比如ssh的端口22 外部端口表示外网可以访问的端口号&#xff0c;比如设置为8787 那么此时&#xff0c;如果你在外网需要…

群晖|你可能并不知道的群晖反向代理

最近在内网弄了台后台服务器来开发小程序&#xff0c;小程序呢是一定要走https的&#xff0c;所以就申请了SSL证书&#xff0c;本想通过nginx来进行https反向代理&#xff0c;但忘记nginx配置怎么写了。以前玩群晖的时候貌似见过哪儿有反向代理&#xff0c;一番研究&#xff0c…