您希望减少代理模拟中的绘制调用数量,并让某些东西相对轻松地工作。您可以通过将您的代理集合表示为来做到这一点THREE.Points
.
// geometry
var geometry = new THREE.BufferGeometry();
// attributes
var positions = new Float32Array( numAgents * 3 ); // 3 values per vertex
var rotations = new Float32Array( numAgents * 1 ); // 1 values per vertex
for ( var i = 0; i < numAgents; i ++ ) {
positions[ i ] = 0;
positions[ i + 1 ] = 0;
positions[ i + 2 ] = 0;
rotations[ i ] = 2 * Math.PI * Math.random();
}
geometry.addAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) );
geometry.addAttribute( 'rotation', new THREE.BufferAttribute( rotations, 1 ) );
// material
var material = new THREE.PointsMaterial( {
color: 0xff0000,
size: 4,
map: null
} );
// points
points = new THREE.Points( geometry, material );
scene.add( points );
这将在一次绘制调用中进行渲染,您可以更新 CPU 上的位置并将每帧数据推送到 GPU。您应该能够轻松渲染 100,000 个代理。
fiddle: http://jsfiddle.net/730ffn4x/ http://jsfiddle.net/730ffn4x/
如果您想将点表示为带有方向的箭头,则需要提供带有箭头图像和自定义的纹理ShaderMaterial
旋转每个点。
InstancedBufferGeometry
如果每个代理必须代表一个Mesh
. 这是一个很好的例子 http://codepen.io/usefulthink/full/YNrvpY作者:@MartinSchuhfuß,这与您想要做的类似。
对于激烈的模拟,您可以使用 GPGPU。请参阅 Three.js 示例 https://threejs.org/examples/?q=GPGPU。在 GPGPU 中,模拟完全在 GPU 上运行,CPU 通常执行最少的工作。
三.js r.84