three.js学习二

物体:
物体由两部分组成,材质和形状
形状:
物体的形状,球体,正方体,线条,粒子等
直线线条:

var material = new THREE.LineBasicMaterial({//这是线段材质
	color: 0x0000ff
});

var points = [];//折线端点
points.push( new THREE.Vector3( - 10, 0, 0 ) );
points.push( new THREE.Vector3( 0, 10, 0 ) );
points.push( new THREE.Vector3( 10, 0, 0 ) );

var geometry = new THREE.BufferGeometry().setFromPoints( points );
//折线段
var line = new THREE.Line( geometry, material );
scene.add( line );

曲线:
曲线就是把将线条拆分成许多个直线段连接,达到曲线的效果

var curve = new THREE.EllipseCurve(//椭圆
	0,  0,            // ax, aY 圆心
	10, 20,           // xRadius, yRadius椭圆长宽,设置相等即为一个圆
	0,  2 * Math.PI,  // aStartAngle, aEndAngle开始弧度,结束弧度
	false,            // aClockwise是否顺时针绘制
	0                 // aRotation 旋转角度
);

var points = curve.getPoints( 50 );//拆分
var geometry = new THREE.BufferGeometry().setFromPoints( points );

var material = new THREE.LineBasicMaterial( { color : 0xff0000 } );

// Create the final object to add to the scene
var ellipse = new THREE.Line( geometry, material );

还有其他的曲线如贝塞尔曲线,具体信息请查阅官网three.js

2D:
2D和3D的图形基本都有BufferGeometry和Geometry两种类型,Geometry是BufferGeometry的一种用户友好的替代方法。更易于阅读和编辑,但效率不如BufferGeometry。BufferGeometry适用于大型或严格的项目。二者使用方法都差不多。

类型 用法
平面几何 THREE.PlaneGeometry( 5, 20, 10 ,10);
圆几何 THREE.CircleGeometry( 5, 32 ,0,2*PI)
环形几何 THREE.RingGeometry( 1, 5, 32, 8 , 0 , 2*PI )
多边形几何 THREE.ShapeGeometry( shape )shape为多边形

平面几何:

var geometry = new THREE.PlaneGeometry(10, 20, 32, 32);
//x轴长度(宽),y轴长度(高)
//x轴切片数,y切片数  默认值都为1 ,可不写
var material = new THREE.MeshBasicMaterial({
		color: 0xffff00,
});
var plane = new THREE.Mesh(geometry, material);
scene.add(plane);

圆几何:

var geometry = new THREE.CircleGeometry( 5, 32,0,2*Math.PI );
//半径,
//切片数,最小值为3,默认值为8,一般设置为32比较像一个圆,太小了看起来像多边形
//画圆开始的地方 ,可不写
//总弧度,0-2*PI,2*PI表示一个完整的圆 ,可不写
var material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );
var circle = new THREE.Mesh( geometry, material );
scene.add( circle );

环形几何:

var geometry = new THREE.RingGeometry(1, 5, 32, 8, 0, 2 * Math.PI);
//内圈半径,默认值为0.5
//外圈半径,默认值为1
//切片数,最小值为3,默认值为8,一般设置为32比较像一个圆,太小了看起来像多边形
//纵方向的切片数,就是外圈到内圈方向,最小值为1.默认值为8,可不写
//开始的位置,默认为0 ,可不写
//总弧度,0-2*PI,2*PI表示一个完整的圆,默认为完整的圆 ,可不写
var material = new THREE.MeshBasicMaterial({
	color: 0xffff00,
});
var mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);

多边形几何:
即自定义几何形状

var x = 0, y = 0;
var heartShape = new THREE.Shape();
//创建一个形状
heartShape.moveTo( x + 5, y + 5 );
heartShape.bezierCurveTo( x + 5, y + 5, x + 4, y, x, y );
heartShape.bezierCurveTo( x - 6, y, x - 6, y + 7,x - 6, y + 7 );
heartShape.bezierCurveTo( x - 6, y + 11, x - 3, y + 15.4, x + 5, y + 19 );
heartShape.bezierCurveTo( x + 12, y + 15.4, x + 16, y + 11, x + 16, y + 7 );
heartShape.bezierCurveTo( x + 16, y + 7, x + 16, y, x + 10, y );
heartShape.bezierCurveTo( x + 7, y, x + 5, y + 5, x + 5, y + 5 );	
//画出图形		
var geometry = new THREE.ShapeGeometry( heartShape );
//创建几何
var material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
var mesh = new THREE.Mesh( geometry, material ) ;
scene.add( mesh );

var heartShape = new THREE.Shape();
Shape()共有以下几种绘画方式:

.moveTo ( x : Float, y : Float ) :
创建一个新路径,并把画笔位置移到固定位置
.lineTo ( x : Float, y : Float ) : this
画一个直线
.quadraticCurveTo ( cpX : Float, cpY : Float, x : Float, y : Float ) : this
二次贝塞尔曲线
.bezierCurveTo ( cp1X : Float, cp1Y : Float, cp2X : Float, cp2Y : Float, x : Float, y : Float ) : this
贝塞尔曲线
.splineThru ( points : Array ) : this
将曲线数组连接到当前路径

3D:

类型 用法
长方体 THREE.BoxGeometry( 1, 1, 1 )
四面体 THREE.TetrahedronGeometry( 10,0)
八面体 THREE.OctahedronGeometry( 10,0 )
十二面体 THREE.DodecahedronGeometry(10,0 )
二十面体 THREE.DodecahedronGeometry(10,0 )
球体 THREE.SphereGeometry( 5, 32, 32 )
圆柱体 THREE.CylinderGeometry(5,5,20)
圆锥体 THREE.ConeGeometry(5,5,20)
圆环几何 THREE.TorusGeometry( 10, 3, 16, 100 );
管道体 THREE.TubeGeometry( path, 20, 2, 8, false )
圆环结 THREE.TorusKnotGeometry( 10, 3, 100, 16 )
车床几何 THREE.LatheGeometry( points )
挤压几何 THREE.ExtrudeGeometry( shape, extrudeSettings )
参数几何 THREE.ParametricGeometry(function, slices, stacks)
文字 THREE.TextGeometry(‘Hello three.js!’,option)

长方体:

var geometry = new THREE.BoxGeometry( 10, 10, 10, 1, 1, 1 );
//width —宽度;即,平行于X轴的边的长度。可选的; 默认值为1
//height —高度;即,平行于Y轴的边缘的长度。可选的; 默认值为1
//depth —深度;默认为1 。即,平行于Z轴的边的长度。可选的; 默认为1
//widthSegments —沿边的宽度分割的矩形面的数量。可选的; 默认为1
//heightSegments —沿边的高度分割的矩形面的数量。可选的; 默认值为1
//depthSegments —沿边的深度分割的矩形面的数量。可选的; 默认为1。
var material = new THREE.MeshBasicMaterial( {color: 0x00ff00} );
var cube = new THREE.Mesh( geometry, material );
scene.add( cube );

四面体:

var geometry = new THREE.TetrahedronGeometry( 10,0);
//直径
//默认值为0,int 当值不为0时是其他的多面体,取值为5以上接近于一个球体
var material = new THREE.MeshBasicMaterial( {color: 0x00ff00} );
var cube = new THREE.Mesh( geometry, material );
scene.add( cube );

八面体:

var geometry = new THREE.OctahedronGeometry( 10,0);
//使用方法和参数与四面体一样,接近于球体的指数不一样而已

十二面体和二十面体同理:

var geometry = new THREE.DodecahedronGeometry( 10,0);
//十二面体

var geometry = new THREE.IcosahedronGeometry( 10,0);
//二十面体

球体:

var geometry = new THREE.SphereGeometry( 15, 32, 32 );
//radius —球体半径。默认值为1 所有值都为可选
//widthSegments —水平线段数。最小值为3,默认值为8,不同半径取不同值趋近于圆,一般取值32即可趋近于圆
//heightSegments —垂直线段数。最小值为2,默认值为6,取值32趋近于圆
//phiStart-指定水平起始角度。默认值为0
//phiLength-指定水平扫角大小。默认值为Math.PI *2
//thetaStart-指定垂直起始角度。默认值为0
//thetaLength-指定垂直扫角大小。默认值为Math.PI*2。
//通过绕Y轴(水平扫描)和Z轴(垂直扫描)扫掠并计算顶点来创建几何。因此,可以通过使用phiStart,phiLength,thetaStart和thetaLength的不同值来创建不完整的球体(类似于“球体切片”),以便定义我们开始(或结束)计算这些顶点的点。
var material = new THREE.MeshBasicMaterial( {color: 0xffff00} );
var sphere = new THREE.Mesh( geometry, material );
scene.add( sphere );

圆柱体:

var geometry = new THREE.CylinderGeometry(5,5,20,32,1,false,0,2*MATH.PI);
//radiusTop —圆柱顶部的半径。默认值为1,取0则为圆锥
//radiusBottom —底部圆柱的半径。默认值为1
//height —圆柱体的高度。默认值为1
//radiusSegments—圆柱周围的分段面数。默认值为8,取值大小决定是否接近圆
//heightSegments —沿着圆柱体高度的面的行数。默认值为1
//openEnded —布尔值,指示圆柱体的端部是开放的还是封闭的。默认值为false,表示封闭
//thetaStart —第一段的起始角度,默认为0(三点钟位置)。
//thetaLength —圆形扇区的中心角,通常称为theta。默认值为2 * Pi,完整的圆柱体。
var material = new THREE.MeshBasicMaterial( {color: 0xffff00} );
var cylinder = new THREE.Mesh( geometry, material );
scene.add( cylinder );

圆锥体:

var geometry = new THREE.ConeGeometry( 5,20,32,1,false,0,2*MATH.PI);
//取值和圆柱一样,没有上半径
var material = new THREE.MeshBasicMaterial( {color: 0xffff00} );
var cone = new THREE.Mesh( geometry, material );
scene.add( cone );

圆环几何:

var geometry = new THREE.TorusGeometry( 10, 3, 16, 100 );
//radius-圆环的半径,从圆环的中心到管的中心。默认值为1
//tube —管的半径。默认值为0.4。
//radiusSegments —默认值为8,设置为2则为平面环形
//tubularSegments —默认值为6,趋近于圆
//arc—中心角。默认值为Math.PI * 2。
var material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );
var torus = new THREE.Mesh( geometry, material );
scene.add( torus );

管道体:

function CustomSinCurve( scale ) {
	THREE.Curve.call( this );
	this.scale = ( scale === undefined ) ? 1 : scale;
}

CustomSinCurve.prototype = Object.create( THREE.Curve.prototype );
CustomSinCurve.prototype.constructor = CustomSinCurve;
CustomSinCurve.prototype.getPoint = function ( t ) {
	var tx = t * 3 - 1.5;
	var ty = Math.sin( 2 * Math.PI * t );
	var tz = 0;
	return new THREE.Vector3( tx, ty, tz ).multiplyScalar(this.scale );
};
//声明了一个CustomSinCurve类,这个类继承自THREE.Curve类,然后重写了类的getPoint方法。
//在THREE.Curve类中getPoint方法的描述:返回在曲线中给定位置 t 的向量
var path = new CustomSinCurve( 10 );
var geometry = new THREE.TubeGeometry( path, 20, 2, 8, false );
//path — Curve - (曲线,路径,即管道的形状)
//tubularSegments — Integer - default is 64(管道分成多少段)
//radius — Float -  default is 1(管道的半径)
//radialSegments — default is 8 (管道口分成多少段,即管道口是几边形)
//closed —  default is false (是否闭合管道,首尾相接的意思)
var material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
var mesh = new THREE.Mesh( geometry, material );
scene.add( mesh );

圆环结:

var geometry = new THREE.TorusKnotGeometry( 10, 3, 100, 16 ,5,7);
//radius-圆环的半径。默认值为1。
//tube —管的半径。默认值为0.4。
//LinearSegments —默认值为64。
//radiusSegments —默认为8。
//p —该值确定几何体绕其旋转对称轴缠绕多少次。默认值为2。
//q-该值确定几何体在圆环内部绕一圈缠绕多少次。默认值为3。
//如果p和q不互质,则结果将为环面链接。
var material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );
var torusKnot = new THREE.Mesh( geometry, material );
scene.add( torusKnot );

车床几何:
创建具有轴向对称性的网格(如花瓶)。车床绕Y轴旋转

var points = [];
for ( var i = 0; i < 10; i ++ ) {
	points.push( new THREE.Vector2( Math.sin( i * 0.2 ) * 10 + 5, ( i - 5 ) * 2 ) );
}
//点集合,形成曲线
var geometry = new THREE.LatheGeometry( points );
var material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );
var lathe = new THREE.Mesh( geometry, material );
scene.add( lathe );

挤压几何:
将2D形状拉伸为3D几何形状

var length = 12, width = 8;
var shape = new THREE.Shape();
shape.moveTo( 0,0 );
shape.lineTo( 0, width );
shape.lineTo( length, width );
shape.lineTo( length, 0 );
shape.lineTo( 0, 0 );
var extrudeSettings = {
	curveSegments : 16,//曲线上的点数。默认值为12。
	steps: 2,//用于沿拉伸样条深度切片。默认值为1。
	depth: 16,//深度以挤压形状。默认值为100
	bevelEnabled: true,//将斜角应用于形状。默认为true。
	bevelThickness: 6,//斜角进入原始形状的深度。默认值为6。
	bevelSize: 1,//与斜角延伸的形状轮廓的距离。默认值为bevelThickness-2。
	bevelOffset: 0,//距斜角起始形状轮廓的距离。默认值为0。
	bevelSegments: 1,//斜角层数。默认值为3。趋近圆润
	//extrudePath: 1,//THREE.Curve。3D样条线路径,应沿着该路径拉伸形状。路径拉伸不支持斜角。
	//UVGenerator —对象。提供UV generator functions
};
var geometry = new THREE.ExtrudeGeometry( shape, extrudeSettings );
var material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
var mesh = new THREE.Mesh( geometry, material ) ;
scene.add( mesh );

参数几何:
可以根据传入的公式,计算出相应的几何体

var radialWave = function (u, v) {
	var r = 50;	
	var x = Math.sin(u) * r;
	var z = Math.sin(v / 2) * 2 * r;
	var y = (Math.sin(u * 4 * Math.PI) + Math.cos(v * 2 * Math.PI)) * 2.8;	
	return new THREE.Vector3(x, y, z);
};
var geometry = new THREE.ParametricGeometry( radialWave, 25, 25 );
//slices	该属性定义u值应该分成多少份
//stacks	该属性定义v值应该分成多少份
var material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
var radialWave= new THREE.Mesh( geometry, material );
scene.add( radialWave);

可以参考更多

文字:
THREE.js通过把文字设成Geometry类来创建三维文字
需要用到THREE.FontLoader()函数来加载字体文件,字体文件需要下载同一项目文件夹下

var loader = new THREE.FontLoader();
var geometry;
loader.load('helvetiker_regular.typeface.json',//下载好的字体文件
//加载好字体后创建三维文字
	function(font) {
	geometry = new THREE.TextGeometry('Hello three.js!', {//文字
		font: font,
		size: 50,//字体大小
		height: 5,//挤出文字的厚度。默认值为50
		curveSegments: 12,//曲线上的点数。默认值为12。
		bevelEnabled: true,//打开斜角。默认值为False
		bevelThickness: 10,//文字斜角的深度如何。默认值是10。
		bevelSize: 8,//距文字轮廓多远是斜角。默认值为8。
		bevelSegments: 5//斜角段的数量。默认值为3。
	});
	//创建材质
var meshMaterial = new THREE.MeshNormalMaterial({
	flatShading: THREE.FlatShading,
	transparent: true,
	opacity: 0.9
});
var mesh = new THREE.Mesh(geometry, meshMaterial);
mesh.position.set(-300, 0, 0);
scene.add(mesh);
},
//加载进度
function(xhr) {
	console.log((xhr.loaded / xhr.total * 100) + '% loaded');
		},
		//出现错误
function(err) {
	console.log(err);
	}
);

材质:
材质可以理解为皮肤,一个球体,可以是篮球也可以是足球,材质决定他的类别

你可能感兴趣的:(three.js)