How to update things

如果按照如下方式添加到scene中,对象默认会自动更新其矩阵

var object = new THREE.Object3D;
scene.add(object);

或者这个对象是被添加到scene的对象的孩子

var object1 = new THREE.Object3D;
var object2 = new THREE.Object3D;

object1.add( object2 );
scene.add( object1 ); //object1 and object2 will automatically update their matrices

然而,如果你需要这个object是静态的,你可以禁用自动更新的功能,在需要的时候手动更新变换矩阵

object.matrixAutoUpdate  = false;
object.updateMatrix();
Geometries

BufferGeometry
BufferGeometries在缓冲区中存储信息(如顶点位置,面索引,法线,颜色,UV和任何自定义属性),即类型化的数组。这让他们通常比标准的geometries快,以一些使用上的困难为代价。

关于更新BufferGeometries,最需要了解的事情是不能调整buffers的大小(代价是很昂贵的,基本相当于创建一个新的geometry)。但是你可以更新buffers的内容。

这意味着如果您知道您的BufferGeometry的属性会增加,比如顶点数,则必须预先分配足够大的缓冲区,以容纳任何可能创建的新顶点。当然,这也意味着您的BufferGeometry将会有最大的大小 - 没有办法无限期地有效扩展的BufferGeometry。

我们用一条线来作为例子,这条线在render的时候会扩展。我们会预留可以容纳500个顶点的空间,但是最开始的时候,只会用到两个。用 BufferGeometry.drawRange

var MAX_POINTS = 500;

// geometry
var geometry = new THREE.BufferGeometry();

// attributes
var positions = new Float32Array( MAX_POINTS * 3 ); // 3 vertices per point
geometry.addAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) );

// draw range
var drawCount = 2; // draw the first 2 points, only
geometry.setDrawRange( 0, drawCount );

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

// line
var line = new THREE.Line( geometry,  material );
scene.add( line );

然后用如下的方式,给线随机添加点

var positions = line.geometry.attributes.position.array;

var x, y, z, index;
x = y = z = index = 0;

for ( var i = 0, l = MAX_POINTS; i < l; i ++ ) {

    positions[ index ++ ] = x;
    positions[ index ++ ] = y;
    positions[ index ++ ] = z;

    x += ( Math.random() - 0.5 ) * 30;
    y += ( Math.random() - 0.5 ) * 30;
    z += ( Math.random() - 0.5 ) * 30;
}

如果你想在第一次render之后改变render时点的个数,你可以这样做:

line.geometry.setDrawRange( 0, newValue );

如果要在第一次渲染后更改位置数据值,则需要像这样设置needsUpdate标志:

line.geometry.attributes.position.needsUpdate = true; // required after the first render

这是一个线上编辑器,你可以改动代码并查看结果。

例子:
WebGL / custom / attributes
WebGL / buffergeometry / custom / attributes / particles

Geometry
所有统一的值可以自由地改变(例如,颜色,纹理,不透明度等),每个帧都会向着色器发送值。

此外,GLstate相关参数也可随时更改(depthTest,blend,polygonOffset等)。

平面/平滑阴影被烘烤成法线。 您需要重置法线缓冲区(见上文)。

TBC

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值