threejs中FBX格式模型的加载与克隆

最近根据项目需求需要加载和克隆带动画的FBX模型,但是发现直接用Object.clone方法无法对fbx模型进行克隆,于是查资料解决克隆问题。

废话不多说,直接正题,所需脚本:

<script src="../libs/threer97.js"></script>
<script src="../libs/inflate.min.js"></script>
<script src="../libs/FBXLoader.js"></script>

threer97表示R97版本的threejs,这些文件在官方的demo可以找到,此处不介绍。

下边是官网给出加载fbx模型的例子:

var loader = new THREE.FBXLoader();
    //Samba Dancing idle_2
    loader.load( '../model/fbx/Samba Dancing.fbx', function ( object ) {
        mixers=object.mixer = new THREE.AnimationMixer( object );
        var action = object.mixer.clipAction( object.animations[0]);
        action.play();

        object.traverse( function ( child ) {

            if ( child.isMesh ) {

                child.castShadow = true;
                child.receiveShadow = true;

            }

        } );
        object.scale.set(0.5,0.5,0.5);
        object.position.set(0,0,0);
        scene.add( object );

    } );

现在想克隆这个模型,我先把第一次加载的模型及模型的顶点信息和贴图材质保存在全局变量(scope.personpre,scope.referenceModel)中,留着克隆用,代码变化如下:

var loader = new THREE.FBXLoader();
    loader.load( "../model/fbx/greenmushroom_idle.fbx", function ( object ) {
        object.traverse( function ( child ) {
            scope.mixers=object.mixer = new THREE.AnimationMixer( object );
            var action = object.mixer.clipAction( object.animations[0]);
            action.play();
            if ( child.isMesh ) {
                child.castShadow = true;
                child.receiveShadow = true;
            }
        });
        object.scale.set(0.5,0.5,0.5);
        object.position.set(100,120,30);
        scope.scene.add(object);
        scope.personPre=object;
        scope.referenceModel = object.children[1];
    });

scope是我的一个类索引,大家不用理会,看成window即可,注意最后一行,我们加载的fbx模型它会有一个子元素数组,其中有一个元素存储的是mesh信息,我的模型的mesh在第二个,所以我把它取出来保存,如不明白,可以参考下图:

image

其中的红线标出的才是模型显示的关键。

接下来就是克隆,需要用上一步保存的顶点和贴图信息 new一个新的mesh,赋值给用预制体克隆的person,person才会绘制到屏幕上:

var scope=this;
var refObject = this.referenceModel;
var mesh=new THREE.Mesh( refObject.geometry, refObject.material );
mesh.position.set(0,0,10);
mesh.scale.set(0.2,0.2,0.2);
mesh.rotation.x=-0.25*Math.PI;
var person=this.personPre.clone();
person.animations=this.clip;
person.children[1]=mesh;
person.traverse( function ( child ) {
        if ( child.isMesh ) {
            child.castShadow = true;
            child.receiveShadow = true;
        }
});
this.scene.add( person );

20181029150644226.gif

大功告成,此方法的缺点是所有的克隆模型共用一个动画,无法单独控制动画,后续改进正在研究,小弟不才,如有疏漏,多多指导。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容