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 );
}

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