基于threejs 搭建web 3D 简单编辑器

<!DOCTYPE html>
<html lang="en">
	<head>
		<title>智雨物联</title>
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
		<style>
			body {
				font-family: Monospace;
				background-color: #f0f0f0;
				margin: 0px;
				overflow: hidden;
			}

			#oldie { background-color: #ddd !important }
		</style>
	</head>
	<body oncontextmenu="return false">
		<div style="position: fixed;top:5%;right:1%;width:10%;height:500px;background: #6699ff;color: #000000">
			<button onclick="empty()" type="button" style="width:100%;height:50px;">鼠标</button>

			<button onclick="cube()" type="button" style="width:100%;height:50px;">矩形</button>

			<button onclick="Sphere()" type="button" style="width:100%;height:50px;">圆形</button>
		</div>
		<script src="js/three.js"></script>
		<script src="js/controls/OrbitControls.js"></script>
		<script src="js/Detector.js"></script>

		<script>

			if ( ! Detector.webgl ) Detector.addGetWebGLMessage();
			//容器  变量
			var container;
			//照相机、场景、控制、渲染器  变量
			var camera, scene,controls,renderer;
			//平面 立方体 变量
			var plane, cube;
			//鼠标 光线投射 shift键 变量
			var mouse, raycaster, isShiftDown = false;
			//选取物体轮廓 材质 变量
			var rollOverMesh, rollOverMaterial;
			//立方体 高度 材质 变量
			var cubeGeo, cubeMaterial;
			//obj数组
			var objects = [];
			
			//初始化
			init();
			//传递函数
			render();

			function init() {
				//容器位置div
				container = document.createElement( 'div' );
				//body加载容器
				document.body.appendChild( container );
				//div属性
				var info = document.createElement( 'div' );
				info.style.position = 'absolute';
				info.style.top = '10px';
				info.style.width = '100%';
				info.style.textAlign = 'center';
				info.innerHTML = '<a href="http://www.krmes.com" target="_blank">IMR-3D Desinger</a>';
				//属性加载
				container.appendChild( info );
				//照相机家里并设定属性
				//距离
				camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 10000 );
				//位置位置
				camera.position.set( 400, 1300, 2300 );
				camera.lookAt( new THREE.Vector3() );

				//建立场景
				scene = new THREE.Scene();

				// roll-over helpers
				//轮廓大小
				rollOverGeo = new THREE.BoxGeometry( 50, 50, 50 );
				//材质
				rollOverMaterial = new THREE.MeshBasicMaterial( { color: 0xff0000, opacity: 0.5, transparent: true } );
				//加载 轮廓 材质
				rollOverMesh = new THREE.Mesh( rollOverGeo, rollOverMaterial );
				//加入到场景
				scene.add( rollOverMesh );

				// obj 模型
				//模型 大小
				objGeo = new THREE.BoxGeometry( 50, 50, 50 );
				//模型 材质
				objMaterial = new THREE.MeshLambertMaterial( { color: 0xfeb74c } ); //, map: new THREE.TextureLoader().load( "textures/square-outline-textured.png" )

				// grid
				//网格 大小 步长
				var size = 1500, step = 100;
				//几何函数
				var geometry = new THREE.Geometry();
				//几何算法完成  复制
				for ( var i = - size; i <= size; i += step ) {

					geometry.vertices.push( new THREE.Vector3( - size, 0, i ) );
					geometry.vertices.push( new THREE.Vector3(   size, 0, i ) );

					geometry.vertices.push( new THREE.Vector3( i, 0, - size ) );
					geometry.vertices.push( new THREE.Vector3( i, 0,   size ) );

				}
				//材质
				var material = new THREE.LineBasicMaterial( { color: 0xa4c2f4, opacity: 1, transparent: true } );
				//加载 大小 材质
				var line = new THREE.LineSegments( geometry, material );
				//加载 到场景
				scene.add( line );

				//投射
				raycaster = new THREE.Raycaster();
				//鼠标 2维函数
				mouse = new THREE.Vector2();
				//几何缓存 
				var geometry = new THREE.PlaneBufferGeometry( 1000, 1000 );
				//算法
				geometry.rotateX( - Math.PI / 2 );
				//面
				plane = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial( { visible: false } ) );
				//加载 到场景
				scene.add( plane );
				//数组加载
				objects.push( plane );

				// Lights
				//环境灯光
				var ambientLight = new THREE.AmbientLight( 0x606060 );
				//加载 灯光
				scene.add( ambientLight );
				//定向 灯光
				var directionalLight = new THREE.DirectionalLight( 0xffffff );
				directionalLight.position.set( 1, 0.75, 0.5 ).normalize();
				scene.add( directionalLight );
				//渲染
				renderer = new THREE.WebGLRenderer( { antialias: true } );
				renderer.setClearColor( 0xf0f0f0 );
				renderer.setPixelRatio( window.devicePixelRatio );
				renderer.setSize( window.innerWidth, window.innerHeight );
				container.appendChild( renderer.domElement );
				 
				 // 视图控制 
				controls = new THREE.OrbitControls( camera, renderer.domElement );
				controls.zoomSpeed = 2;
				
				//鼠标事件监听
				document.addEventListener( 'mousemove', onDocumentMouseMove, false );
				document.addEventListener( 'mousedown', onDocumentMouseDown, false );
				document.addEventListener( 'keydown', onDocumentKeyDown, false );
				document.addEventListener( 'keyup', onDocumentKeyUp, false );

				//
				//窗口监听
				window.addEventListener( 'resize', onWindowResize, false );

			}
			//窗口函数
			function onWindowResize() {

				camera.aspect = window.innerWidth / window.innerHeight;
				camera.updateProjectionMatrix();

				renderer.setSize( window.innerWidth, window.innerHeight );

			}
			//鼠标移动事件 函数
			function onDocumentMouseMove( event ) {

				event.preventDefault();

				mouse.set( ( event.clientX / window.innerWidth ) * 2 - 1, - ( event.clientY / window.innerHeight ) * 2 + 1 );

				raycaster.setFromCamera( mouse, camera );

				var intersects = raycaster.intersectObjects( objects );

				if( rollOverMesh == null) {
					
				}
				else{

					if ( intersects.length > 0 ) {

						var intersect = intersects[ 0 ];

						rollOverMesh.position.copy( intersect.point ).add( intersect.face.normal );
						rollOverMesh.position.divideScalar( 50 ).floor().multiplyScalar( 50 ).addScalar( 25 );

					}

					render();
				}

			}
			//鼠标 点击事件 函数
			function onDocumentMouseDown( event ) {
				//鼠标事件
				event.preventDefault();

				mouse.set( ( event.clientX / window.innerWidth ) * 2 - 1, - ( event.clientY / window.innerHeight ) * 2 + 1 );

				raycaster.setFromCamera( mouse, camera );

				var intersects = raycaster.intersectObjects( objects );

				if( event.button == 2) {
					//删除原有的形状	
					scene.remove( rollOverMesh );
					//延时清空obj
					setTimeout("objempty()",500);
				}

				if( event.button == 0){
					//轮廓不为空时
					if( objGeo != null) {

						if ( intersects.length > 0 ) {

							var intersect = intersects[ 0 ];

							// delete cube
							
							if ( isShiftDown ) {

								if ( intersect.object != plane ) {

									scene.remove( intersect.object );

									objects.splice( objects.indexOf( intersect.object ), 1 );

								}

							// create cube

							} else {

								var voxel = new THREE.Mesh( objGeo, objMaterial );
								voxel.position.copy( intersect.point ).add( intersect.face.normal );
								voxel.position.divideScalar( 50 ).floor().multiplyScalar( 50 ).addScalar( 25 );
								scene.add( voxel );

								objects.push( voxel );

							}

							render();
						}
					}
				}
				
			}
			//键盘keydown事件函数
			function onDocumentKeyDown( event ) {

				switch( event.keyCode ) {

					case 16: isShiftDown = true; break;

				}

			}
			//键盘keyup事件函数
			function onDocumentKeyUp( event ) {

				switch ( event.keyCode ) {

					case 16: isShiftDown = false; break;

				}

			}
			//传递函数
			function render() {

				renderer.render( scene, camera );

			}
			
			//空
			function empty(){

				//删除原有的形状	
				scene.remove( rollOverMesh );

				//延时清空obj
					setTimeout("objempty()",500);
				
			}
			
			//空 清空obj
			function objempty(){
				
				//轮廓大小
				rollOverGeo      = new THREE.BoxGeometry( 50, 50, 50 );
				//材质
				rollOverMaterial = new THREE.MeshBasicMaterial( { color: 0xff0000, opacity: 0.5, transparent: true } );
				//加载 轮廓 材质
				rollOverMesh     = new THREE.Mesh( rollOverGeo, rollOverMaterial );

				// obj 模型
				//模型 大小
				objGeo = null;
				//模型 材质
				objMaterial = null;

			}
			

			//矩形
			function cube(){

				//删除原有的形状	
				scene.remove( rollOverMesh );
				//轮廓大小
				rollOverGeo      = new THREE.BoxGeometry( 50, 50, 50 );
				//材质
				rollOverMaterial = new THREE.MeshBasicMaterial( { color: 0xff0000, opacity: 0.5, transparent: true } );
				//加载 轮廓 材质
				rollOverMesh     = new THREE.Mesh( rollOverGeo, rollOverMaterial );
				//加入到场景
				scene.add( rollOverMesh );

				// obj 模型
				//模型 大小
				objGeo = new THREE.BoxGeometry( 50, 50, 50 );
				//模型 材质
				objMaterial = new THREE.MeshLambertMaterial( { color: 0xfeb74c } ); //, map: new THREE.TextureLoader().load( "textures/square-outline-textured.png" )

			}

			//球体
			function Sphere(){

				//删除原有的形状	
				scene.remove( rollOverMesh );
				//轮廓大小
				rollOverGeo      = new THREE.SphereGeometry( 50, 50, 50 );
				//材质
				rollOverMaterial = new THREE.MeshBasicMaterial( { color: 0xff0000, opacity: 0.5, transparent: true } );
				//加载 轮廓 材质
				rollOverMesh     = new THREE.Mesh( rollOverGeo, rollOverMaterial );
				//加入到场景
				scene.add( rollOverMesh );

				// obj 模型
				//模型 大小
				objGeo = new THREE.SphereGeometry( 50, 50, 50 );
				//模型 材质
				objMaterial = new THREE.MeshLambertMaterial( { color: 0xfeb74c } ); //, map: new THREE.TextureLoader().load( "textures/square-outline-textured.png" )

			}
			
		</script>

	</body>
</html>

 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值