three.js模拟实现太阳系行星体系功能


Posted in HTML / CSS onSeptember 03, 2019

概况如下:

1、 SphereGeometry 实现自转的太阳;

2、 RingGeometry 实现太阳系星系的公转轨道;

3、 ImageUtils 加载球体和各行星贴图;

4、 canvas 中 createRadialGradient 实现太阳发光效果;

5、 THREE.Sprite 精灵实现太阳系行星。

效果图如下:

three.js模拟实现太阳系行星体系功能 

预览地址: three.js模拟实现太阳系行星体系

初始化场景、相机、渲染器,设置相机位置。

// 初始化场景
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({
      alpha: true,
      antialias: true
});

设置场景窗口尺寸,并且初始化控制器,窗口尺寸默认与浏览器窗口尺寸保持一致,最后将渲染器加载到dom中。

// 设置窗口尺寸,第一个参数为宽度,第二个参数为高度
renderer.setSize(dom.clientWidth, dom.clientHeight);
// 初始化控制器
var orbitcontrols = new THREE.OrbitControls(camera,renderer.domElement);
// 将渲染器加载到dom中
dom.appendChild(renderer.domElement);

定义太阳及其材质,太阳通过 SphereGeometry 来实现,通过 ImageUtils 来导入贴图。

// 定义太阳材质
var sunTexture = THREE.ImageUtils.loadTexture('./image/sun_bg.jpg', {}, function () {
    renderer.render(scene, camera);
});
// 太阳以及太阳材质设定
centerBall = new THREE.Mesh(new THREE.SphereGeometry(30, 30, 30), new THREE.MeshBasicMaterial({
    map: sunTexture
}));
scene.add(centerBall);

太阳发光效果通过 Sprite 引入 canvas 渲染的 createRadialGradient 来实现。

/**
* 实现球体发光
* @param color 颜色的r,g和b值,比如:“123,123,123”;
* @returns {Element} 返回canvas对象
*/
var generateSprite = function (color) {
   var canvas = document.createElement('canvas');
   canvas.width = 16;
   canvas.height = 16;
   var context = canvas.getContext('2d');
   var gradient = context.createRadialGradient(canvas.width / 2, canvas.height / 2, 0, canvas.width / 2, 
   canvas.height / 2, canvas.width / 2);
   gradient.addColorStop(0, 'rgba(' + color + ',1)');
   gradient.addColorStop(0.2, 'rgba(' + color + ',1)');
   gradient.addColorStop(0.4, 'rgba(' + color + ',.6)');
   gradient.addColorStop(1, 'rgba(0,0,0,0)');
   context.fillStyle = gradient;
   context.fillRect(0, 0, canvas.width, canvas.height);
   return canvas;
};
// 添加太阳发光效果
var centerBallLite = new THREE.Sprite(new THREE.SpriteMaterial({
   map: new THREE.CanvasTexture(generateSprite(sunSpriteColor)),
   blending: THREE.AdditiveBlending
}));
centerBallLite.scale.x = centerBallLite.scale.y = centerBallLite.scale.z = sunScaleSize;
scene.add(centerBallLite);

太阳系各行星公转轨道通过 RingGeometry 来实现,公转轨道偏移通过 position 来实现,行星体系通过 THREE.Sprite 来实现。

/**
 * 返回行星轨道的组合体
 * @param starLiteSize 行星的大小
 * @param starLiteRadius 行星的旋转半径
 * @param rotation 行星组合体的x,y,z三个方向的旋转角度
 * @param speed 行星运动速度
 * @param imgUrl 行星的贴图
 * @param scene 场景
 * @returns {{satellite: THREE.Mesh, speed: *}} 卫星组合对象;速度
*/
var initSatellite = function (starLiteSize, starLiteRadius, rotation, speed, imgUrl, scene) {
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({
     map: 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(starLite);
pivotPoint.add(track);
centerMesh.add(pivotPoint);
centerMesh.rotation.set(rotation.x, rotation.y, rotation.z);
scene.add(centerMesh);
   return {starLite: centerMesh, speed: speed};
};

将创建好的太阳及行星自转公转体系渲染到场景中,自转和公转通过定时修改 position 值来实现,动画使用 requestAnimationFrame 来实现。

// 执行函数
var render = function () {
    renderer.render(scene, camera);
    centerBall.rotation.y -= 0.01;
    for (var i = 0; i < starLites.length; i++) {
        starLites[i].starLite.rotation.z -= starLites[i].speed;
    }
    orbitcontrols.update();
    requestAnimationFrame(render);
}

总结

以上所述是小编给大家介绍的three.js模拟实现太阳系行星体系功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

HTML / CSS 相关文章推荐
纯CSS3实现图片无间断轮播效果
Aug 25 HTML / CSS
用CSS3的box-reflect设置文字倒影效果的方法讲解
Mar 07 HTML / CSS
CSS中越界问题的经典解决方案【推荐】
Apr 19 HTML / CSS
浅谈CSS3鼠标移入图片动态提示效果(transform)
Nov 06 HTML / CSS
利用CSS3 动画 绘画 圆形动态时钟
Mar 20 HTML / CSS
animation和transition的区别
Oct 12 HTML / CSS
详解移动端HTML5音频与视频问题及解决方案
Aug 22 HTML / CSS
html5定位获取当前位置并在百度地图上显示
Aug 22 HTML / CSS
HTML5拖拉上传文件的简单实例
Jan 11 HTML / CSS
HTML5为输入框添加语音输入功能的实现方法
Feb 06 HTML / CSS
html5实现移动端适配完美写法
Nov 16 HTML / CSS
HTML5 video 上传预览图片视频如何设置、预览视频某秒的海报帧
Aug 28 HTML / CSS
HTML5 3D书本翻页动画的实现示例
Aug 28 #HTML / CSS
详解canvas绘制网络字体几种方法
Aug 27 #HTML / CSS
前端实现打印图像功能
Aug 27 #HTML / CSS
html5 canvas绘制网络字体的常用方法
Aug 26 #HTML / CSS
HTML5超炫酷粒子效果的进度条的实现示例
Aug 23 #HTML / CSS
HTML5语义化元素你真的用对了吗
Aug 22 #HTML / CSS
解决HTML5中滚动到底部的事件问题
Aug 22 #HTML / CSS
You might like
当海贼王变成JOJO风
2020/03/02 日漫
PHP连接MSSQL2008/2005数据库(SQLSRV)配置实例
2014/10/22 PHP
PHP Web表单生成器案例分析
2020/06/02 PHP
仅用[]()+!等符号就足以实现几乎任意Javascript代码
2010/03/01 Javascript
node.js中的fs.utimesSync方法使用说明
2014/12/15 Javascript
DOM基础教程之使用DOM设置文本框
2015/01/20 Javascript
JavaScript判断表单提交时哪个radio按钮被选中的方法
2015/03/21 Javascript
javascript实时获取鼠标坐标值并显示的方法
2015/04/30 Javascript
AngularJS中使用HTML5手机摄像头拍照
2016/02/22 Javascript
浅谈jquery的map()和each()方法
2016/06/12 Javascript
Bootstrap基本插件学习笔记之标签切换(17)
2016/12/08 Javascript
基于bootstrap实现多个下拉框同时搜索功能
2017/07/19 Javascript
Chrome调试折腾记之JS断点调试技巧
2017/09/11 Javascript
一个Vue页面的内存泄露分析详解
2018/06/25 Javascript
vue中子组件调用兄弟组件方法
2018/07/06 Javascript
微信小程序自定义弹窗实现详解(可通用)
2019/07/04 Javascript
vue 开发企业微信整合案例分析
2019/12/02 Javascript
[04:04]DOTA2亚洲邀请赛比赛场馆&酒店全攻略
2017/03/23 DOTA
Linux下用Python脚本监控目录变化代码分享
2015/05/21 Python
python实现爬取千万淘宝商品的方法
2015/06/30 Python
使用Python编写简单的端口扫描器的实例分享
2015/12/18 Python
Python实现矩阵转置的方法分析
2017/11/24 Python
python实现两个文件合并功能
2018/04/01 Python
解决安装python库时windows error5 报错的问题
2018/10/21 Python
python微信好友数据分析详解
2018/11/19 Python
在PyCharm的 Terminal(终端)切换Python版本的方法
2019/08/02 Python
python 引用传递和值传递详解(实参,形参)
2020/06/05 Python
音频处理 windows10下python三方库librosa安装教程
2020/06/20 Python
拉斯维加斯酒店、演出、旅游、俱乐部及更多:Vegas.com
2019/02/28 全球购物
销售员岗位职责范本
2014/02/03 职场文书
高中英语演讲稿范文
2014/04/24 职场文书
政治表现评语
2014/05/04 职场文书
应届大专生自荐书
2014/06/16 职场文书
中学生秋季运动会广播稿
2014/09/21 职场文书
学生偷窃检讨书
2014/09/25 职场文书
2014年团总支工作总结
2014/11/21 职场文书