Three.js实现的网站页面金字塔模型显示

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xyzdwf/article/details/78405233

首先就是引入three.js,https://github.com/mrdoob/three.js/下载最新的代码,编译好的three.min.js在build下

<script type="text/javascript" src="three.min.js"></script> 
添加事件需要引入RayCaster的js

			window.onload=function(){
				initTwModel();
			}
			var dom_intersected,dom_oriColor;
			function initTwModel(){
				//Params
				var layerNum=5;//层数
				var layerHeight=30;//层高
				var layerGaps=5;//间隔
				var areaNum=4;//面数
				
				var WIDTH = 400,HEIGHT = 300;
				
				var VIEW_ANGLE = 24,//25
					ASPECT = WIDTH / HEIGHT,
					NEAR = 0.1,
					FAR = 10000;
					
				/* 初始化 */
				var scene = new THREE.Scene();
				var	renderer = new THREE.WebGLRenderer({ alpha: true , antialias: true});
				renderer.shadowMapType=THREE.PCFSoftShadowMap;
				renderer.setSize(WIDTH , HEIGHT);
				document.getElementById("mainCvshd").appendChild(renderer.domElement);
				/* 灯光 */
				var ambientLight=new THREE.AmbientLight("#050505");
				scene.add(ambientLight);
				var spotLight=new THREE.SpotLight(0xffffff);
				spotLight.position.set(100,300,400);
				spotLight.castShadow=true;
				scene.add(spotLight);
				/*相机*/
				var	camera = new THREE.PerspectiveCamera(VIEW_ANGLE, ASPECT, NEAR, FAR); 
				camera.position.set(0,80, 600);//(0,0, 600)
				camera.rotation.x=-0.3;//-0.2
				scene.add(camera);
				/* 显示对象 */
				var verlen,cbarr=[];
				for(var i=0;i<layerNum;i++){
					var oriy=i*(-layerHeight-layerGaps);
					var lenxa=Math.abs(oriy);
					var lenxb=Math.abs(-oriy+layerHeight);
					var cylinder = new THREE.CylinderGeometry(lenxa,lenxb,layerHeight,areaNum,1,false,0,Math.PI*2);
					var material = new THREE.MeshLambertMaterial({color:getRenderColoe(i)});
					var mesh = new THREE.Mesh(cylinder,material);
					mesh.position.set(0,oriy,0);
					mesh.rotation.set(0,-8,0);
					mesh.castShadow=true;
					scene.add(mesh);
					//if(i==0)
					cbarr.push(mesh);

				}
				/*init animation*/
				if(cbarr.length>0){
					(function anime(){
						for(var j=0;j<cbarr.length;j++){
							cbarr[j].rotation.y += 0.01;
						}
						renderer.render(scene, camera);
						return requestAnimationFrame(anime);
					})()
				}
				
				//init Events
				var raycaster = new THREE.RayCaster();
				var mouse = new THREE.Vector2();
				renderer.domElement.addEventListener("mousemove",mousemove);
				function mousemove(e){
					mouse.x = (e.clientX-12) / renderer.domElement.clientWidth*2-1;
					mouse.y = -((e.clientY-12) / renderer.domElement.clientHeight*2)+1;
					raycaster.setFromCamera(mouse,camera);
					var intersects = raycaster.intersectObjects(scene.children);
					var ndom_intersected,ndom_oriColor;
					if(intersects.length){
					    ndom_intersected = intersects[0].object;
						ndom_oriColor = ndom_intersected.material.color.getHex();
						ndom_intersected.material.color.set(0xfffafa);
						if(dom_intersected!=ndom_intersected){
							if(dom_intersected)dom_intersected.material.color.set(dom_oriColor);
							dom_intersected=ndom_intersected;
							dom_oriColor=ndom_oriColor;
						}
					}else{
						if(dom_intersected){
							dom_intersected.material.color.set(dom_oriColor);
							dom_intersected=null;
						}
					}
					
				}
				//init texts

			}
			
			function getRenderColoe(ind){
				var renderColors=[0xFFFF00,0xFE6161,0x92D050,0x00B0F0,0xFFFFCC,0xE2C6FD];
				if(ind<renderColors.length) return renderColors[ind];
				return renderColors[ind%renderColors.length];
				
			}
			
完整的测试代码:https://pan.baidu.com/s/1eSOZwh8



猜你喜欢

转载自blog.csdn.net/xyzdwf/article/details/78405233