Three.JS, changing the world position of a child 3D object

19,161

Solution 1

EDIT: Answer updated.


You want to change the world position of a child object.

Assuming the scene has no transform applied, one way to do what you want is to use the following pattern:

scene.attach( child ); // detach from parent and add to scene

child.position.set( x, y, z );

parent.attach( child ); // reattach to original parent

The Object3D.attach( child ) method adds the child object, while maintaining the child's world transform.

three.js r.132

Solution 2

This answer might help with the case. Remove child from parent, change normal position, then attach again.

Share:
19,161

Related videos on Youtube

sbadams
Author by

sbadams

Updated on September 16, 2022

Comments

  • sbadams
    sbadams over 1 year

    So basically I have a child object3D of a group Object3D, while the child object's [x,y,z] coordinates are shown relative to the object space of the parent object, I want to change the location of the child object within the 3D space. So first I get the child object's position relative to the world space.

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

    This returns a three element vector of the child's position within the world space. Now I wish to set the position my self. So I create a three element vector.

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

    Provided the function definition for setPosition, it essentially it sets the last three elements of the object's world matrix to the values of the vector passed as an argument, thus changing the location of the object in world space. And to make sure that the matrix updates after these changes, I call the following functions.

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

    Now upon inspecting the new world matrix of the object I noticed that the setPosition function did nothing, nothing at all.

    Why? If real code examples are needed, I will provide them. But the above should represent the application domain and syntax I used very accurately.

  • sbadams
    sbadams over 11 years
    Well that explains why the new position values are not being stored. But it doesn't help in the problem is changing the object's world space position.
  • sbadams
    sbadams over 11 years
    For example, we have two group object both are a ring of 10 cubes and we want a cube from one ring to swap position with a cube from the other ring, we would easily be able to do that by setting the original cube's position to that of the second cube, unfortunately since the cube's position is relative to the origin of the parent object and subjective to any rotations and changes made on that object, setting its local coordinates to the coordinates of the other ring will only send the cube to random location.
  • WestLangley
    WestLangley over 11 years
    Do you want to be able to set the child's position so that after the parent's rotation matrix is applied, the child's new position ends up in a location you specify?
  • zwcloud
    zwcloud about 6 years
    This is not an answer.
  • WestLangley
    WestLangley over 2 years
    Yes, that was an old answer. Answer updated.