Threejs вращают объект вокруг другого объекта по оси 3d матрицы - PullRequest
0 голосов
/ 25 мая 2018

Прямо сейчас я мог бы установить одну ось для вращения.

Working code: 
https://codepen.io/itzkinnu/full/erwKzY

Как повернуть объект по случайной оси вместо одной фиксированной оси.

Примерно так Random rotation

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Спасибо Rabbid76 за быстрый ответ.Это действительно помогло.

Я добавил

child.rotateY (0.02);

к приведенному выше коду в функции анимации, чтобы вращаться по случайной оси.

Могу ли я узнать, как заставить ребенка вращаться самостоятельно?

(function onLoad() {
  var container, loader, camera, scene, renderer, controls, mesh, child;
  
  init();
  animate();

  function init() {
    container = document.getElementById('container');
    
    renderer = new THREE.WebGLRenderer({
      antialias: true
    });
    renderer.setPixelRatio(window.devicePixelRatio);
    renderer.setSize(window.innerWidth, window.innerHeight);
    container.appendChild(renderer.domElement);

    camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 1, 100);
    camera.position.set(0, -4, -1.5);

    loader = new THREE.TextureLoader();
    loader.setCrossOrigin("");

    scene = new THREE.Scene();
    scene.background = new THREE.Color(0xffffff);
    scene.add(camera);
    window.onresize = resize;
    
    var ambientLight = new THREE.AmbientLight(0x404040);
    scene.add(ambientLight);

    var directionalLight = new THREE.DirectionalLight( 0xffffff, 0.5 );
    directionalLight.position.x = -0.75;
    directionalLight.position.y = -0.5;
    directionalLight.position.z = -1;
    scene.add( directionalLight );

    controls = new THREE.OrbitControls(camera, renderer.domElement);
    
    var axis = new THREE.AxesHelper(2);
    scene.add(axis);
    
    var material = new THREE.MeshPhongMaterial({color:'#f08080'});
    var geometry = new THREE.BoxGeometry( 1, 1, 1 );
    mesh = new THREE.Mesh(geometry, material);

    var material2 = new THREE.MeshPhongMaterial({color:'#8080f0'});
    var geometry2 = new THREE.BoxGeometry( 1, 1, 1 );
    child = new THREE.Mesh(geometry2, material2);
    child.position.x = 1.5;

    mesh.add(child);
    scene.add(mesh);
  }

  function resize() {
    var aspect = window.innerWidth / window.innerHeight;
    renderer.setSize(window.innerWidth, window.innerHeight);
    camera.aspect = aspect;
    camera.updateProjectionMatrix();
  }

  function animate() {
  
    child.position.set(0, 0, 0);
    child.rotateY(0.02)
    child.translateX(1.5);

    mesh.position.set(0, 0, 0);
    mesh.rotateZ(0.01);
    mesh.translateX(1.0);
    
    requestAnimationFrame(animate);
    render();
  }

  function render() {
    renderer.render(scene, camera);
  }
})();
<script src="https://threejs.org/build/three.min.js"></script>
<script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script>
<div id="container"></div>
0 голосов
/ 25 мая 2018

Если вы хотите, чтобы объект располагался относительно другого объекта, то этот объект должен быть добавлен как дочерний объект ссылочного объекта.

Используйте Object3D.add для добавления дочернего объекта к объекту.

См. Пример:

(function onLoad() {
  var container, loader, camera, scene, renderer, controls, mesh, child;
  
  init();
  animate();

  function init() {
    container = document.getElementById('container');
    
    renderer = new THREE.WebGLRenderer({
      antialias: true
    });
    renderer.setPixelRatio(window.devicePixelRatio);
    renderer.setSize(window.innerWidth, window.innerHeight);
    container.appendChild(renderer.domElement);

    camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 1, 100);
    camera.position.set(0, -4, -1.5);

    loader = new THREE.TextureLoader();
    loader.setCrossOrigin("");

    scene = new THREE.Scene();
    scene.background = new THREE.Color(0xffffff);
    scene.add(camera);
    window.onresize = resize;
    
    var ambientLight = new THREE.AmbientLight(0x404040);
    scene.add(ambientLight);

    var directionalLight = new THREE.DirectionalLight( 0xffffff, 0.5 );
    directionalLight.position.x = -0.75;
    directionalLight.position.y = -0.5;
    directionalLight.position.z = -1;
    scene.add( directionalLight );

    controls = new THREE.OrbitControls(camera, renderer.domElement);
    
    var axis = new THREE.AxesHelper(2);
    scene.add(axis);
    
    var material = new THREE.MeshPhongMaterial({color:'#f08080'});
    var geometry = new THREE.BoxGeometry( 1, 1, 1 );
    mesh = new THREE.Mesh(geometry, material);

    var material2 = new THREE.MeshPhongMaterial({color:'#8080f0'});
    var geometry2 = new THREE.BoxGeometry( 1, 1, 1 );
    child = new THREE.Mesh(geometry2, material2);
    child.position.x = 1.5;

    mesh.add(child);
    scene.add(mesh);
  }

  function resize() {
    var aspect = window.innerWidth / window.innerHeight;
    renderer.setSize(window.innerWidth, window.innerHeight);
    camera.aspect = aspect;
    camera.updateProjectionMatrix();
  }

  function animate() {
  
    child.position.set(0, 0, 0);
    child.rotateY(0.02)
    child.translateX(1.5);

    mesh.position.set(0, 0, 0);
    mesh.rotateZ(0.01);
    mesh.translateX(1.0);
    
    requestAnimationFrame(animate);
    render();
  }

  function render() {
    renderer.render(scene, camera);
  }
})();
<script src="https://threejs.org/build/three.min.js"></script>
<script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script>
<div id="container"></div>
...