1. 程式人生 > >54 Three.js 使用THREE.PointCloudMaterial(新版本:THREE.PointsMaterial)樣式化粒子

54 Three.js 使用THREE.PointCloudMaterial(新版本:THREE.PointsMaterial)樣式化粒子

var renderer; function initRender() { renderer = new THREE.WebGLRenderer({antialias: true}); //renderer.setClearColor(new THREE.Color(0xEEEEEE, 1.0)); //設定背景顏色 renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); } var
camera; function initCamera() { camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 10000); camera.position.set(0, 0, 200); } var scene; function initScene() { scene = new THREE.Scene(); } var light; function initLight()
{
scene.add(new THREE.AmbientLight(0x404040)); light = new THREE.DirectionalLight(0xffffff); light.position.set(1, 1, 1); scene.add(light); } var cloud; function initModel() { //軸輔助 (每一個軸的長度) var object = new THREE.AxesHelper(500); scene.add(object); //建立THREE.PointCloud粒子的容器
var geometry = new THREE.Geometry(); //建立THREE.PointCloud紋理 var material = new THREE.PointCloudMaterial({size: 4, vertexColors: true, color: 0xffffff}); //迴圈將粒子的顏色和位置新增到網格當中 for (var x = -5; x <= 5; x++) { for (var y = -5; y <= 5; y++) { var particle = new THREE.Vector3(x * 10, y * 10, 0); geometry.vertices.push(particle); geometry.colors.push(new THREE.Color(+randomColor())); } } //例項化THREE.PointCloud cloud = new THREE.PointCloud(geometry, material); scene.add(cloud); } //隨機生成顏色 function randomColor() { var arrHex = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"], strHex = "0x", index; for (var i = 0; i < 6; i++) { index = Math.round(Math.random() * 15); strHex += arrHex[index]; } return strHex; } //初始化效能外掛 var stats; function initStats() { stats = new Stats(); document.body.appendChild(stats.dom); } //使用者互動外掛 滑鼠左鍵按住旋轉,右鍵按住平移,滾輪縮放 var controls; function initControls() { controls = new THREE.OrbitControls(camera, renderer.domElement); // 如果使用animate方法時,將此函式刪除 //controls.addEventListener( 'change', render ); // 使動畫迴圈使用時阻尼或自轉 意思是否有慣性 controls.enableDamping = true; //動態阻尼係數 就是滑鼠拖拽旋轉靈敏度 //controls.dampingFactor = 0.25; //是否可以縮放 controls.enableZoom = true; //是否自動旋轉 controls.autoRotate = false; //設定相機距離原點的最遠距離 controls.minDistance = 20; //設定相機距離原點的最遠距離 controls.maxDistance = 10000; //是否開啟右鍵拖拽 controls.enablePan = true; } //生成gui設定配置項 var gui; function initGui() { //宣告一個儲存需求修改的相關資料的物件 gui = { "size": 4, "transparent": true, "opacity": 0.6, "vertexColors": true, "color": 0xffffff, "sizeAttenuation": true, "rotateSystem": true, redraw: function () { if (cloud) { scene.remove(cloud); } createParticles(gui.size, gui.transparent, gui.opacity, gui.vertexColors, gui.sizeAttenuation, gui.color); //設定是否自動旋轉 controls.autoRotate = gui.rotateSystem; } }; var datGui = new dat.GUI(); //將設定屬性新增到gui當中,gui.add(物件,屬性,最小值,最大值)gui.add(controls, 'size', 0, 10).onChange(controls.redraw); datGui.add(gui, 'transparent').onChange(gui.redraw); datGui.add(gui, 'opacity', 0, 1).onChange(gui.redraw); datGui.add(gui, 'vertexColors').onChange(gui.redraw); datGui.addColor(gui, 'color').onChange(gui.redraw); datGui.add(gui, 'sizeAttenuation').onChange(gui.redraw); datGui.add(gui, 'rotateSystem').onChange(gui.redraw); gui.redraw(); } //生成粒子的方法 function createParticles(size, transparent, opacity, vertexColors, sizeAttenuation, color) { //存放粒子資料的網格 var geom = new THREE.Geometry(); //樣式化粒子的THREE.PointCloudMaterial材質 var material = new THREE.PointCloudMaterial({ size: size, transparent: transparent, opacity: opacity, vertexColors: vertexColors, sizeAttenuation: sizeAttenuation, color: color }); var range = 500; for (var i = 0; i < 15000; i++) { var particle = new THREE.Vector3(Math.random() * range - range / 2, Math.random() * range - range / 2, Math.random() * range - range / 2); geom.vertices.push(particle); var color = new THREE.Color(+randomColor()); //.setHSL ( h, s, l ) h — 色調值在0.0和1.0之間 s — 飽和值在0.0和1.0之間 l — 亮度值在0.0和1.0之間。 使用HSL設定顏色。 //隨機當前每個粒子的亮度 color.setHSL(color.getHSL().h, color.getHSL().s, Math.random() * color.getHSL().l); geom.colors.push(color); } //生成模型,新增到場景當中 cloud = new THREE.PointCloud(geom, material); scene.add(cloud); } function render() { renderer.render(scene, camera); } //視窗變動觸發的函式 function onWindowResize() { camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); render(); renderer.setSize(window.innerWidth, window.innerHeight); } function animate() { //更新控制器 controls.update(); render(); //更新效能外掛 stats.update(); requestAnimationFrame(animate); } function draw() { initRender(); initScene(); initCamera(); initLight(); initModel(); initControls(); initStats(); initGui(); animate(); window.onresize = onWindowResize; }