如何使骨干模型从THREE.Object3D继承原型

时间:2014-09-23 22:24:29

标签: javascript backbone.js three.js underscore.js

我想创建一个具有所有Backbone.Model功能(验证,默认等)的模型,还有另一个原型。具体来说,我希望原型和构造函数来自THREE.Object3d。我使用threejs r69 (最新)

目前我这样做:

var MyObj = new function(){...}
MyObj.prototype = Object.create(THREE.Object3D.prototype);
MyObj.prototype.constructor = THREE.Object3D;

如何在拥有THREE.Object3d原型的同时使MyObj成为Backbone.Model实例,这样我就可以简单地将它添加到场景中,并像普通的THREE.Object3d一样使用它,同时不破坏Backbone 。模型界面?

当我尝试使用时:

var MyObj = Backbone.Model.extend(THREE.Object3D.prototype);

我收到以下错误:

  

DEPRECATED:Object3D的.eulerOrder已移至Object3D的.rotation.order。

     

three.js:7306 Uncaught TypeError:无法读取属性' order'未定义的

有几个属性undefined,但我不确定为什么会这样?为什么旋转未定义?

编辑:看我的小提琴here 。打开控制台以查看错误!

2 个答案:

答案 0 :(得分:1)

我会通过扩展Backbone.Model的prototype然后调用THREE.Object3D的构造函数来实现。这可能发生在:

var Object3DModel = Backbone.Model.extend({

    initialize: function() {
        _(this.prototype).extend(THREE.Object3D.prototype);
        THREE.Object3D.apply(this, arguments);
    }

});

我使用underscore扩展来扩展原型。

您可以看到working jsbin

修改

我只是玩了更多,似乎更好的方法是:

// Start with a constructor, calling the two constructors of the classes
var Object3DModel = function() {
  THREE.Object3D.apply(this, arguments);
  Backbone.Model.apply(this, arguments);
};

// Copy Object3D Prototype
Object3DModel.prototype = new THREE.Object3D();

// Append Backbone.Model prototype
var ref = new Backbone.Model();
for ( var name in ref ) {
  Object3DModel.prototype[name] = ref[name];
}

因为 THREE 库正在使用getter和setter,所以继承它们的正确方法就是这个。

无论如何,我创建了一个JsBin,它已经过测试的基本功能。

答案 1 :(得分:0)

这可能适合你。

var myObj = Backbone.Model.extend(THREE.Object3D.prototype);