Threejs中Geometry的用法示例

       Geometry是其他很多XXXGeometry(如BoxGeometry、SphereGeometry)的基类,与之相对应的还有BufferGeometry,BufferGeometry是其他带BufferGeomerty的基类, BufferGeomerty效率比Geometry高,但是Geometry使用相对简单点,本文就说下Geometry的基本用法。

       Geometry中有顶点位置和面以及面UV等属性,可以灵活控制物体的几何形状,但是使用也更复杂(相对于它的子类),下面使用Geometry画一个最基本的形状三角形。

  1、绘制一个自定义顶点座标的三角形,颜色为纯红色,绘制自定义形状必须要有顶点数据vertices和面数据faces。

<html>
	<head>
		<title>three.js geometry</title>
	</head>
	<body>
		<script src="three.js"></script>
		<script>
			var scene = new THREE.Scene();
			var camera = new THREE.PerspectiveCamera( 90, window.innerWidth/window.innerHeight, 0.1, 1000 );

			var renderer = new THREE.WebGLRenderer();
			renderer.setSize( window.innerWidth, window.innerHeight );
			document.body.appendChild( renderer.domElement );
			camera.position.z = 5;
			drawmesh();
			animate();
			function drawmesh()
			{
				var vertices = [
					new THREE.Vector3(-1.0, -1.0,  0.0),
					new THREE.Vector3(1.0, -1.0,  0.0),
					new THREE.Vector3(1.0,  1.0,  0.0)
				];
				var faces=[
					new THREE.Face3( 0, 1, 2 )
				];
				var geometry = new THREE.Geometry();
				geometry.vertices = vertices;
				geometry.faces=faces;
				var material = new THREE.MeshBasicMaterial( { color: 0xff0000} );
				var mesh = new THREE.Mesh( geometry, material );
				scene.add( mesh );
			}
			function animate() {
				requestAnimationFrame( animate );
				renderer.render( scene, camera );
			}
		</script>
	</body>
</html>

运行后的效果如下图: 

2、接下来将三角形的每个顶点颜色设置为不同的值

        这些颜色值属性存在THREE.Face3(代码中的face.vertexColors)中,类型为包含3个颜色值的数组。要使用顶点颜色还得将material的vertexColors设置为THREE.VertexColors,而且最终的颜色是顶点颜色和材质颜色color相乘的值,所以为了看到顶点颜色将材质颜色改为白色0xffffff(或者不设置也可以)

function drawmesh()
{
	var vertices = [
		new THREE.Vector3(-1.0, -1.0,  0.0),
		new THREE.Vector3(1.0, -1.0,  0.0),
		new THREE.Vector3(1.0,  1.0,  0.0)
	];
	var colors=[
		new THREE.Color( 0xff0000 ),
		new THREE.Color( 0x00ff00 ),
		new THREE.Color( 0x0000ff )
	];
	var face = new THREE.Face3( 0, 1, 2);
	face.vertexColors=colors;
	var faces=[
		face
	];
	var geometry = new THREE.Geometry();
	geometry.vertices = vertices;
	geometry.faces=faces;
	var material = new THREE.MeshBasicMaterial( { color: 0xffffff } );
	material.vertexColors=THREE.VertexColors;
	var mesh = new THREE.Mesh( geometry, material );
	scene.add( mesh );
}

3、在实际使用中更多的情况是在物体表面贴上纹理贴图,接下来为这个三角形贴上纹理
       要正确使用贴图必须要添加面的uv值,每个面有三个顶点,因此每个面也有三个uv值(参考代码中的uvs),下列的代码将图片的右下角贴到三角形上 。

function drawmesh()
{
	var vertices = [
		new THREE.Vector3(-1.0, -1.0,  0.0),
		new THREE.Vector3(1.0, -1.0,  0.0),
		new THREE.Vector3(1.0,  1.0,  0.0)
	];
	var face = new THREE.Face3( 0, 1, 2);
	var faces=[
		face
	];
	var uvs=[
		[new THREE.Vector2(0.0, 0.0),new THREE.Vector2(1.0, 0.0),new THREE.Vector2(1.0, 1.0)]
	];
	var geometry = new THREE.Geometry();
	geometry.vertices = vertices;
	geometry.faces=faces;
	geometry.faceVertexUvs[0]  = uvs;
	var texture = new THREE.TextureLoader().load( 'test.jpg' );
	var material = new THREE.MeshBasicMaterial( {map:texture } );
	var mesh = new THREE.Mesh( geometry, material );
	scene.add( mesh );
}

      如下图所示,只能看到图片的右下角(当然也可以通过修改面UV值显示出图片的不同部分) 

       如果设置的顶点颜色或者材质颜色,最终的颜色值也是这几种颜色混合的结果,例如将上面的顶点颜色加上就得到了下面的结果

4、最后绘制两个三角形面组成一个完整的四边形,并且将图片完整贴上。

function drawmesh()
{
	var vertices = [
	new THREE.Vector3(-1.0, -1.0,  0.0),
		new THREE.Vector3(1.0, -1.0,  0.0),
		new THREE.Vector3(1.0,  1.0,  0.0),
		new THREE.Vector3(-1.0,  1.0,  0.0)
	];
	var faces=[
		new THREE.Face3( 0, 1, 2),
		new THREE.Face3( 0, 2, 3)
	];
	var uvs=[
		[new THREE.Vector2(0.0, 0.0),new THREE.Vector2(1.0, 0.0),new THREE.Vector2(1.0, 1.0)],
		[new THREE.Vector2(0.0, 0.0),new THREE.Vector2(1.0, 1.0),new THREE.Vector2(0.0, 1.0)],
	];
				
	var geometry = new THREE.Geometry();
	geometry.vertices = vertices;
	geometry.faces=faces;
	geometry.faceVertexUvs[0]  = uvs;
	var texture = new THREE.TextureLoader().load( 'test.jpg' );
	var material = new THREE.MeshBasicMaterial( {map:texture } );
	var mesh = new THREE.Mesh( geometry, material );
	scene.add( mesh );
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章