260行代码,用Threejs实现一个太阳系(附源码)
Posted 旺旺学前端
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了260行代码,用Threejs实现一个太阳系(附源码)相关的知识,希望对你有一定的参考价值。
WebGL(Web Graphics Library)是一种3D绘图协议,这种绘图技术标准允许把javascript和OpenGL ES 2.0结合在一起,为html5 Canvas提供硬件3D加速渲染,这样就可以借助系统显卡来在浏览器里更流畅地展示3D场景。由于WebGL 只是非常基础的绘图 API(需要编程人员有很深厚的高等数学,图形学原理方面的积累,而且代码量巨大),实际开发中会借助WebGL库。而Three.js就是一个用Javascript编写的,可以跑在浏览器上的第三方库。它降低了3D开发的门槛,同时大大提升了效率。
开始动手
-
准备一张画布,画布的背景是银河系。
const canvas = document.getElementById('main');
/*画布大小*/
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
-
首先添加一个场景,场景是我们将要渲染的三维空间,相机,光照,网格...等都必须要添加到场景中。
/*scene*/
const scene = new THREE.Scene();
-
场景中添加一个相机,相机用来确定观察位置、方向、角度,相机决定了最终渲染到屏幕上的内容。
/*camera*/
const camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 3000);
camera.position.set(-200, 50, 0);
camera.lookAt(new THREE.Vector3(0, 0, 0));
scene.add(camera);
-
准备渲染器,开始对场景进行渲染
/*renderer*/
const renderer = new THREE.WebGLRenderer({
canvas,
alpha: true,
antialias: true
});
-
添加网格(Mesh)
/*sun*/
const sunMaterial = new THREE.MeshBasicMaterial({
map: loader.load('./img/sun_bg.jpg')
});
const Sun = new THREE.Mesh(new THREE.SphereGeometry(14, 30, 30), sunMaterial);
Sun.name = 'Sun';
SunSystem.add(Sun);
-
用同样的方式添加地球和其他行星,添加完之后是这样的(注:这里为了展示效果,参数没有按照实际的距离和星球大小)。
-
让太阳系动起来
requestAnimationFrame
方法,以每秒60次(60帧)的频率执行重绘(render)。而在
render
方法内部我们可以改变行星的位置(position),体态(rotation)。这样就可以让整个太阳系动起来。
function render(time) {
time *= 0.0005;
SunSystem.rotation.y = -time;
for (var i = 0; i < planets.length; i++) {
planets[i].rotation.y -= planets[i].speed;
const planet = planets[i].children[0];
planet.rotation.y -= 0.1;
}
orbitcontrols.update();
renderer.render(scene, camera);
labelRenderer.render(scene, camera);
requestAnimationFrame(render);
}
-
公转轨道
RingGeometry
实现的。土星的光环也是利用同样的方法,只不过是加载了纹理材质。
const track = new THREE.Mesh(new THREE.RingGeometry(position, position + 0.05, 64, 1), new THREE.MeshBasicMaterial({
side: THREE.DoubleSide
}));
track.rotation.x = - Math.PI / 2;
scene.add(track);
-
利用 BufferGeometry
实现满天繁星
BufferGeometry
BufferGeometry uses named BufferAttributes. Each BufferAttribute represents an array of one type of data: positions, normals, colors, and uv. Together, the added BufferAttributes represent parallel arrays of all the data for each vertex.
BufferGeometry
使用相对复杂,详细可以参考这篇文章,源代码在这里
const particleNum = 100000;
const bufferGeometry = new THREE.BufferGeometry();
const positions = new Float32Array(particleNum * 3);
const colors = new Float32Array(particleNum * 3);
-
End
以上是关于260行代码,用Threejs实现一个太阳系(附源码)的主要内容,如果未能解决你的问题,请参考以下文章
Threejs 的场景查看 - 几个交互事件库助你方便查看场景