介绍
使用三个。js怎么模拟一个太阳系行星体系?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
<强>概况如下:强>
1, SphereGeometry实现自转的太阳;
2, RingGeometry实现太阳系星系的公转轨道;
3, ImageUtils加载球体和各行星贴图;
4,画布中createRadialGradient实现太阳发光效果;
5,三人。雪碧精灵实现太阳系行星。
//,初始化场景 var scene =, new THREE.Scene ();//,初始化相机,第一个参数为摄像机视锥体垂直视野角度,第二个参数为摄像机视锥体长宽比,//,第三个参数为摄像机视锥体近端面,第四个参数为摄像机视锥体远端面 var camera =, new THREE.PerspectiveCamera(20日,dom.clientWidth /, dom.clientHeight,, 1,, 100000);//,设置相机位置,对应参数分别表示x, y, z位置 camera.position.set (0, 0, 500); var renderer =, new THREE.WebGLRenderer ({ ,,,,,α:,真的, ,,,,,平滑:真实 });
设置场景窗口尺寸,并且初始化控制器,窗口尺寸默认与浏览器窗口尺寸保持一致,最后将渲染器加载到dom中。
//,设置窗口尺寸,第一个参数为宽度,第二个参数为高度 renderer.setSize (dom.clientWidth, dom.clientHeight);//,初始化控制器 var orbitcontrols =, new THREE.OrbitControls(相机,renderer.domElement);//,将渲染器加载到dom中 dom.appendChild (renderer.domElement);
定义太阳及其材质,太阳通过SphereGeometry来实现,通过ImageUtils来导入贴图。
//,定义太阳材质 var sunTexture =, THREE.ImageUtils.loadTexture(& # 39;。/图像/sun_bg.jpg& # 39;,, {},, function (), { ,,,renderer.render(场景,相机); });//,太阳以及太阳材质设定 时间=centerBall new THREE.Mesh (new THREE.SphereGeometry(30日,30日,30),,new THREE.MeshBasicMaterial ({ ,,,地图:sunTexture })); scene.add (centerBall);
太阳发光效果通过雪碧引入帆布渲染的createRadialGradient来实现。
/* * *,实现球体发光 *,@param color 颜色的r, g和b值,比如:“123123123”; *,@returns {元素},返回画布对象 */var generateSprite =, function (颜色),{ ,,var canvas =, document.createElement(& # 39;帆布# 39;); ,,canvas.width =, 16; ,,canvas.height =, 16; ,,var context =, canvas.getContext (& # 39; 2 d # 39;); ,,var gradient =, context.createRadialGradient(时间/canvas.width 2, canvas.height /, 2,, 0,, canvas.width /,,, ,,canvas.height /, 2, canvas.width /, 2); ,,gradient.addColorStop (0,, & # 39; rgba (& # 39;, +, color +, & # 39; (1) & # 39;); ,,gradient.addColorStop (0.2,, & # 39; rgba (& # 39;, +, color +, & # 39; (1) & # 39;); ,,gradient.addColorStop (0.4,, & # 39; rgba (& # 39;, +, color +, & # 39; (6) & # 39;); ,,gradient.addColorStop (1, & # 39; rgba (0, 0, 0, 0) & # 39;); ,,context.fillStyle =,梯度; ,,context.fillRect (0, 0, canvas.width,, canvas.height); ,,return 帆布; };//,添加太阳发光效果 var centerBallLite =, new THREE.Sprite (new THREE.SpriteMaterial ({ ,,,地图:new THREE.CanvasTexture (generateSprite (sunSpriteColor)), ,,混合:THREE.AdditiveBlending })); 时间==centerBallLite.scale.x centerBallLite.scale.y centerBallLite.scale.z =, sunScaleSize; scene.add (centerBallLite);
太阳系各行星公转轨道通过RingGeometry来实现,公转轨道偏移通过位置来实现,行星体系通过三。雪碧来实现。
/* * ,*返回行星轨道的组合体 ,* @param starLiteSize 行星的大小 ,* @param starLiteRadius 行星的旋转半径 ,* @param rotation 行星组合体的x, y, z三个方向的旋转角度 ,* @param speed 行星运动速度 ,* @param imgUrl 行星的贴的图 ,* @param scene 场景 ,* @returns {{卫星:THREE.Mesh,,速度:,*}},卫星组合对象,速度 */var initSatellite =, function (starLiteSize, starLiteRadius,,旋转,速度,imgUrl,,场景),{ var track =, new THREE.Mesh (new THREE.RingGeometry (starLiteRadius, starLiteRadius +, 0.05, 50岁,1),,new THREE.MeshBasicMaterial ()); var centerMesh =, new THREE.Mesh (new THREE.SphereGeometry (1, 1, 1),, new THREE.MeshLambertMaterial());,//材质设定 var starLite =, new THREE.Sprite (new THREE.SpriteMaterial ({ ,,,,地图:,THREE.ImageUtils.loadTexture (imgUrl) })); 时间==starLite.scale.x starLite.scale.y starLite.scale.z =, starLiteSize; starLite.position.set (starLiteRadius, 0, 0); var pivotPoint =, new THREE.Object3D (); pivotPoint.add(蓝锆石); pivotPoint.add(跟踪); centerMesh.add (pivotPoint); null null null null null null null null null null null null null使用three.js怎么模拟一个太阳系行星体系