Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.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
Three.js 创建行星轨道_Three.js - Fatal编程技术网

Three.js 创建行星轨道

Three.js 创建行星轨道,three.js,Three.js,我想创建一个红环来可视化绿色球体围绕黄色球体的轨道。使用lookat()我已经将环定向到绿色球体,但我不知道如何将环移动到正确的角度 我的剧本: <!doctype html> <html> <head> </head> <body> <div id="container"></div> <!--Load three.js--> <script src="js/three.j

我想创建一个红环来可视化绿色球体围绕黄色球体的轨道。使用lookat()我已经将环定向到绿色球体,但我不知道如何将环移动到正确的角度

我的剧本:

<!doctype html>
<html>
<head>

</head>

<body>
    <div id="container"></div>
  <!--Load three.js-->
  <script src="js/three.js"></script>
  <script src="js/controls/OrbitControls.js"></script>

<script>


    var camera, controls, scene, renderer, raycaster;
    var mouse = new THREE.Vector2();
    init();
    animate();

    function init() {

      scene    = new THREE.Scene();

      raycaster = new THREE.Raycaster();

      renderer = new THREE.WebGLRenderer();
      renderer.setSize(window.innerWidth, window.innerHeight);
      renderer.setClearColor(0x000000);

      var container = document.getElementById( 'container' );
      container.appendChild( renderer.domElement );

      camera   = new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight, 1, 100000000000000000);
      camera.position.z = 30;

      controls = new THREE.OrbitControls( camera, renderer.domElement );
      controls.addEventListener( 'change', render ); 
      controls.enableKeys = false;


      var planet = ["-4067664386091","-710580828973","-3956610895959","2060000",
                    "29476716044","5149291420","-46417511315","2660000",
                    "124056083719","21671373654","16235707106","4810000",
                    "-107354576606","-18753785170","436797007078","18890000",
                    "-639929607985","-111789387758","-1118379774141","57970000",
                    "2907924314427","507985682645","-950946134275","2830000",
                    "-2275005926406","-397421085828","3223734974754","7480000",
                    "-4067664386091","-710580828973","-3956610895959","5110000"]




      for ( var i = 0; i < 7; i ++ ) {
                    var geometry = new THREE.SphereGeometry(5, 32, 32);
                    var material = new THREE.MeshBasicMaterial( {color: 0x09F425} );

                    var mesh = new THREE.Mesh( geometry, material );

                    mesh.position.x = planet[i * 4] / 1000000000;
                    mesh.position.y = planet[i * 4 + 1] / 1000000000;
                    mesh.position.z = planet[i * 4 + 2] / 1000000000;
                    scene.add( mesh );

                    var startPoint   = new THREE.Vector3(0,0,0);
                    var endPoint = new THREE.Vector3(planet[i * 4] / 1000000000,planet[i * 4 + 1] / 1000000000,planet[i * 4 + 2] / 1000000000);
                    var direction = new THREE.Vector3().subVectors(endPoint, startPoint).normalize();
                    var arrow = new THREE.ArrowHelper(direction, startPoint, startPoint.distanceTo(endPoint), 0xCC0000 );
                    scene.add(arrow);

                    <!-- I want this red ring in to show the Orbit of the green Spheres -->

                    var geometry = new THREE.RingGeometry(startPoint.distanceTo(endPoint) - 1, startPoint.distanceTo(endPoint), 32);
                    var material = new THREE.MeshBasicMaterial( { color: 0xCC0000, side: THREE.DoubleSide } );
                    var mesh = new THREE.Mesh( geometry, material );


                    var testPoint = new THREE.Vector3(planet[i * 4] / 1000000000,(planet[i * 4 + 1] / 1000000000)*0.5,planet[i * 4 + 2] / 1000000000);
                    var pos = new THREE.Vector3();
                    pos.addVectors(testPoint, mesh.position);
                    mesh.lookAt(pos);
                    scene.add(mesh);
                    <!--------->



                }


        var geometry = new THREE.SphereGeometry(10, 32, 32);
        var material = new THREE.MeshBasicMaterial( {color: 0xCDF409} );
        var mesh = new THREE.Mesh( geometry, material );

        mesh.position.x = 0;
        mesh.position.y = 0;
        mesh.position.z = 0;
        scene.add( mesh );




      window.addEventListener( 'mousemove', onMouseMove, false );
      window.addEventListener( 'resize', onWindowResize, false );

      }

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


    function onMouseMove( event ) {
            // calculate mouse position in normalized device coordinates
            // (-1 to +1) for both components

            mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
            mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
        }       

    function animate() {
                requestAnimationFrame( animate );
                render();
            }


    function render() {
            // update the picking ray with the camera and mouse position
            raycaster.setFromCamera( mouse, camera );

            // calculate objects intersecting the picking ray
            var intersects = raycaster.intersectObjects( scene.children );

            for ( var i = 0; i < intersects.length; i++ ) {
                //intersects[ i ].object.material.color.set( 0xff0000 );
            }


        renderer.render(scene, camera);
        }
</script>

</body>
</html>

var摄影机、控件、场景、渲染器、光线投射器;
var mouse=new THREE.Vector2();
init();
制作动画();
函数init(){
场景=新的三个。场景();
raycaster=new-THREE.raycaster();
renderer=new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth、window.innerHeight);
renderer.setClearColor(0x000000);
var container=document.getElementById('container');
container.appendChild(renderer.doElement);
摄像头=新的三个透视摄像头(45,window.innerWidth/window.innerHeight,110000000000000);
摄像机位置z=30;
控件=新的三个.轨道控件(摄影机、渲染器.doElement);
控件。addEventListener('change',render);
controls.enableKeys=false;
var planet=[“-4067664386091”、“-710580828973”、“-3956610895959”、“2060000”,
"29476716044","5149291420","-46417511315","2660000",
"124056083719","21671373654","16235707106","4810000",
"-107354576606","-18753785170","436797007078","18890000",
"-639929607985","-111789387758","-1118379774141","57970000",
"2907924314427","507985682645","-950946134275","2830000",
"-2275005926406","-397421085828","3223734974754","7480000",
"-4067664386091","-710580828973","-3956610895959","5110000"]
对于(变量i=0;i<7;i++){
var几何=新的三种。球墨法(5,32,32);
var material=新的三个.MeshBasicMaterial({color:0x09F425});
var mesh=新的三个网格(几何体、材质);
mesh.position.x=行星[i*4]/100000000;
mesh.position.y=行星[i*4+1]/100000000;
mesh.position.z=行星[i*4+2]/100000000;
场景。添加(网格);
var startPoint=新的三个向量3(0,0,0);
var endPoint=new THREE.Vector3(行星[i*4]/100000000,行星[i*4+1]/100000000,行星[i*4+2]/100000000);
var direction=new THREE.Vector3().子向量(endPoint,startPoint).normalize();
var arrow=新的三个.arrow辅助对象(方向、起始点、起始点.distanceTo(端点),0xCC0000);
场景。添加(箭头);
var geometry=new THREE.RingGeometry(起始点.distanceTo(端点)-1,起始点.distanceTo(端点),32);
var material=新的三个.MeshBasicMaterial({color:0xCC0000,side:THREE.DoubleSide});
var mesh=新的三个网格(几何体、材质);
var测试点=新的三点矢量3(行星[i*4]/100000000,(行星[i*4+1]/100000000)*0.5,行星[i*4+2]/100000000);
var pos=新的3.Vector3();
位置添加向量(测试点、网格位置);
目测(pos);
场景。添加(网格);
}
var几何=新的三种。球墨法(10,32,32);
var material=新的三个.MeshBasicMaterial({color:0xCDF409});
var mesh=新的三个网格(几何体、材质);
网格位置x=0;
网格位置y=0;
网格位置z=0;
场景。添加(网格);
addEventListener('mousemove',onMouseMove,false);
addEventListener('resize',onWindowResize,false);
}
函数onWindowResize(){
camera.aspect=window.innerWidth/window.innerHeight;
camera.updateProjectMatrix();
renderer.setSize(window.innerWidth、window.innerHeight);
}
mouseMove函数(事件){
//在标准化设备坐标中计算鼠标位置
//两个组件的-1到+1
mouse.x=(event.clientX/window.innerWidth)*2-1;
mouse.y=-(event.clientY/window.innerHeight)*2+1;
}       
函数animate(){
请求动画帧(动画);
render();
}
函数render(){
//使用相机和鼠标位置更新拾取光线
raycaster.setFromCamera(鼠标、相机);
//计算与拾取光线相交的对象
var intersects=raycaster.intersectObjects(scene.children);
对于(变量i=0;i
如果我没弄错的话

对于轨道,可以有一个粗略的解决方案:

var geometry = new THREE.CircleGeometry(startPoint.distanceTo(endPoint), 128);
geometry.vertices.shift();
geometry.rotateX(-Math.PI / 2);
var material = new THREE.LineBasicMaterial( { color: 0xCC0000 } );
var mesh = new THREE.Line( geometry, material );
然后将你的轨道与它们的行星对齐:

mesh.lookAt(endPoint); // as you calculated endPoint before, then no need to calculate the same for testPoint
例如。如果我从你的问题中漏掉了什么,请澄清。

如果我答对了你

对于轨道,可以有一个粗略的解决方案:

var geometry = new THREE.CircleGeometry(startPoint.distanceTo(endPoint), 128);
geometry.vertices.shift();
geometry.rotateX(-Math.PI / 2);
var material = new THREE.LineBasicMaterial( { color: 0xCC0000 } );
var mesh = new THREE.Line( geometry, material );
然后将你的轨道与它们的行星对齐:

mesh.lookAt(endPoint); // as you calculated endPoint before, then no need to calculate the same for testPoint

例如。如果我在你的问题中遗漏了什么,请澄清。

请将你的代码插入并发布在这里。@Zagoda JSFiddle:你可以用鼠标旋转、缩放和移动请将代码插入并发布在这里。@Zagoda JSFiddle:你可以用鼠标旋转、缩放和移动。这正是我想要的。谢谢。这正是我想要的。