Three.js - 最后一堆点没有被渲染
Three.js - Last bunch of points are not being rendered
尽管 BufferGeometry 对象包含所有相关数据,但最后一堆点未在 THREE.js 查看器中呈现。我正在使用 THREE.js 库的 85 版(缺少一些点),如果我恢复使用 67 版,所有点都可以正常显示。
在版本 67 中,我使用了 THREE.Float32Attribute 和 THREE.ParticleSystem,并且所有点都可以正常加载。
在版本 85 中,我使用的是 THREE.Float32BufferAttribute 和 THREE.Points(由于旧函数已弃用)。我没有收到任何错误,只是我可以清楚地看到缺少的点(全部 patch/area)。丢失的一堆点是从 LiDAR 文件中读取的最后一点——我知道这一点,因为我使用 LAStools lasview.exe 查看文件,并且该工具按读取顺序加载点——不确定是否有与为什么 THREE.js 缺少最后一点 added/rendered.
有关
我调试了代码以确保我按预期将值传递给 THREE.Float32BufferAttribute 构造函数并将预期值分配给数组。创建 THREE.Points 构造函数时,我看不出传递的值有任何问题(缓冲区几何对象和着色器 material 对象)。我看不出除了使用 THREE.Points 对象之外别无选择,因为 THREE.ParticleSystem 已不再使用。
var geometry = new THREE.BufferGeometry();
var data = [an array of data];
geometry.addAttribute('position', new THREE.Float32BufferAttribute((pointCount), 3));
geometry.getAttribute('position').array = new Float32Array(data);
geometry.computeBoundingSphere();
...
var shaderMaterial = new THREE.ShaderMaterial(...);
var particles = new THREE.Points(geometry, shaderMaterial);
particles.name = geometry.name;
...
this.scene.add(particles);
this.scene.needsUpdate = true;
完全没有错误。如前所述,使用 67 版可以正常工作,但使用 85 版时会出现遗漏点。
以下是运行良好的 67 版代码:
var geometry = new THREE.BufferGeometry();
var data = [an array of data];
geometry.addAttribute('position', new THREE.Float32Attribute((pointCount), 3)); // Using Float32Attribute instead of Float32BufferAttribute
geometry.getAttribute('position').array = new Float32Array(data);
geometry.computeBoundingSphere();
...
var shaderMaterial = new THREE.ShaderMaterial(...);
var particles = new THREE.ParticleSystem(geometry, shaderMaterial); // Using ParticleSystem instead of Points
particles.name = geometry.name;
...
this.scene.add(particles);
this.scene.needsUpdate = true;
我添加了屏幕截图。第一张图片使用的是版本 85 和上面的代码。第二张图片是加载到版本 67 中的相同数据(忽略强度颜色的差异,因为图片的目的是显示右侧缺失的补丁,这是 BufferGeometry 数组中的最后一个数据)
version 85 missing points
version 67 all points rendered
感谢@TheJim01,我已经解决了这个问题:
geometry.addAttribute('position', new THREE.Float32BufferAttribute(new Float32Array(classificationGeometry.positions), 3));
而不是 declaring/setting 对象分开。
尽管 BufferGeometry 对象包含所有相关数据,但最后一堆点未在 THREE.js 查看器中呈现。我正在使用 THREE.js 库的 85 版(缺少一些点),如果我恢复使用 67 版,所有点都可以正常显示。
在版本 67 中,我使用了 THREE.Float32Attribute 和 THREE.ParticleSystem,并且所有点都可以正常加载。
在版本 85 中,我使用的是 THREE.Float32BufferAttribute 和 THREE.Points(由于旧函数已弃用)。我没有收到任何错误,只是我可以清楚地看到缺少的点(全部 patch/area)。丢失的一堆点是从 LiDAR 文件中读取的最后一点——我知道这一点,因为我使用 LAStools lasview.exe 查看文件,并且该工具按读取顺序加载点——不确定是否有与为什么 THREE.js 缺少最后一点 added/rendered.
有关我调试了代码以确保我按预期将值传递给 THREE.Float32BufferAttribute 构造函数并将预期值分配给数组。创建 THREE.Points 构造函数时,我看不出传递的值有任何问题(缓冲区几何对象和着色器 material 对象)。我看不出除了使用 THREE.Points 对象之外别无选择,因为 THREE.ParticleSystem 已不再使用。
var geometry = new THREE.BufferGeometry();
var data = [an array of data];
geometry.addAttribute('position', new THREE.Float32BufferAttribute((pointCount), 3));
geometry.getAttribute('position').array = new Float32Array(data);
geometry.computeBoundingSphere();
...
var shaderMaterial = new THREE.ShaderMaterial(...);
var particles = new THREE.Points(geometry, shaderMaterial);
particles.name = geometry.name;
...
this.scene.add(particles);
this.scene.needsUpdate = true;
完全没有错误。如前所述,使用 67 版可以正常工作,但使用 85 版时会出现遗漏点。
以下是运行良好的 67 版代码:
var geometry = new THREE.BufferGeometry();
var data = [an array of data];
geometry.addAttribute('position', new THREE.Float32Attribute((pointCount), 3)); // Using Float32Attribute instead of Float32BufferAttribute
geometry.getAttribute('position').array = new Float32Array(data);
geometry.computeBoundingSphere();
...
var shaderMaterial = new THREE.ShaderMaterial(...);
var particles = new THREE.ParticleSystem(geometry, shaderMaterial); // Using ParticleSystem instead of Points
particles.name = geometry.name;
...
this.scene.add(particles);
this.scene.needsUpdate = true;
我添加了屏幕截图。第一张图片使用的是版本 85 和上面的代码。第二张图片是加载到版本 67 中的相同数据(忽略强度颜色的差异,因为图片的目的是显示右侧缺失的补丁,这是 BufferGeometry 数组中的最后一个数据)
version 85 missing points
version 67 all points rendered
感谢@TheJim01,我已经解决了这个问题:
geometry.addAttribute('position', new THREE.Float32BufferAttribute(new Float32Array(classificationGeometry.positions), 3));
而不是 declaring/setting 对象分开。