2012-09-22 12 views
3

Donc, fondamentalement, j'ai un objet object3D d'un groupe Object3D, alors que les coordonnées [x, y, z] de l'objet enfant sont affichées par rapport à l'espace objet du parent objet, je veux changer l'emplacement de l'objet enfant dans l'espace 3D. Donc d'abord j'obtiens la position de l'objet enfant par rapport à l'espace du monde.Three.JS, changer la position du monde d'un objet 3D enfant

var wrld_pos = childobject.matrixWorld.multiplyVector3(new THREE.Vector3); 

Ceci renvoie un vecteur à trois éléments de la position de l'enfant dans l'espace mondial. Maintenant, je souhaite définir la position de mon auto. Donc, je crée un vecteur à trois éléments.

var new_pos = THREE.Vector3(); 
new_pos.x = 1; 
new_pos.y = 2; 
new_pos.z = 3; 

childobject.matrixWorld.setPosition(new_pos); 

fourni la définition de fonction pour setPosition, il essentiellement, il définit les trois derniers éléments de la matrice du monde de l'objet aux valeurs du vecteur passé comme argument, changeant ainsi l'emplacement de l'objet dans l'espace mondial. Et pour m'assurer que la matrice se met à jour après ces changements, j'appelle les fonctions suivantes.

childobject.matrixWorldNeedsUpdate = true; 
childobject.updateMatrixWorld(); 

Maintenant, après avoir inspecté la nouvelle matrice mondiale de l'objet je remarquai que la fonction setPosition n'a rien fait, rien du tout.

Pourquoi? Si de vrais exemples de code sont nécessaires, je les fournirai. Mais ce qui précède devrait représenter le domaine d'application et la syntaxe que j'ai utilisé très précisément.

Répondre

8

En Three.js, il est préférable d'appeler juste object.position.set(x, y, z), object.rotation.set(...) et object.scale.set(...), et ne pas salir avec la directement object.matrix ou object.matrixWorld, sauf si vous savez vraiment ce que vous faites.

Ce qui se passe dans les coulisses est ceci:

La valeur par défaut de object.matrixAutoUpdate est true. Par conséquent, dans la fonction render(), object.matrixWorld est mis à jour par la valeur actuelle object.postion, que vous n'avez pas modifiée. Donc, pour vous, il semble que rien ne s'est passé.

+0

Eh bien, cela explique pourquoi les nouvelles valeurs de position ne sont pas stockées. Mais cela n'aide pas dans le problème est de changer la position de l'espace du monde de l'objet. – user1349206

+0

Par exemple, nous avons deux objets de groupe à la fois un anneau de 10 cubes et nous voulons un cube d'un anneau pour échanger la position avec un cube de l'autre anneau, nous pourrions facilement faire cela en réglant la position du cube original à celui du second cube, malheureusement, puisque la position du cube est relative à l'origine de l'objet parent et subjective aux rotations et changements effectués sur cet objet, le réglage de ses coordonnées locales aux coordonnées de l'autre anneau enverra seulement le cube au hasard emplacement. – user1349206

+0

Voulez-vous être en mesure de définir la position de l'enfant de sorte qu'après l'application de la matrice de rotation du parent, la nouvelle position de l'enfant aboutisse à l'emplacement que vous spécifiez? – WestLangley

Questions connexes