ThreeJs的学习:BufferGeometry的理解(3),Geometry和BufferGeometry的关系

在Three.js的这个方法中可以观察各个Geometry的转换

Geometry

geometry.vertices
geometry.faceVertexUvs
geometry.faces

 BufferGeometry

geometry.attributes
    geometry.attributes.position
    geometry.attributes.uv
    geometry.attributes.normal
geometry.index

目前为止的观察,发现所有的Geometry都会到projectObject进行转换,最后转换成BufferGeometry。

Geometry操作起来比BufferGeometry简单,应该是把BufferGeometry在包装一次了。
BufferGeometry是接近WegGL操作的,有点难度,但是更强大。

function projectObject( object, camera, groupOrder, sortObjects ) 

Geometry

Geometry转换成BufferGeometry

BoxGeometry

BoxGeometry转换成BufferGeometry

CubeGeometry

CubeGeometry转换成BufferGeometry

但有些Geometry并不会转换成BufferGeometry

XXXXBufferGeometry就是了

比如ShapeBufferGeometry、ExtrudeBufferGeometry和InstancedBufferGeometry并没有转换成BufferGeometry

因为他们本身就是BufferGeometry

ShapeBufferGeometry 

ExtrudeBufferGeometry 

比ShapeBufferGeometry多了个groups

Threejs的computeBoundingSphere方法

不管是Geometry还是BufferGeometry都有computeBoundingSphere方法,而且是初始化中必须执行。

两者的区别:BufferGeometry的方法computeBoundingSphere认为一定存在attributes,然后对attributes的一些数据进行操作。

而Geometry不管是否存在attributes,也不操作attributes的数据操作。

执行computeBoundingSphere的地方【intersectsObject: function ()】

Geometry的computeBoundingSphere方法

BufferGeometry的computeBoundingSphere方法

 

 结论

 最后结论是只要掌握好BufferGeometry的attributes以及其他属性的用法,用BufferGeometry可以全部搞定,不需要其他的Geometry。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现3D火焰效果,可以使用BufferGeometry和ShaderMaterial来创建一个自定义的火焰材质。下面是一个简单的实现步骤: 1. 创建一个BufferGeometry对象,并设置顶点、索引和UV坐标数据。这些数据可以通过编写一个简单的函数来生成。 ``` function createFireGeometry() { const geometry = new THREE.BufferGeometry(); const vertices = []; const indices = []; const uvs = []; // Generate vertices and indices // ... geometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3)); geometry.setIndex(indices); geometry.setAttribute('uv', new THREE.Float32BufferAttribute(uvs, 2)); return geometry; } ``` 2. 创建一个自定义的ShaderMaterial,并设置uniform变量。这些变量将用于控制火焰的外观和动画。在这个例子中,我们设置了时间、颜色、火焰高度、火焰密度和火焰速度等变量。 ``` const fireMaterial = new THREE.ShaderMaterial({ uniforms: { time: { value: 0 }, color: { value: new THREE.Color('#ff5500') }, flameHeight: { value: 1.5 }, flameDensity: { value: 1.0 }, flameSpeed: { value: 1.0 }, noiseTexture: { value: noiseTexture }, }, vertexShader: ` // Vertex shader code `, fragmentShader: ` // Fragment shader code `, }); ``` 3. 编写着色器代码,实现火焰效果。着色器代码包括顶点着色器和片段着色器。顶点着色器用于将顶点位置转换为屏幕空间坐标,并将一些变量传递给片段着色器。片段着色器用于计算像素颜色,以实现火焰效果。 ``` // Vertex shader code attribute vec3 position; attribute vec2 uv; uniform float time; uniform float flameHeight; uniform float flameDensity; uniform float flameSpeed; varying vec2 vUv; varying float vDistortion; void main() { // Vertex shader code } // Fragment shader code uniform vec3 color; uniform sampler2D noiseTexture; void main() { // Fragment shader code } ``` 4. 将BufferGeometry和ShaderMaterial组合到一个Mesh对象中,并将其添加到场景中。 ``` const fireGeometry = createFireGeometry(); const fireMesh = new THREE.Mesh(fireGeometry, fireMaterial); scene.add(fireMesh); ``` 5. 在渲染循环中更新uniform变量,以实现动画效果。 ``` function animate() { requestAnimationFrame(animate); const time = performance.now() / 1000; fireMaterial.uniforms.time.value = time; renderer.render(scene, camera); } ``` 6. 完成。现在可以看到一个简单的3D火焰效果了。 完整的代码示例可以参考这里:https://codepen.io/zadvorsky/pen/xxKXxYp。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值