Three.js之新手初学——构建魔方

Three.js之新手初学——构建魔方

本人新手,第一次写blog。高手轻喷,新手共勉。
图片示例

Three.js入门步骤就不重新赘述了,网上有很多入门篇。
一般包括:
1.设置three.js渲染器
2.设置摄像机camera
3.设置场景scene
4.设置光源light
5.设置物体object
下面给出一个连接网站:http://www.cnblogs.com/shawn-xie/archive/2012/08/16/2642553.html

这个例子之提供了3*3魔方的构建,只有第一层可以旋转,可以拖动旋转。(用三层group实现)
用这个貌似不好实现魔方的其他旋转变化。

说明一下三维坐标系:
右手坐标系——x轴,屏幕水平向右;y轴,屏幕竖直向上;z轴,垂直屏幕向外。

第一步:添加三个group,用以显示魔方的三层这里写代码片

	var group1 = new THREE.Object3D(),
		group2 = new THREE.Object3D();
		group3 = new THREE.Object3D();
		scene.add(group1);
		scene.add(group2);
		scene.add(group3);

第二步:为每一个group添加九个cube,初始化贴图和位置(通过平移)

//初始化cube的纹理贴图
	function cubeShader(a,b,c,d,e,f){
		var cubeMaterialArray = [];
		if(a==1){//右侧面
			cubeMaterialArray.push(new THREE.MeshBasicMaterial({
				map : new THREE.ImageUtils.loadTexture('Images/red.jpg') <!-- 给每一面上贴图,下同 -->
			}));
		}
		else{
			cubeMaterialArray.push(new THREE.MeshBasicMaterial({
				map : new THREE.ImageUtils.loadTexture('Images/back.jpg')
			}));
		}
		if(b==1){//左侧面
			cubeMaterialArray.push(new THREE.MeshBasicMaterial({
				map : new THREE.ImageUtils.loadTexture('Images/orange.jpg')
			}));
		}
		else{
			cubeMaterialArray.push(new THREE.MeshBasicMaterial({
				map : new THREE.ImageUtils.loadTexture('Images/back.jpg')
			}));
		}
		if(c==1){//上面
			cubeMaterialArray.push(new THREE.MeshBasicMaterial({
				map : new THREE.ImageUtils.loadTexture('Images/yellow.jpg')
			}));
		}
		else{
			cubeMaterialArray.push(new THREE.MeshBasicMaterial({
				map : new THREE.ImageUtils.loadTexture('Images/back.jpg')
			}));
		}
		if(d==1){//下面
			cubeMaterialArray.push(new THREE.MeshBasicMaterial({
				map : new THREE.ImageUtils.loadTexture('Images/white.jpg')
			}));
		}
		else{
			cubeMaterialArray.push(new THREE.MeshBasicMaterial({
				map : new THREE.ImageUtils.loadTexture('Images/back.jpg')
			}));
		}
		if(e==1){//前面
			cubeMaterialArray.push(new THREE.MeshBasicMaterial({
				map : new THREE.ImageUtils.loadTexture('Images/blue.jpg')
			}));
		}
		else{
			cubeMaterialArray.push(new THREE.MeshBasicMaterial({
				map : new THREE.ImageUtils.loadTexture('Images/back.jpg')
			}));
		}
		if(f==1){//后面
			cubeMaterialArray.push(new THREE.MeshBasicMaterial({
				map : new THREE.ImageUtils.loadTexture('Images/green.jpg')
			}));
		}
		else{
			cubeMaterialArray.push(new THREE.MeshBasicMaterial({
				map : new THREE.ImageUtils.loadTexture('Images/back.jpg')
			}));
		}
		return cubeMaterialArray;
	}
	//初始化cube的位置——旋转、平移
	//y没有用
	function initCube(i,x,y,z,cubeMaterialArray){
		var material = new THREE.MeshFaceMaterial(cubeMaterialArray); //材质属性 "\src\materials"	
		cubeArray.push(new THREE.Mesh(geometry[i], material));
		cubeArray[i].position.set(200,0,200);
		cubeArray[i].translateOnAxis(new THREE.Vector3(x,0,z),-200);
	}

第三步:改变group的旋转角度和y值坐标,以显示出立体感

		group2.rotation.x = Math.PI * 0.20;//绕x轴旋转
		group2.rotation.y = -Math.PI * 0.25;//绕y轴旋转
		group2.position.set(-200,400,-200);
		group2.translateOnAxis(new THREE.Vector3(0,1,0),-200);

第四步:添加事件监听

function onDocumentMouseDown( event ) {}
function onDocumentMouseMove( event ) {}
function onDocumentMouseUp( event ) {}
function onDocumentMouseOut( event ) {}

第五步:修正旋转角度

	//修正仅使其旋转九十度的整倍数
	function modify(){
		var isPositive = 1;
		if(targetRotationX < 0)
			isPositive = -1;
		var n2pi = parseInt(isPositive * targetRotationX /(Math.PI * 2) ) * Math.PI *2;
		var remain = isPositive * targetRotationX - n2pi;//保持为正数
		//targetRotationX : origin value is -Math.PI * 0.25
		if(remain < Math.PI * 0.5){
			remain = Math.PI * 0.25 ;//转动90度
		}
		else if(remain < Math.PI * 1.0){
			remain = Math.PI * 0.75 ;//转动180度
		}
		else if(remain < Math.PI * 1.5){
			remain = Math.PI * 1.25;//转动270度
		}
		else if(remain < Math.PI * 2.0){
			remain = Math.PI * 1.75;//转动360度
		}
		targetRotationX = isPositive * (n2pi + remain);
	}

第六步:根据拖动角度渲染出动画效果

	function update(){
	     //horizontal rotation   
		group1.rotation.y += ( targetRotationX - group1.rotation.y ) * 0.1;//修改0.1参数即可看见效果
	}

结语
献丑了!

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
欢迎来到 three.js 的世界!作为一个新手,你可能想知道如何开始使用 three.js。以下是一些基本步骤和资源,帮助你入门: 1. 了解基本概念:three.js 是一个用于创建 3D 图形的 JavaScript 库。在开始之前,你应该了解一些基本概念,如场景(Scene)、相机(Camera)、渲染器(Renderer)、几何体(Geometry)和材质(Material)等。 2. 设置开发环境:确保你已经安装了最新版本的 JavaScript 和 HTML 编辑器,并在你的项目中引入 three.js 库。你可以通过下载库文件或使用 CDN 引入。 3. 创建一个场景:在 three.js 中,你需要创建一个场景来容纳你的 3D 元素。使用 `new THREE.Scene()` 创建一个新的场景对象。 4. 添加相机:相机决定了场景中哪些内容会在渲染器中可见。通过创建一个相机对象,并设置其位置和视角来定义相机的行为。 5. 创建几何体和材质:使用 three.js 提供的几何体和材质类来创建 3D 对象。例如,你可以使用 `new THREE.BoxGeometry(width, height, depth)` 创建一个立方体几何体,并使用 `new THREE.MeshBasicMaterial({color: 0x00ff00})` 创建一个绿色的材质。 6. 创建网格对象:将几何体和材质组合成网格对象,通过 `new THREE.Mesh(geometry, material)` 创建一个网格对象。 7. 添加网格对象到场景中:将网格对象添加到场景中,通过 `scene.add(mesh)` 将网格对象添加到场景中。 8. 创建渲染器:创建一个渲染器对象,并设置其大小和其他相关属性。 9. 渲染场景:使用渲染器的 `render(scene, camera)` 方法将场景渲染到你的 HTML 页面上。 这只是一个入门指南,帮助你快速了解 three.js 的基础知识。为了更深入地学习和探索,你可以查阅官方文档、教程和示例代码。祝你在 three.js 的旅程中玩得愉快!如果你有更多问题,我很乐意回答。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值