Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使月球绕地球转,并一起绕太阳转_Javascript_Three.js - Fatal编程技术网

Javascript 如何使月球绕地球转,并一起绕太阳转

Javascript 如何使月球绕地球转,并一起绕太阳转,javascript,three.js,Javascript,Three.js,月球跟随地球围绕太阳的平移,但它不围绕地球平移。 我想保留matrix4方法,所以通过matrix4方法来实现。 我试图改变矩阵乘法的顺序,但没有成功 // Simulation of the solar system window.onload = function() { var scena = new THREE.Scene(); // Set camera var camera = new THREE.PerspectiveCam

月球跟随地球围绕太阳的平移,但它不围绕地球平移。 我想保留matrix4方法,所以通过matrix4方法来实现。 我试图改变矩阵乘法的顺序,但没有成功

// Simulation of the solar system
window.onload = function()
    {
        var scena = new THREE.Scene();

        // Set camera
        var camera = new THREE.PerspectiveCamera(60,window.innerWidth/window.innerHeight,0.1,1000);
        camera.position.x = 1;
        camera.position.y = 1;
        camera.position.z = 10;

        var renderer = new THREE.WebGLRenderer();
        renderer.setSize(window.innerWidth,innerHeight);

        document.body.appendChild(renderer.domElement);

        // Create sun and set geometry
        var sun_geometry = new THREE.SphereGeometry(1,32,32);
        var sun_material = new THREE.MeshLambertMaterial( {color: 0xff0000} );
        var sun = new THREE.Mesh(sun_geometry,sun_material);
        sun.matrixAutoUpdate = false;
        scena.add(sun);

        // Create earth and set geometry
        var earth_geometry = new THREE.SphereGeometry(0.5,32,32);
        var earth_material = new THREE.MeshLambertMaterial( {color: 0x0000ff} );
        var earth = new THREE.Mesh(earth_geometry,earth_material);
        earth.matrixAutoUpdate = false;
        scena.add(earth);

        // Create moon and set geometry
        var moon_geometry = new THREE.SphereGeometry(0.25,32,32);
        var moon_material = new THREE.MeshLambertMaterial( {color: 0x00ffff} );
        var moon = new THREE.Mesh(moon_geometry,moon_material);
        moon.matrixAutoUpdate = false;
        scena.add(moon);

        // set Lights
        var system_light = new THREE.DirectionalLight( 0xffffff, 0.4);
        system_light.position.set(0.5,0,1).normalize();

        var sun_light = new THREE.PointLight( 0xffffff, 1, 100);
        sun_light.position.set(1,1,0).normalize();

        // Add light 
        scena.add(system_light);
        sun.add(sun_light);

        // Rendering
        var render = function()
        {
            // Calculating delta time
            var now = new Date();
            var dt = now-(render.time || now);
            render.time = now; 
            renderer.render(scena,camera);

            var sun_rotation_matrix = new THREE.Matrix4().makeRotationY(0.001*render.time);
            //sun.matrix = sun_rotation_matrix;

            var earth_rotation_matrix = new THREE.Matrix4().makeRotationY(0.002*render.time);
            var earth_translation_matrix = new THREE.Matrix4().makeTranslation(4,0,0);
            earth.matrix = earth_rotation_matrix.multiply(earth_translation_matrix);

            // Problems may be here
            var moon_rotation_matrix = new THREE.Matrix4().makeRotationY(0.004*render.time);
            var moon_translation_matrix = new THREE.Matrix4().makeTranslation(1,0,0);
            moon.matrix = moon_translation_matrix.multiply(earth_rotation_matrix).multiply(moon_rotation_matrix);

            requestAnimationFrame(render);
        }

        render(); // Start rendering
    }

不是将月亮添加到场景中,而是添加到地球中,并更改矩阵的应用顺序:

earth.add(moon);

// ...

moon.matrix = moon_rotation_matrix.multiply(moon_translation_matrix);

[]

three.js不是这样设计的。例如,看一些与中链接的小提琴。我知道,但这是一个练习,我必须使用三个。太棒了,谢谢。我想我现在不明白了,我应该把月球作为地球的孩子添加进去。我强烈建议不要在渲染循环中多次调用
new THREE.Matrix4()