threejs骨架形状

骨骼动画

骨骼是什么?骨骼就是一个可以控制其它形状的对象。在threejs中,骨骼(Bone)就是一个空的Object3D对象,当然,也可以是任何Object3D对象的子类。

创建骨架

创建骨架总体来说就四步:

  • 创建形状
  • 创建骨架
  • 为形状的每一个点指定其控制的骨骼
  • 将形状和骨架中的骨骼绑定起来

往往第三步是最复杂的,因为要考虑形状的每一个点。下面是一个完整的例子,在这个例子中,是使用点的y值来划分哪个点属于哪根骨骼管的:

function createBones(){//计算参数,这些参数在多处用到var segmentHeight = 8;var segmentCount = 4;var height = segmentHeight * segmentCount;var halfHeight = height * 0.5;var sizing = {segmentHeight : segmentHeight,segmentCount : segmentCount,height : height,halfHeight : halfHeight};//创建骨架bones = [];var prevBone = new THREE.Bone();bones.push( prevBone );prevBone.position.y = - sizing.halfHeight;for ( var i = 0; i < sizing.segmentCount; i ++ ) {var bone = new THREE.Bone();bone.position.y = sizing.segmentHeight;bones.push( bone );prevBone.add( bone );prevBone = bone;}skeleton = new THREE.Skeleton( bones );//创建形状var geometry = new THREE.CylinderGeometry(5,                       // radiusTop5,                       // radiusBottomsizing.height,           // height8,                       // radiusSegmentssizing.segmentCount * 3, // heightSegmentstrue                     // openEnded);//将形状的每个点和骨骼建立关联,其中skinIndices指定该点由哪些骨骼控制(通过骨骼序号指定),skinWeights指定这些骨骼对该点的控制能力for ( var i = 0; i < geometry.vertices.length; i ++ ) {var vertex = geometry.vertices[ i ];var y = ( vertex.y + sizing.halfHeight );var skinIndex = Math.floor( y / sizing.segmentHeight );var skinWeight = ( y % sizing.segmentHeight ) / sizing.segmentHeight;geometry.skinIndices.push( new THREE.Vector4( skinIndex, skinIndex + 1, 0, 0 ) );geometry.skinWeights.push( new THREE.Vector4( 1 - skinWeight, skinWeight, 0, 0 ) );}var material = new THREE.MeshPhongMaterial( {skinning : true,color: 0x156289,emissive: 0xa72534,side: THREE.DoubleSide,shading: THREE.FlatShading,wireframe:true} );mesh = new THREE.SkinnedMesh( geometry,material );//绑定骨架和网格,任务完成mesh.add( bones[ 0 ] );mesh.bind( skeleton );mesh.scale.multiplyScalar( 1 );scene.add( mesh );//SkeletonHelper可以用线显示出骨架,帮助我们调试骨架,可有可无skeletonHelper = new THREE.SkeletonHelper( mesh );skeletonHelper.material.linewidth = 2;scene.add( skeletonHelper );
}

值得一说的是skinIndices和skinWeights属性,这两个属性来自Geometry类。
skinIndices是一个数组,用来指出当前点受哪些骨骼控制,在threejs中,一个点最多可以受4根骨头控制,所以skinIndices是一个Vector4数组。
skinWeights也是一个Vector4数组,其中的数据和skinIndices数组一一对应,用来指示对应的骨骼影响该点的比重。
比如:

geometry.skinIndices[3] = new THREE.Vector4(1,2,3,0);  
geometry.skinWeights[3] = new THREE.Vector4(0.6,0.3,0.1,0);

上面的代码表示,geometry的第四个点受序号为1,2,3的三根骨骼控制,控制的比重分别是0.6,0.3,0.1。序号为0的骨骼由于控制比重为0,即这个点不受这根骨骼控制。

更新骨架

直接控制每个骨骼的运动,就能控制整个骨骼图形的运动:

angle = 0;
function render(){requestAnimationFrame(render);angle += 0.1;angle = angle%60;mesh.skeleton.bones[ 3 ].rotation.z  = angle/180*Math.PI;mesh.skeleton.bones[ 1 ].rotation.z  = -angle/180*Math.PI;skeletonHelper.update();renderer.render(scene,camera);
}

完整例子

threejs骨架动画简单例子


【持续更新点这里】

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

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

相关文章

.net 知识积累

日历模式&#xff1a; 可以使用按钮事件进行触发 &#xff1b; 设置默认按钮&#xff1a; this.Form.DefaultButton"ID属性" &#xff1b; 注意此功能只能应用于.net控键中&#xff0c;必须位于 ruant "Server"; DefaultButton 必须是 IButtonControl 类…

tx2无法识别网络_Jetson TX2开篇--网络配置

续接上文&#xff0c;硬件连接完毕后&#xff0c;接通电源&#xff0c;按开机按钮。系统开机首次进入的是以nvidia用户登录的Ubuntu 命令行界面。习惯使用图形界面的用户莫慌&#xff0c;首次开机通过startx 命令发现无法启动图形界面&#xff0c;解决办法见(Jetson TX2开篇--安…

threejs加载3D模型例子

加载3D模型 首先要引入ColladaLoader加载器&#xff0c;Collada是一个3D模型交换方案&#xff0c;即不同的3D模型可以通过Collada进行相互转换&#xff0c;言外之意&#xff0c;threejs可以使用Collada将3D模型的数据转换成自己支持的格式&#xff0c;从而在浏览器上渲染出来。…

snailsvn使用教程_mac下使用snailSVN的踩坑之旅

一个很心酸的故事&#xff0c;公司了使用苹果电脑的只有我一个人&#xff0c;然后刚开始使用苹果电脑&#xff0c;开启了我饿自闭之旅&#xff0c;网上查到的一些方法是不可以使用的&#xff0c;所以我把正确的方法记录下来&#xff0c;给大家指个路首先&#xff0c;说明下&…

bzoj 1083 繁忙的都市

题目链接&#xff1a;http://www.lydsy.com/JudgeOnline/problem.php?id1083 题解&#xff1a; 在bzoj里能遇到如此如此水的题真是不容易…… 乍一看好像有点吓人&#xff0c;其实是一道Kruskal模板题…… 1 #include<cstdio>2 #include<algorithm>3 using namesp…

threejs纹理

纹理 纹理用来表现物体的细节。理论上可以将物体的每个细节建模出来&#xff0c;但是这样时间成本和性能成本都太高&#xff0c;因此&#xff0c;将物体的一些细节用纹理来表示。 图片纹理 图片纹理直接在物体表面应用图片。可以使用TextureLoader类的load方法来加载纹理。 …

mysql 列换行 表设计 设计_今天来讲一下怎么利用MySql进行库表设计

今天来讲一下怎么利用MySql进行库表设计1 引擎选择在 mysql 5.1 中&#xff0c;引入了新的插件式存储引擎体系结构&#xff0c;允许将存储引擎加载到正在运新的 mysql 服务器中。使用 mysql 插件式存储引擎体系结构&#xff0c;允许数据库专业人员或者设计库表的软件开发人员为…

刷题向》一道逆向思维题(BZOJ1046)(NORMAL)

这道题对于一类题都有一个通用思路&#xff1a;反向递减序列即为正向字典序。 对于逆向思维的题还要多做才能培养这种对于逆向思维的感觉。 想到这种方法之后&#xff0c;就很简单了。 因为nm不会炸&#xff0c;所以反向LIS叠一个贪心就能过了。 直接甩题目&代码 Descripti…

threejs对象拾取

对象拾取 对象拾取也就是要获得鼠标事件发生位置的图形对象。在threejs中&#xff0c;是通过Raycaster 对象来拾取对象的&#xff0c;ray是射线&#xff0c;caster是投射器&#xff0c;从字面上即可理解其工作原理是&#xff1a;从某个方向发射一条射线&#xff0c;穿过鼠标所…

android webview权限申请_android - 在运行时向摄像机请求WebView权限 - 堆栈内存溢出...

我想在Android WebView的PWA中使用QR码扫描仪。PWA在chrome浏览器上可以正常工作。我确实有在“应用程序”->“应用程序名称”->“权限”下设置摄像机的权限minSdkVersion 26和targetSdkVersion 28在装有Android 9的华为手机上测试问题是似乎没有授予该权限。 另外&#…

threejs指定对象旋转中心

指定对象旋转中心 默认情况下&#xff0c;对象的旋转中心都是自身的中心。对于组对象而言&#xff0c;也是如此。因此&#xff0c;可以利用这个特点&#xff0c;实现对象绕任何点旋转&#xff0c;也就是指定旋转中心。比如我们想要下图的对象绕A点旋转 我们可以添加我们的对…

threejs设置对象层次

设置层次 threejs提供了层次的支持。和相机处于同一层次的对象可见&#xff0c;否则不可见。在threejs中&#xff0c;最多可以设置32层&#xff0c;默认的层次是1。层次在有些系统中很有用&#xff0c;可以将不同的模式的对象设成不同的层次&#xff0c;这样&#xff0c;切换模…

法那科机器人初始化启动_发那科机器人的控制方式和控制柜的启动方式

工业机器人能得到广泛应用&#xff0c;得益于它拥有有多种控制方式&#xff0c;按作业任务的不同&#xff0c;可主要分为点位控制方式、连续轨迹控制方式、力(力矩)控制方式和智能控制方式四种控制方式。1.点位控制方式(PTP)这种控制方式只对工业机器人末端执行器在作业空间中某…

Text段、Data段和BSS段

不同的compiler在编译的过程中对于存储的分配可能略有不同&#xff0c;但基本结构大致相同。 大体上可分为三段&#xff1a;Text段、Data段和BSS段。 text段用于存放代码&#xff0c;通常情况下在内存中被映射为只读&#xff0c;但data和bss是可写的。 数据存放通常分成如下几个…

threejs渲染器剔除模式

渲染器剔除模式 渲染器可以设置成舍弃某些面&#xff0c;如前面、背面等&#xff0c;在【WebGLRenderer Constants】中对此有说明。默认情况下&#xff0c;是剔除掉背面&#xff0c;也就是背对着相机的面。下面看看例子&#xff1a; 首先创建一个正方形&#xff0c;给每个面不…

扫地机器人测评云鲸_云鲸科技,J1测评

云鲸科技&#xff0c;J1测评2020-01-07 16:27:393点赞5收藏11评论9月30日 - 11月10日&#xff0c;能省会花&#xff0c;值友当家&#xff01;参与#我的省钱绝活#征稿活动&#xff0c;分享你的省钱绝活&#xff01;发文就有100金币&#xff0c;千元京东卡等你来拿&#xff01;点…

XVI Open Cup named after E.V. Pankratiev. GP of Eurasia

A. Nanoassembly 首先用叉积判断是否在指定向量右侧&#xff0c;然后解出法线与给定直线的交点&#xff0c;再关于交点对称即可。 #include<bits/stdc.h> using namespace std; const int Maxn300020; typedef long long LL; typedef pair<int,int>pi; struct P{do…

threejs向量夹角和夹角方向

计算向量的夹角 计算向量的夹角&#xff1a; v1 new THREE.Vector3(5,0,0); v2 new THREE.Vector3(5,5,0); v1.angleTo(v2); //0.7853981633974484 v2.angleTo(v1); //0.7853981633974484可见&#xff0c;向量的夹角是没有方向的。但是有时候&#xff0c;又需要计算夹角的…

web版本 开源压测工具_siege--Web性能压测工具

-V, --version VERSION, prints the version number.-h, --help HELP, prints this section.-C, --config CONFIGURATION, show the current config.//显示当前的默认装置-v, --verbose VERBOSE, prints notification to screen.//详细通知打印到屏幕&#xff0c;输…

threejs路径

路径 引用百度百科的解释&#xff1a; 路径通常指存在于多种计算机图形设计软件中的以贝塞尔曲线为理论基础的区域绘制方式。路径在Canvas、SVG上都有相关定义&#xff0c;一般用来创建形状。在threejs中&#xff0c;也可以用来创建形状&#xff0c;除此之外&#xff0c;还可…