Three.JS, la modification de la position d'un enfant de l'objet 3D
Donc en gros j'ai un enfant object3D d'un groupe Object3D, tandis que l'enfant de l'objet [x,y,z] coordonnées sont indiquées par rapport à l'objet de l'espace de l'objet parent, je veux changer l'emplacement de l'enfant de l'objet dans l'espace 3D. J'ai tout d'abord amener l'enfant la position de l'objet par rapport au monde de l'espace.
var wrld_pos = childobject.matrixWorld.multiplyVector3(new THREE.Vector3);
Cela renvoie à trois éléments de vecteur de la position de l'enfant dans le monde de l'espace. Maintenant je souhaite pour fixer la position de mon auto. J'ai donc créer un à trois éléments du vecteur.
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, pour l'essentiel, il définit les trois derniers éléments de l'objet du monde de la matrice des valeurs du vecteur passé en argument, et donc de changer l'emplacement de l'objet dans l'espace. Et pour s'assurer que la matrice des mises à jour à l'issue de ces modifications, j'appelle les fonctions suivantes.
childobject.matrixWorldNeedsUpdate = true;
childobject.updateMatrixWorld();
Maintenant à l'inspection du nouveau monde de la matrice de l'objet, j'ai remarqué que le setPosition fonction ne fait rien, rien du tout.
Pourquoi? Si les exemples de code sont nécessaires, je vous les fournir. Mais la ci-dessus doivent représenter le domaine de l'application et de la syntaxe, j'ai utilisé de façon très précise.
OriginalL'auteur user1349206 | 2012-09-22
Vous devez vous connecter pour publier un commentaire.
Dans three.js il est préférable de simplement appeler
object.position.set( x, y, z )
,object.rotation.set( ... )
, etobject.scale.set( ... )
, et de ne pas salir avec laobject.matrix
ouobject.matrixWorld
directement, sauf si vous savez vraiment ce que vous faites.Ce qui se passe derrière les scènes, c'est ceci:
La valeur par défaut de
object.matrixAutoUpdate
esttrue
.Ainsi, dans le
render()
fonction,object.matrixWorld
est en cours de mise à jour par la valeur actuelle deobject.postion
, que vous n'avez pas le changement. Donc, pour vous, il semble que rien ne s'est passé.Par exemple, nous avons deux objets de groupe les deux sont un anneau de 10 cubes et nous voulons un cube à partir d'un anneau de position de swap avec un cube de l'autre anneau, on peut facilement être en mesure de le faire en définissant le cube d'origine à celui de la deuxième cube, malheureusement, étant donné que le cube de la position est relative à l'origine de l'objet parent et subjective pour les rotations et changements effectués sur cet objet, réglage ses coordonnées locales pour les coordonnées de l'autre de la bague uniquement envoyer le cube à l'emplacement aléatoire.
Voulez-vous être en mesure de définir la position de l'enfant, de sorte que, après la mère de la matrice de rotation est appliquée, l'enfant de la nouvelle position se retrouve dans un emplacement que vous spécifiez?
Ce n'est pas une réponse.
OriginalL'auteur WestLangley
Ce réponse pourrait aider avec le cas. Retirer les enfants de parent, un changement à la position normale, puis l'attacher de nouveau.
OriginalL'auteur Yevhenii Bahmutskyi