フレームを使用して、<a-assets>
を使用して約114人のメッシュを含むobj
モデルにロードします。その配列内の特定のメッシュを見つけたいとしたら、何度もシーン全体で何度もclone()
を実行します。普通の古いthree.jsを使用して私は最小の努力でこれを行うことができますが、私は<a-entity>
構造でこれを行う方法を見つけることができないようです。私はthis.el.sceneEl.appendChild()
を試しましたが、そのエラーはparameter 1 is not a node
と言っています。私もthis.el.sceneEl.add()
を試しましたが、そのエラーはTrying to add an element that doesn't have an object3D
で出ています。この問題を解決するための最良のアプローチに関する考えはありますか?Aframe - エンティティ内のオブジェクト3Dのクローン
people.js
AFRAME.registerComponent('people', {
schema: {
samplePerson: {default: {}}
},
init: function() {
var el = this.el;
// Listen for when the model is loaded
el.sceneEl.addEventListener('model-loaded', this.loadPersonModel.bind(this));
},
loadPersonModel: function() {
// Update all meshes from the object3D which is made up with 114 child meshes
this.el.object3DMap.mesh.children.forEach(function (obj) {
obj.material.color = new THREE.Color(0xff0000);
obj.visible = false;
});
// Get a sample person for which we will instantiate all over the place
this.data.samplePerson = this.el.object3D.getObjectByName("people_silhouette73");
// Clone ten people throughout the scene
for (var i = 0; i < 10; i++) {
console.log(this.data.samplePerson);
if (this.data.samplePerson) {
var clone = this.data.samplePerson.clone();
clone.visible = true;
// Randomly position the object
clone.position.x += Math.random() * 10;
clone.position.y += 0.01;
clone.position.z = -300 + Math.random() * 25;
// Add the object to the scene
this.el.sceneEl.appendChild(clone);
}
}
}
});
index.htmlを
<a-scene>
<a-assets>
<a-asset-item id="people-obj" src="./assets/obj/silhouette_people_lowpoly_obj.obj"
name="testname"></a-asset-item>
</a-assets>
<a-entity obj-model="obj: #people-obj;" obj-name="person" people></a-entity>
</a-entity>
</a-scene>
素晴らしいコールを...非常にきれいな。もし私が 'n '人をクローンしたいのであれば、' 'の' id'とクローン 'n'人をつかむ新しいコンポーネントを設定すべきですか?また、この新しいコンポーネントで、 'obj-model'の' id'をつかんで、エンティティがすべて作成されたときに完全に削除することをお勧めしますか? –
hotshotiguana
名前のリストを事前に知っていますか?名前のリストから子エンティティを作成するコンポーネントを作成できます。あなたのスキーマは '{names:{default:[]}}'で、 'model-subset-creator ="という名前はperson1、person2、person3; "です。 [ループ内のエンティティの作成例](https://github.com/donmccurdy/aframe-extras/blob/v3.2.5/examples/platforms/index.html#L51-L66)私はモデルを取り除くことをテストするだろう - それほど問題にならないかもしれない。 –
これはうまくいきます: ' 'ですが、次のコンポーネントを' var standingPerson = document.querySelector( '#standing-person')の内部で試してみます。 this.el.appendChild(standingPerson); standingPerson.setAttribute( 'position'、'10 10 10 '); 'シーンにオブジェクトを追加しません。このモデルサブセット「」をランダムな位置で何度も複製する方法に関する考えはありますか? –
hotshotiguana