ThreeJs的学习:BufferGeometry理解(2),Index与postion的关系,以及groups的理解

webgl_buffergeometry_indexed.html

例子1

var segments_Shuliang = 2;
var geometry = new THREE.BufferGeometry();
geometry.setIndex( [1, 0, 4, 0, 3, 4, 2, 1, 5, 1, 4, 5, 4, 3, 7, 3, 6, 7, 5, 4, 8, 4, 7, 8] );
geometry.addAttribute( 'position', new THREE.Float32BufferAttribute( [-10, 10, 0, 0, 10, 0, 10, 10, 0, -10, -0, 0, 0, -0, 0, 10, -0, 0, -10, -10, 0, 0, -10, 0, 10, -10, 0], 3 ) );
geometry.addAttribute( 'normal', new THREE.Float32BufferAttribute( [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1], 3 ) );
geometry.addAttribute( 'color', new THREE.Float32BufferAttribute( [0, 0, 1, 0.5, 0, 1, 1, 0, 1, 0, 0.5, 1, 0.5, 0.5, 1, 1, 0.5, 1, 0, 1, 1, 0.5, 1, 1, 1, 1, 1], 3 ) );

var material = new THREE.MeshPhongMaterial( {
					side: THREE.DoubleSide,
					vertexColors: THREE.VertexColors
} );
mesh = new THREE.Mesh( geometry, material );

 

例子2

没有【normal】和【color】的Attribute,也能形成图形,不是说normal没什么用,其实很重要的。
关于normal参考threejs的例子webgl_geometry_normals


下面关注的是【Index】和【postion】的含义了。
Position是每个点的坐标,下面例子有9个Position,编号0~8
index是说明一个三角形由哪三个Position组成。详细说明参考例子3

var geometry = new THREE.BufferGeometry();
geometry.setIndex( [
	1, 0, 4, 
	0, 3, 4, 
	2, 1, 5, 
	1, 4, 5, 
	4, 3, 7, 
	3, 6, 7, 
	5, 4, 8, 
	4, 7, 8] );
geometry.addAttribute( 'position', new THREE.Float32BufferAttribute( [
	-10, 10, 0,  // 0
	0, 10, 0,    // 1
	10, 10, 0,   // 2
	-10, -0, 0,  // 3
	0, -0, 0,    // 4
	10, -0, 0,   // 5
	-10, -10, 0, // 6
	0, -10, 0,   // 7
	10, -10, 0   // 8
	], 3 ) );
// geometry.addAttribute( 'normal', new THREE.Float32BufferAttribute( [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1], 3 ) );
// geometry.addAttribute( 'color', new THREE.Float32BufferAttribute( [0, 0, 1, 0.5, 0, 1, 1, 0, 1, 0, 0.5, 1, 0.5, 0.5, 1, 1, 0.5, 1, 0, 1, 1, 0.5, 1, 1, 1, 1, 1], 3 ) );
var material = new THREE.MeshBasicMaterial( { color: 0xff0000 } );				mesh = new THREE.Mesh( geometry, material );

例子3 

全部用【postion】
例子2的【Index】和【postion】转换成新的【postion】,不需要【Index】。

var bgeometry = new THREE.BufferGeometry();
var vertices = new Float32Array( [
	// 三角形
	0, 10, 0,    // 1
	-10, 10, 0,  // 0
	0, -0, 0,    // 4

	// 三角形
	-10, 10, 0,  // 0
	-10, -0, 0,  // 3
	0, -0, 0,    // 4

	// 三角形
	10, 10, 0,   // 2
	0, 10, 0,    // 1
	10, -0, 0,   // 5

	// 三角形
	0, 10, 0,    // 1
	0, -0, 0,    // 4
	10, -0, 0,   // 5

	// 三角形
	0, -0, 0,    // 4
	-10, -0, 0,  // 3
	0, -10, 0,   // 7

	// 三角形
	-10, -0, 0,  // 3
	-10, -10, 0, // 6
	0, -10, 0,   // 7

	// 三角形
	10, -0, 0,   // 5
	0, -0, 0,    // 4
	10, -10, 0,  // 8

	// 三角形
	0, -0, 0,    // 4
	0, -10, 0,   // 7
	10, -10, 0   // 8
] );
//材质
var material = new THREE.MeshBasicMaterial( { color: 0xff0000 } );
bgeometry.addAttribute( 'position', new THREE.BufferAttribute( vertices, 3 ) );
var mesh = new THREE.Mesh( bgeometry, material );

groups指的是每一个面的顶点数据,这里的顶点指的是用index和attribute数据重组之后的完整的顶点数据。

在完整的顶点数据之下,每一个面是从那个顶点开始,由多少个顶点组成,materialIndex是应该指顶点数组的索引。

比如,如下图,第一个面是从0顶点开始,由6个顶点组成,这个就是一组,用materialIndex标记。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值