【问题标题】:Threejs rotate an object around another object in 3d matrix axisThreejs在3d矩阵轴中围绕另一个对象旋转一个对象
【发布时间】:2018-11-04 20:13:20
【问题描述】:

现在我可以设置一个轴来旋转。

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

如何在随机轴而不是一个固定轴上旋转对象。

类似的东西

【问题讨论】:

  • 我在问题中包含了您的照片,但我不知道它应该如何帮助我们。也请在问题中包含您的代码。如果你想要答案,你必须帮助人们为你解答。
  • 查看此处以围绕用户定义的轴旋转:.rotateOnAxis

标签: javascript random three.js rotation axis


【解决方案1】:

如果您希望一个对象相对于另一个对象定位,则必须将该对象添加为引用对象的子对象。

使用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>

【讨论】:

    【解决方案2】:

    感谢 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>

    【讨论】:

      猜你喜欢
      • 2018-02-17
      • 2013-05-21
      • 2016-12-14
      • 1970-01-01
      • 2018-04-24
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      • 2016-09-10
      相关资源
      最近更新 更多