ThreeJS 骨架图显示、骨骼修改颜色

ThreeJS 骨架图显示、骨骼修改颜色

郭隆邦_技术博客 http://www.yanhuangxueyuan.com

http://www.yanhuangxueyuan.com/Three.js/

案例

http://www.yanhuangxueyuan.com/threejs/examples

骨架图显示

http://www.yanhuangxueyuan.com/threejs/examples/#webgl_loader_bvh

请添加图片描述

骨架图 显示不同颜色

请添加图片描述

原本是使用 var skeletonHelper = new THREE.SkeletonHelper(SkinnedMesh) 骨架辅助显示,做出的骨架动画。

但查了 SkeletonHelper 并没有查到有设置颜色的方法、参数。

但世上哪有无缘无故的颜色,辅助显示的 一端蓝色、一端绿色 肯定也是代码做的。因此,别怕麻烦,来看源码吧:

  1. 先下载源码,找到 案例里的 html 文件 webgl_loader_bvh.html

    可以看到 它是加载了个 bvh 模型文件,也是使用 SkeletonHelper 显示出的
    请添加图片描述

  2. 往里找
    请添加图片描述

    继续往里找

    请添加图片描述

    找到了

    请添加图片描述

    这不就是在设置颜色么,color1、color2是 蓝色和绿色。

  3. 仔细分析下

    bons是 所有骨骼,for循环中 对每个骨骼 都往colors中扔了3个 数值;

    点到 Color 类中,看 r、g、b 就是 红绿蓝 三原色的值。

    另外 如果 只有 r一个参数,那么就把r当作 十六进制颜色值,这不就简单了。
    请添加图片描述

  4. 那么我们怎么实现修改颜色呢?

    设置颜色的地方可以看到,源码中是使用

    geometry.setAttribute('color', new Float32BufferAttribute(colors, 3));

    来设置颜色的。

    因此 在外面,我们自己生成颜色值。重新设置一遍就可以了

  5. 试一试

    在 外面 html 中,添加我们自己的代码:

    1. bones 已经有了

    2. 新建个 colors 列表,同样 for 循环,设置colors值。 当然 color1、color2 按照我们想要的来设置

    3. 最后 可以通过 skeletonHelper.geometry 获取到 geometry,同样的 setAttribute 设置一下颜色

      需要注意的是,复制出来的代码里 new Color new Float32BufferAttribute 是不行的,需要改成 new THREE.Color()new THREE.Float32BufferAttribute()

    4. 完事!

    5. 测试一下

      我这里是用idea打开的,直接可以在此html上右键,Open in -> Browser -> Chrome 打开

      请添加图片描述

      请添加图片描述

    6. 如果想设置单色。colors.push 的时候,就添加两个一样的颜色即可

      请添加图片描述

    7. 另外 THREE.Color 是支持 16进制颜色代码的

      请添加图片描述

    8. 最后,如果想要 每个bones颜色不同呢?

      请添加图片描述

      这里只是用2取余,区分了下颜色。

      想设置头部颜色、左腿颜色。。。之类的话,思路一样,看一下 bones 一共有多少个,分别是哪个骨骼,对应设置即可。

  6. 总结

    虽然 SkeletonHelper 没有提供设置颜色的方法、参数供我们调用的去设置;

    但既然它设置好了 绿色-蓝色,那就肯定有设置的源码存在。

    找到它、模仿它,就成功了!

    扒源码的快乐~

Three.js 是一个用于 Web 的 JavaScript 3D 形库,它允许开发者在浏览器中创建复杂的三维场景。如果你想在 Three.js 中导入带骨骼(skinning)的 3D 模型,通常这种模型包含的是由顶点、面片以及骨骼信息构成的动画角色。以下是基本步骤: 1. **准备模型文件**:你需要一个支持皮肤绑定(Skinning,也称为动画蒙皮)的 3D 文件格式,如 FBX 或 glTF。这些格式包含了模型几何体、纹理以及关节和权重信息。 2. **加载库**:首先在项目中引入 three.js 和可能需要的额外库,比如 `THREE.GLTFLoader` 或者 `THREE.FBXLoader`,它们能处理不同的模型格式。 ```javascript import * as THREE from 'three'; // 如果使用GLTFLoader import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'; ``` 3. **创建加载器**:根据模型格式选择适当的加载器,并设置回调函数来处理加载完成后的模型。 ```javascript const loader = new GLTFLoader(); loader.load('path_to_your_model_with_skins.gltf', function(gltf) { // 加载完成后... }); ``` 4. **处理加载的模型**: - 获取模型的 `skin` 属性,它通常包含关节(bones)、权重(weights)等信息。 - 创建一个 `THREE.Skeleton` 对象,然后将关节信息添加到骨架中。 - 给模型的每个顶点应用骨骼影响,通过 `skin.clampScale = true;` 来防止缩放异常。 ```javascript const skin = gltf.scene.skins[0]; const skeleton = new THREE.Skeleton(skin.joints, skin.binds); model.traverse((child) => { if (child.isMesh) { child.skeleton = skeleton; child.updateMatrixWorld(true); // 更新世界矩阵 } }); ``` 5. **动画控制**:如果你的模型有预设的动画,可以使用 `skeleton` 对象来播放动画。例如,`skeleton.play('animation_name')`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值