將導入的stl文件加3D效果

效果圖:
在這裏插入圖片描述
要求是要能支持VR眼鏡觀看,就是要能分屏
沒有系統的去學three.js,只是爲了實現效果。
以下代碼只需要更換stl文件就可以。

var scene = new THREE.Scene();//場景容器
		var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);//設置相機,(fov 可視角度,aspect 爲width/height,通常設置爲canvas元素的高寬比,near近端距離,far遠端距離)。只有離相機的距離大於near值,小於far值,且在相機的可視角度之內,才能被相機投影到。
		camera.position.z = 8;//相機位置,數值越大越遠,越小越近
		var renderer = new THREE.WebGLRenderer({//創建渲染器,用來將物體渲染到屏幕上
			antialias: true, //antialias:true/false 是否開啓反鋸齒
			alpha: true //alpha:true/false 是否可以設置背景色透明
		});
		var VrRender = new THREE.StereoEffect(renderer);//VR分屏
		//VrRender.setEyeSeparation(0);設置兩眼的間距
		renderer.setViewport(0, 0, window.innerWidth, window.innerHeight);//調整渲染視角
		renderer.gammaInput = true;//紋理和顏色都會預乘gamma。 默認值是false,大概就是調整一些因爲比例縮放而導致的視覺bug
		renderer.gammaOutput = true;
		renderer.shadowMap.enabled = true;//在場景中使用陰影貼圖,想了解:https://blog.csdn.net/linuxheik/article/details/53842266
		var light = new THREE.AmbientLight(0x404040); //實例環境光源,瞭解:https://blog.csdn.net/qq_30100043/article/details/77203329
		scene.add(light);//向場景添加燈光

顏色預乘是什麼:看這裏
想仔細瞭解的去看gama:看這裏

整段代碼

js文件官網下載就好,我也有上傳了github,需要可以私聊

<!DOCTYPE html>
<html lang="zh">
	<head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
		<meta http-equiv="X-UA-Compatible" content="ie=edge">
		<title>雙屏顯示案例</title>
		<style type="text/css">
			body {
				margin: 0;
			}

			canvas {
				width: 100%;
				height: 100%
			}
			#img{position: absolute;width: 45px;height: 30px;bottom: 30px;right: 50px;z-index: 10;cursor: pointer;}
		</style>
	</head>
	<body>
		<img src="img/panorama_512px_1169773_easyicon.net.png" id="img" />
	</body>
	<script src="js/three.js-master/build/three.js"></script>
	<script src="js/three.js-master/examples/js/effects/StereoEffect.js"></script>
	<script src="js/three.js-dev/examples/js/vr/WebVR.js"></script>
	<script src="js/STLLoader.js"></script>
	<script>
		var scene = new THREE.Scene();//場景容器
		var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);//設置相機,(fov 可視角度,aspect 爲width/height,通常設置爲canvas元素的高寬比,near近端距離,far遠端距離)。只有離相機的距離大於near值,小於far值,且在相機的可視角度之內,才能被相機投影到。
		camera.position.z = 8;//相機位置,數值越大越遠,越小越近
		var renderer = new THREE.WebGLRenderer({//創建渲染器,用來將物體渲染到屏幕上
			antialias: true, //antialias:true/false 是否開啓反鋸齒
			alpha: true //alpha:true/false 是否可以設置背景色透明
		});
		var VrRender = new THREE.StereoEffect(renderer);//VR分屏
		//VrRender.setEyeSeparation(0);設置兩眼的間距
		renderer.setViewport(0, 0, window.innerWidth, window.innerHeight);//調整渲染視角
		renderer.gammaInput = true;//紋理和顏色都會預乘gamma。 默認值是false,大概就是調整一些因爲比例縮放而導致的視覺bug
		renderer.gammaOutput = true;
		renderer.shadowMap.enabled = true;//在場景中使用陰影貼圖,想了解:https://blog.csdn.net/linuxheik/article/details/53842266
		var light = new THREE.AmbientLight(0x404040); //實例環境光源,瞭解:https://blog.csdn.net/qq_30100043/article/details/77203329
		scene.add(light);//向場景添加燈光
		var itsVr=false;//這是我設置的,點擊vr分屏效果,可以用ve眼睛看
		function vrStart(){
			itsVr=!itsVr;
		}
		var animate = function() {
			requestAnimationFrame(animate);

			mesh.rotation.y += 0.01; //動畫轉向,速度0.01
			mesh.rotation.x += 0.01; //動畫轉向
			//mesh.rotation.z+= 0.01;
			if (mesh.rotation.y > Math.PI * 2) {
				mesh.rotation.y -= Math.PI * 2;
			}
			if(itsVr){
				VrRender.setSize(window.innerWidth, window.innerHeight);//設置渲染場景尺寸
				VrRender.render(scene, camera);
			}else{
				renderer.setSize(window.innerWidth, window.innerHeight);//設置渲染場景尺寸
				renderer.render(scene, camera);
			}
			
		};
		document.body.appendChild(renderer.domElement);
		loader = new THREE.STLLoader();
		loader.load('stl/colored.stl', function(geometry) {
			var material = new THREE.MeshPhongMaterial({
				ambient: 0xff5533,
				color: 0xff5533,
				specular: 0x111111,
				shininess: 200
			});
			console.log(geometry);
			mesh = new THREE.Mesh(geometry, material);
			mesh.position.set(0, 0, 0); //設置模型的位置
			mesh.rotation.set(-Math.PI / 2, 0, 0);
			mesh.scale.set(1, 1, 1);
			mesh.castShadow = true;
			mesh.receiveShadow = true;
			scene.add(mesh);

			animate();
		});
		scene.add(new THREE.HemisphereLight(0x443333, 0x111122));

		function addShadowedLight(x, y, z, color, intensity) {

			var directionalLight = new THREE.DirectionalLight(color, intensity);
			directionalLight.position.set(x, y, z);
			scene.add(directionalLight);

			directionalLight.castShadow = true;

			var d = 1;
			directionalLight.shadow.camera.left = -d;
			directionalLight.shadow.camera.right = d;
			directionalLight.shadow.camera.top = d;
			directionalLight.shadow.camera.bottom = -d;
			directionalLight.shadow.camera.near = 1;
			directionalLight.shadow.camera.far = 4;
			directionalLight.shadow.bias = -0.002;
		}
		addShadowedLight(1, 1, 1, 0xffffff, 1.35);
		addShadowedLight(0.5, 1, -1, 0xffaa00, 1);
		document.getElementsByTagName("img")[0].addEventListener('click',vrStart);
	</script>
</html>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章