Object3D子级是否可以更新父级的位置和旋转而不缩放?

时间:2019-06-19 17:28:02

标签: three.js

我正在将Object3D与另一个Object3D作为父对象,后者通过动画来改变位置,旋转和缩放。我希望子对象Object3D相对于父对象的位置和旋转方向移动,但是我根本不希望孩子缩放。这可能吗?我是否可以通过某种方式“锁定”孩子的体重秤,或者覆盖它,因此无论父母是谁,它始终是恒定的体重秤?

最坏的情况是,当对象的缩放比例或变换更新时,是否可以进行某种挂钩或回调,以便我可以监听然后重新缩放对象?

我正在使用parent.add(child)做父母,然后将孩子的位置更新为某个偏移量。

谢谢!

1 个答案:

答案 0 :(得分:1)

类似的东西:

var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 1, 1000);
camera.position.set(0, 5, 10);
camera.lookAt(scene.position);
var renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

scene.add(new THREE.GridHelper(10, 10));

var parentObj = new THREE.Mesh(new THREE.SphereBufferGeometry(1, 16, 8), new THREE.MeshBasicMaterial({
  color: "red",
  wireframe: true
}));
scene.add(parentObj);

var childObj = new THREE.Mesh(new THREE.SphereBufferGeometry(1, 16, 8), new THREE.MeshBasicMaterial({
  color: "blue",
  wireframe: true
}));
childObj.position.set(2, 0, 0);
parentObj.add(childObj);

var clock = new THREE.Clock();
var time = 0;
var scale = 1;
var invScale = 1;


renderer.setAnimationLoop(() => {
  time = clock.getElapsedTime();

  scale = 1 + Math.sin(time) * 0.5 + 0.5;
  invScale = 1 / scale;

  parentObj.scale.setScalar(scale);
  childObj.scale.setScalar(invScale);

  renderer.render(scene, camera)
});
body {
  overflow: hidden;
  margin: 0;
}
<script src="https://threejs.org/build/three.min.js"></script>