2016-06-19 7 views
0

私はThree.jsで遊んでいて、太陽系の(単純な!)モデルを作っています。私はこれは私がこれまでにしようとしていたものである、惑星や衛星を構築するためにコンストラクタ関数を作成しようとしていますが、私はエラーが言ってます:コンストラクタ関数のためにTHREE.Meshクラスを拡張する方法

setShadowは()関数ではありません。

var body = function(size, color) { 
    this.sphere = new THREE.Mesh(new THREE.SphereGeometry(size, 32, 32), 
           new THREE.MeshLambertMaterial({color:color})) 
    return this.sphere 
} 

body.prototype = Object.create(THREE.Mesh.prototype); 
body.prototype.constructor = body; 

body.prototype.setShadow = function() { 
    this.sphere.castShadow = true 
    this.sphere.receiveShadow = true 
} 

あるいは、IはTHREE.SphereGeometry = geometryTHREE.MeshLambertMaterial = materialは、コンストラクタ関数の外に定義されているTHREE.MESH.call(this, geometry, material)を用いて試みました。これは特に私がThree.jsを心配する必要があるのですか、それとも私はこれに間違って近づいていますか?

編集:オルタナティブ試み - >

var body = function() { 
     THREE.Mesh.call(this) 
     return this 
    } 

    body.prototype.setShadow = function() { 
     this.castShadow = true 
     this.receiveShadow = true 
     return this 
    } 
    body.prototype = Object.create(THREE.Mesh.prototype); 
    body.prototype.constructor = body; 

    var example = new body(new THREE.SphereGeometry(70, 32, 32), new THREE.MeshLambertMaterial({color:this.getRandColor()})) 

すべてが正しく継承するように思えるが、私はsetShadow機能が正しく動作していない理由として困惑していますか?

EDIT 2:.call(this)をしようとしたときに、実際にこのエラーを得た:

this.updateMorphTargets THREE.Meshクラスを拡張しながら、あなたのコンストラクタでミスを犯した機能

答えて

1

ではありません。

var Body = function(size, color) { 
    THREE.Mesh.call(
     this, 
     new THREE.SphereGeometry(size, 32, 32), 
     new THREE.MeshLambertMaterial({color:color}) 
    ); 
} 

Body.prototype = Object.create(THREE.Mesh.prototype); 
Body.prototype.constructor = Body; 

作成されたオブジェクトが自動的に返されますので、コンストラクタで何かを返すする必要はありません。

は次のように試してみてください。

そして、あなたのsetShadow方法であなたは、単にプロパティcastShadowreceiveShadow以来thisを指す必要がありますが(THREE.Meshを通じてTHREE.Object3Dから継承)新しく作成したBodyクラスの直接のプロパティです。

Body.prototype.setShadow = function() { 
    this.castShadow = true; 
    this.receiveShadow = true; 
} 

また、私のコードでは、私はBodybodyを変更して、あなたのコンストラクタの最初の文字を大文字を使用することをお勧めします。それに応じて他のすべての参照の名前を変更してください。

Here a demonstration in a fiddle

+0

(.setShadow私は、このソリューションを実装してもエラーは、「身体のインスタンス」と言ってます)関数ではありません。しかし、私がcastShadowとreceiveShadow = trueを設定してもうまく動作します。 – bpr

+0

@bpr私はそれを試してみました(https://jsfiddle.net/ry04qqk5/)、それは私のためにうまくいきます。 – Wilt

+0

お詫び申し上げます、私は本体のプロトタイプを設定する前にプロトタイプにsetShadowを追加しました!今すぐご利用ください!本当にありがとう – bpr

関連する問題