如何将场景中的对象添加到网格中而不改变其在three.js中的位置

how to add a object in scene to a mesh without changing its position in three.js

本文关键字:改变 位置 js three 对象 添加 网格      更新时间:2023-09-26

我想保持一个对象在场景中的位置,并想将该对象的父对象从场景更改为任何其他网格http://plnkr.co/edit/fpjsUkOA0rH6FvG4DL6Z?p=preview

在这个例子中,当我试图将球体添加到长方体时,它的position正在改变。我想保持原始位置。尝试删除第35行中的注释,拼写正在向长方体移动。我想保留它的位置并使球体成为长方体的子对象http://plnkr.co/edit/fpjsUkOA0rH6FvG4DL6Z?p=preview

如果问题仅依赖于position,则Brakebein的答案可能是正确的。但如果你还需要恢复scalerotation,那么你应该做这样的东西,我认为:

var inversionMatrix = new THREE.Matrix4();
inversionMatrix.getInverse( parentObject.matrix );
childObject.applyMatrix(inversionMatrix);

如果将球体添加到组中,只需将组的位置从球体的位置减去,即可使其保持在原始世界位置。

  var material = new THREE.MeshLambertMaterial({color: 0x00ff00});
  var boxGeometry = new THREE.BoxGeometry(5, 15, 5);
  var box = new THREE.Mesh(boxGeometry, material);
  var sphereGeometry = new THREE.SphereGeometry( 5, 32, 32 );
  var sphere = new THREE.Mesh(sphereGeometry, material);
  sphere.position.set(0, 10, 0);
  sphere.updateMatrix();
  var group = new THREE.Object3D();
  group.translateX(6);
  group.updateMatrix();
  // if you add sphere to group object
  group.add(box);
  group.add(sphere);
  scene.add(group);
  var m = new THREE.Matrix4().getInverse(group.matrixWorld);
  sphere.applyMatrix(m);
  // if you add sphere to box
  group.add(box);
  box.add(sphere);
  scene.add(group);
  var m = new THREE.Matrix4().getInverse(box.matrixWorld);
  sphere.applyMatrix(m);
  console.log(group.position, sphere.position);