ThreeJS系列教程-Lesson6

16 篇文章 0 订阅
15 篇文章 0 订阅

效果:

 

代码:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8"/>
		<title>Three.js tutorial - Lesson 06</title>
		<style>body {background: #ffffff;overflow: hidden;color: #999999}</style>
		<script src="js/r69/three.js"></script>
		<script src="js/r69/Detector.js"></script>
		<script src="js/r69/CanvasRenderer.js"></script>
		<script src="js/r69/Projector.js"></script>
	</head>
	<body>
		<div id="overlaytext" style="position: absolute; top: 10px; left: 10px">
			'F'键: 切换纹理滤镜(仅对WebGLRenderer有效)<br>
			'L'键: 切换灯光(仅对WebGLRenderer有效)<br>
			'Z': 绕z轴旋转<br>
			'←': 左旋转<br>
			'→': 右旋转<br>
			'↑': 上翻转<br>
			'↓': 下翻转<br>
			Renderer: 
		</div>
		
		<div id="WebGLCanvas"></div>
		
		<script>
			var scene = new THREE.Scene();
			
			var renderer,WebGLAvailable;
			if(Detector.webgl){
				renderer = new THREE.WebGLRenderer({antialias:true});
				document.getElementById("overlaytext").innerHTML += "WebGLRenderer";
				WebGLAvailable = true;
			}else{
				renderer = new THREE.CanvasRenderer();
				document.getElementById("overlaytext").innerHTML += "CanvasRenderer";
				WebGLAvailable = false;
			}
			renderer.setSize(window.innerWidth-15, window.innerHeight-15);
			// Set the background color of the renderer, with full opacity
			renderer.setClearColor(0xeeeeee, 1);
			document.getElementById("WebGLCanvas").appendChild(renderer.domElement);
			
			var camera = new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight, 1, 100);
			camera.position.set(0, 0, 6);
			camera.lookAt(scene.position);
			scene.add(camera);
			
			var box = new THREE.BoxGeometry(2, 2, 2);
			
			var texture = new THREE.ImageUtils.loadTexture("images/Crate.jpg");
			var material = WebGLAvailable ? new THREE.MeshLambertMaterial({map:texture, side:THREE.DoubleSide}) : new THREE.MeshBasicMaterial({map:texture, side:THREE.DoubleSide});
			
			var mesh = new THREE.Mesh(box, material);
			//mesh.position.set(camera.position.x, camera.position.y, camera.position.z);
			scene.add(mesh);
			
			var ambientLight = new THREE.AmbientLight({color: 0xaaaaaa});
			scene.add(ambientLight);
			
			var directionalLight = new THREE.DirectionalLight({color: 0xffffff});
			directionalLight.position.set(0, 0, 1);
			scene.add(directionalLight);
			
			function render(){
				//mesh.rotation.x += 0.01;
				//mesh.rotation.y += 0.01;
				renderer.render(scene, camera);
				requestAnimationFrame(render);
			}
			render();
			
			var textureFilter = 0;
			var lightIsOn = true;
			document.addEventListener("keydown", function(event){
				var keyCode = event.which;
				
				console.log(keyCode);
				/*切换滤镜*/
				if(keyCode == 70){		//"F"
					switch(textureFilter){
						case 0:
							texture.minFilter = THREE.NearestFilter;	//在纹理基层上执行最邻近过滤,
							texture.magFilter = THREE.NearestFilter;
							textureFilter = 1;
							break;
						case 1:
							texture.minFilter = THREE.LinearFilter;		//在纹理基层上执行线性过滤
							texture.magFilter = THREE.LinearFilter;
							textureFilter = 0;
							break;
					}
					texture.needsUpdate = true;		//告诉WebGL纹理需要更新
				/*切换灯光*/
				}else if(keyCode == 76){		//"L"
					if(lightIsOn){
						mesh.material = new THREE.MeshBasicMaterial({map:texture});
						lightIsOn = false;
					}else{
						if(WebGLAvailable){
							mesh.material = new THREE.MeshLambertMaterial({map:texture});
						}else{
							mesh.material = new THREE.MeshBasicMaterial({map:texture});
						}
						lightIsOn = true;
					}
					mesh.material.needsUpdate = true;		//告诉WebGL材质需要更新
				/*左旋转*/
				}else if(keyCode == 37){		//"←"
					mesh.rotation.y -= 0.01;
				/*上翻转*/
				}else if(keyCode == 38){		//"↑"
					mesh.rotation.x -= 0.01;
				/*右旋转*/
				}else if(keyCode == 39){		//"→
					mesh.rotation.y += 0.01;
				/*下翻转*/
				}else if(keyCode == 40){		//"↓"
					mesh.rotation.x += 0.01;
				/*绕z轴旋转*/
				}else if(keyCode == 90){		//"Z"
					mesh.rotation.z += 0.01;
				}
			}, false);
		</script>
	</body>
</html>

 附注:当前笔者使用的three.js版本是r69

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值