How do I rotate some moons around a planet with THREE.js?

后端 未结 2 2171
借酒劲吻你
借酒劲吻你 2020-12-14 15:32

I think this picture best explains my issue:

\"hooray

First I translate the box

相关标签:
2条回答
  • 2020-12-14 15:58

    There are several ways of doing what you want, but I think the easiest is like so:

    // parent
    parent = new THREE.Object3D();
    scene.add( parent );
    
    // pivots
    var pivot1 = new THREE.Object3D();
    var pivot2 = new THREE.Object3D();
    var pivot3 = new THREE.Object3D();
    
    pivot1.rotation.z = 0;
    pivot2.rotation.z = 2 * Math.PI / 3;
    pivot3.rotation.z = 4 * Math.PI / 3;
    
    parent.add( pivot1 );
    parent.add( pivot2 );
    parent.add( pivot3 );
    
    // mesh
    var mesh1 = new THREE.Mesh( geometry, material );
    var mesh2 = new THREE.Mesh( geometry, material );
    var mesh3 = new THREE.Mesh( geometry, material );
    
    mesh1.position.y = 5;
    mesh2.position.y = 5;
    mesh3.position.y = 5;
    
    pivot1.add( mesh1 );
    pivot2.add( mesh2 );
    pivot3.add( mesh3 );
    

    Then in your render loop:

    parent.rotation.z += 0.01;
    

    EDIT: updated fiddle: https://jsfiddle.net/edqf7ugc/

    three.js r.116

    0 讨论(0)
  • 2020-12-14 16:11

    Creating a compound object whose centre will be the point about which the inner objects rotate is one obvious answer, and would be very quick to write. Just create an Object3D and add your box to it.

    A similar approach is covered by this question. It shifts the point of the vertices for an object, so it effectively has a new centre.

    Alternatively, you can mess around with the matrices by hand. Try this:

    var boxGeometry = new THREE.CubeGeometry(boxEdge, boxEdge, boxEdge);
    var mr = new THREE.Matrix4();
    var mt = new THREE.Matrix4();
    mt.setPosition(new THREE.Vector3(0,tubeRadius,0));
    var box1 = new THREE.Mesh( boxGeometry, material );
    box1.applyMatrix(mt);
    var box2 = box1.clone();
    mr.makeRotationZ(2 * Math.PI /3);
    box2.applyMatrix(mr);
    boxes.add(box2);
    var box3 = box1.clone();
    mr.makeRotationZ(4 * Math.PI /3);
    box3.applyMatrix(mr);
    boxes.add(box3);
    boxes.add(box1);
    scene.add( boxes );
    
    0 讨论(0)
提交回复
热议问题