「WebGL-UpandRunning」という本では、非常に劇的な方法でカスタムジオメトリが構築されています。しかし、コードの最後から2行目は、眉をひそめました。コードは次のとおりです。
Saturn.Rings = function ( innerRadius, outerRadius, nSegments ) {
THREE.Geometry.call( this );
var outerRadius = outerRadius || 1,
...snip snip snip...
this.computeCentroids();
this.computeFaceNormals();
this.boundinSphere = { radius: outerRadius };
};
Saturn.Rings.prototype = new THREE.Geometry();
Saturn.Rings.prototype.constructor = Saturn.Rings;
私の質問は、なぜ彼はプロトタイプチェーンでコンストラクターインスタンスを使用するのですか?Saturn.Rings.prototype
から継承する新しい空白のオブジェクトになれないのはなぜTHREE.Geometry.prototype
ですか?継承する価値のあるすべてのものを配置するべきではありませんTHREE.Geometry.prototype
か?なぜ彼はプロトタイプをGeometry-constructorのインスタンスにするのですか?(新しいプロトタイプはのプロトタイプから継承するため、プロトタイプチェーンはまだ正しいことを認識していますTHREE.Geometry
)。
また、上記のコードの2行目では、のインスタンスがコンストラクターSaturn.Rings
を通過しています。したがって、彼らは建設プロセスTHREE.Geometry
から彼らが夢見ることができるすべてを手に入れます。THREE.Geometry
したがって、彼らのプロトタイプに同じことをする必要はありません。
同様のジオメトリがthree.js自体でどのように処理されるかを見てみましょう。
THREE.CubeGeometry = function ( width, height, depth, segmentsWidth, segmentsHeight, segmentsDepth, materials, sides ) {
THREE.Geometry.call( this );
...snip snip snip...
}
this.computeCentroids();
this.mergeVertices();
};
THREE.CubeGeometry.prototype = Object.create( THREE.Geometry.prototype );
きちんとした方法。唯一の問題は、プロトタイプの「コンストラクター」プロパティをに戻すように設定するのを忘れていることですがTHREE.CubeGeometry
、それは別の問題です。