实现3D 场景——three.js学习篇五之物体贴图

学习目标:

在上一篇中讲到如何在场景中放入多个物体。那么我们来设想一下,如果在放一个大的物体里面包裹着一个小的物体会怎么样呢???然后再给物体的各个面贴上图片会变成什么样呢???

学习内容:

1、 物体贴图
2、 鼠标控制
3、 自动旋转

代码:

<!DOCTYPE html>
<html>
<head>
    <title>贴图</title>
    <style type="text/css">
        body { margin: 0; }
        canvas { width: 100%; height: 100%; }
    </style>
</head>
<body>
	<div id="app"></div>
<script src="./three.js-dev/build/three.js"></script>
<script src="./three.js-dev/examples/js/controls/OrbitControls.js"></script>
<script type="text/javascript"  >
	/*
	创建场景
	*/
	var scene = new THREE.Scene();
	var geometry = new THREE.BoxGeometry( 10, 10, 10 );//创建一个长方体几何对象
	var geometry2 = new THREE.BoxGeometry( 5000000, 5000000, 5000000 );//创建一个长方体几何对象
	
	function loadtexture(url){
		var loder = new THREE.TextureLoader();
		var texture = loder.load(url)
		var basicMaterial = new THREE.MeshBasicMaterial({
			map:texture,
			side:THREE.DoubleSide
			// 前面FrontSide  背面:BackSide 双面:DoubleSide
		})
		return basicMaterial //这个就是图片所造的一个面的材料
	}
	let ary = [
		loadtexture('https://vkceyugu.cdn.bspapp.com/VKCEYUGU-7184a2f2-3b0b-407a-adc8-4d450f35c1e7/33d0ee8b-1d81-4a47-8935-d05393766f30.jpg'),
		loadtexture('https://vkceyugu.cdn.bspapp.com/VKCEYUGU-7184a2f2-3b0b-407a-adc8-4d450f35c1e7/33d0ee8b-1d81-4a47-8935-d05393766f30.jpg'),
		loadtexture('https://vkceyugu.cdn.bspapp.com/VKCEYUGU-7184a2f2-3b0b-407a-adc8-4d450f35c1e7/33d0ee8b-1d81-4a47-8935-d05393766f30.jpg'),
		loadtexture('https://vkceyugu.cdn.bspapp.com/VKCEYUGU-7184a2f2-3b0b-407a-adc8-4d450f35c1e7/33d0ee8b-1d81-4a47-8935-d05393766f30.jpg'),
		loadtexture('https://vkceyugu.cdn.bspapp.com/VKCEYUGU-7184a2f2-3b0b-407a-adc8-4d450f35c1e7/33d0ee8b-1d81-4a47-8935-d05393766f30.jpg'),
		loadtexture('https://vkceyugu.cdn.bspapp.com/VKCEYUGU-7184a2f2-3b0b-407a-adc8-4d450f35c1e7/33d0ee8b-1d81-4a47-8935-d05393766f30.jpg')
	];//按前、后、上、下、左、右的顺序放图片
	let ary2 = [
		loadtexture('https://vkceyugu.cdn.bspapp.com/VKCEYUGU-7184a2f2-3b0b-407a-adc8-4d450f35c1e7/f3790b7e-485e-4ceb-bda7-7e3b44462357.jpg'),
		loadtexture('https://vkceyugu.cdn.bspapp.com/VKCEYUGU-7184a2f2-3b0b-407a-adc8-4d450f35c1e7/f3790b7e-485e-4ceb-bda7-7e3b44462357.jpg'),
		loadtexture('https://vkceyugu.cdn.bspapp.com/VKCEYUGU-7184a2f2-3b0b-407a-adc8-4d450f35c1e7/f3790b7e-485e-4ceb-bda7-7e3b44462357.jpg'),
		loadtexture('https://vkceyugu.cdn.bspapp.com/VKCEYUGU-7184a2f2-3b0b-407a-adc8-4d450f35c1e7/f3790b7e-485e-4ceb-bda7-7e3b44462357.jpg'),
		loadtexture('https://vkceyugu.cdn.bspapp.com/VKCEYUGU-7184a2f2-3b0b-407a-adc8-4d450f35c1e7/f3790b7e-485e-4ceb-bda7-7e3b44462357.jpg'),
		loadtexture('https://vkceyugu.cdn.bspapp.com/VKCEYUGU-7184a2f2-3b0b-407a-adc8-4d450f35c1e7/f3790b7e-485e-4ceb-bda7-7e3b44462357.jpg')
	];//按前、后、上、下、左、右的顺序放图片
	var material = new THREE.MultiMaterial(ary);//因为每个面都贴图片,所以参数是一个数组
	var material2 = new THREE.MultiMaterial(ary2);//因为每个面都贴图片,所以参数是一个数组
	
	var mesh = new THREE.Mesh(geometry,material);//网格模型对象
	scene.add(mesh);//mesh添加到场景中
	var mesh2 = new THREE.Mesh(geometry2, material2); //网格模型对象Mesh
	scene.add(mesh2); //网格模型添加到场景中
	/*
	相机设置
	*/
   var width = window.innerWidth;//窗口宽度
   var height = window.innerHeight;//窗口高度
   var k = width/height;
   var s = 200000000;//三维场景显示范围控制系数,系数越大,显示范围越大
   var camera = new THREE.PerspectiveCamera( 75, k, 1,s );
   //var camera = new THREE.OrthographicCamera( -s*k, s*k,s,-s,1,1000 );
   camera.position.set(30,30,30);//设置相机位置
   camera.lookAt(scene.position);//设置相机方向
   
	/*
	渲染器对象
	*/
	var renderer = new THREE.WebGLRenderer();
	renderer.setSize( window.innerWidth, window.innerHeight );
	//renderer.setClearColor(0xb9d3ff,0.3);//设置背景颜色
	var app = document.getElementById('app')
	app.appendChild( renderer.domElement );
	
	 function render(){	
	 	renderer.render(scene,camera)
	 }//封装一个渲染函数
	
	//设置计时器是防止图片未加载完就执行渲染,图片加载是异步的,如果你注释了这个setTimeout发现没变化,是因为你在自动旋转动画哪里进行了循环的渲染。
	setTimeout(()=>{
		render();
	},100)

	var controls = new THREE.OrbitControls(camera,renderer.domElement);//创建控制对象,把相机作为参数。
	
	controls.addEventListener('change',render);//监听鼠标事件,触发渲染函数。
		
		/*
		物体旋转动画函数
		*/
		var animate = function () {
			requestAnimationFrame( animate );
			
			//scene.rotation.x += 0.001;
			scene.rotation.y += 0.001;
			
			renderer.render( scene, camera );
		};
		animate();

</script>
</body>
</html>

效果图:

实现3D 场景——three.js学习篇五之物体贴图

项目地址:点击跳转


总结:

1、物体贴图的重点代码是下图:
实现3D 场景——three.js学习篇五之物体贴图
1、其中比较重要的是:side:THREE.DoubleSide是指物体里外都贴上图片,如果不写这个属性,默认的话是只贴外面的。
2、然后是六张图片的顺序是按前、后、上、下、左、右的顺序放图片。

上一篇:带泛型的公共类注册


下一篇:记录一次node单创建的性能问题批量组装sql一次发送