2013-08-04 131 views
4

我想擴展Three.js Object3D類,但不知道如何去做。擴展Three.js類

有這個Stackoverflow的問題,我已閱讀,重新閱讀和嘗試,但無法讓它爲我工作。

Is there a way to extend a ThreeJS object?

任何人都可以提供關於如何得到這個去一些特定的代碼?這是我目前所面對的:

var MyObject3D = function() { 
    THREE.Object3D.call(this); 
    MyObject3D.prototype = new THREE.CubeGeometry(); 
    MyObject3D.prototype.constructor = MyObject3D; 
} 

並創建一個實例:

var thing = new MyObject3D(); 
var testGeo = new THREE.CubeGeometry(10, 10, 10); 
var testMat = new THREE.MeshPhongMaterial(); 
var testMesh = new THREE.Mesh(testGeo, testMat); 
thing.add(testMesh); 

但在調用MyObject3D實例的「添加」方法返回一個「東西」有沒有方法「錯誤加。」

這是怎麼回事?

回答

10

您將原型設置爲CubeGeometry,其中沒有添加方法。基於你試圖實例化對象的方式,它看起來像你實際上希望你的對象擁有Mesh原型。

最有可能你想是這樣的:

var MyObject3D = function() { 
    // Run the Mesh constructor with the given arguments 
    THREE.Mesh.apply(this, arguments); 
}; 
// Make MyObject3D have the same methods as Mesh 
MyObject3D.prototype = Object.create(THREE.Mesh.prototype); 
// Make sure the right constructor gets called 
MyObject3D.prototype.constructor = MyObject3D; 

然後初始化它:

var testGeo = new THREE.CubeGeometry(20, 20, 20); 
var testMat = new Three.MeshNormalMaterial(); 
var thing = new MyObject3D(testGeo, testMat); 
+0

謝謝!!當我創建問題時,CubeGeometry只是一個複製/粘貼錯誤,但你仍然解決了我的問題:)我在構造函數中設置了新類的原型。將它移到固定它之外。我很好奇,爲什麼這會有所作爲。 (您可能已經注意到我仍然在Javascript中學習OO。) – John

+1

原型在構造函數運行之前被應用到對象實例,所以當您在構造函數中設置MyObject3D.prototype時,它不會對第一個使用該構造函數實例化的對象。然而,在構造函數運行一次之後,原型會發生變化,因此所有未來的這種類型的對象都將具有您想要的樣式。 (他們都會有所不同,雖然因爲你正在爲每個對象實例化一個新的對象!) – IceCreamYou

+0

我真的有點理解,夠奇怪的。謝謝!! – John