three.js 合并几何和八叉树选择
three.js merge geometry and octree selection
我正在使用 Three.js 来显示许多不同位置和旋转的自定义几何图形。它们是静态的,很少改变,但用户可以添加、删除或更改每个单独对象的形状。
使用下面的代码片段效果很好:
var Mat=new THREE.MeshBasicMaterial( { color: 0xffff00, wireframe: false, opacity: 0.5 , transparent:true} )
var Geo=new THREE.CubeGeometry( 20, 100, 20 )
var Mesh=new THREE.Mesh(Geo, Mat);
//Up or down rotation
m = new THREE.Matrix4().set(0.3,-0.3,0,0,0.3,0.3,0,0,0,0,1,0)
Mesh.applyMatrix(m);
Mesh.updateMatrix();
Mesh.position.x=50;
Mesh.position.y=50;
Mesh.position.z=50;
octree.add(Mesh);
Mesh.updateMatrix();
scene.add( Mesh );
上面的工作正常,尽管毫不奇怪它在处理大量对象时遇到了困难。参考:
https://gamedev.stackexchange.com/questions/81570/merging-geometry-mesh-without-losing-benefits
我已经合并了对象并且在速度提升方面取得了巨大的成功,它在 10,000+ 个对象上运行良好。我现在正在尝试再次设置选择,但我被卡住了。
以上 link 建议将网格保持在数组或八叉树中将启用选择,同时保持合并对象的速度优势。我已经实现了一个八叉树,所以这应该很容易再次使用,但选择对象现在与合并的场景对象不在同一位置。选择对象位于原点,八叉树似乎失去了其对象的位置,可能还有旋转。下面是麻烦代码的快照:
var TotalGeo = new THREE.Geometry();
//Add Objects
var Mat=new THREE.MeshBasicMaterial( { color: 0xffff00, wireframe: false, opacity: 0.5 , transparent:true} )
var Geo=new THREE.CubeGeometry( 20, 100, 20 )
var Mesh=new THREE.Mesh(Geo, Mat);
//Up or down rotation
m = new THREE.Matrix4().set(0.3,-0.3,0,0,0.3,0.3,0,0,0,0,1,0)
Mesh.applyMatrix(m);
Mesh.updateMatrix();
Mesh.position.x=50;
Mesh.position.y=50;
Mesh.position.z=50;
octree.add(Mesh);
Mesh.updateMatrix();
//scene.add( Mesh );
TotalGeo.merge( Mesh.geometry, Mesh.matrix );
//Add merged geo
var total = new THREE.Mesh(TotalGeo, Mat);
scene.add(total);
自定义几何图形需要手动旋转和定位。欢迎任何想法!谢谢
设置八叉树时,确保将 undemerred 设置为 true。像这样 -
octree = new THREE.Octree( {
undeferred: true,
depthMax: Infinity,
objectsThreshold: 8,
overlapPct: 0.15
} );
这应该可以解决问题![=11=]
我正在使用 Three.js 来显示许多不同位置和旋转的自定义几何图形。它们是静态的,很少改变,但用户可以添加、删除或更改每个单独对象的形状。
使用下面的代码片段效果很好:
var Mat=new THREE.MeshBasicMaterial( { color: 0xffff00, wireframe: false, opacity: 0.5 , transparent:true} )
var Geo=new THREE.CubeGeometry( 20, 100, 20 )
var Mesh=new THREE.Mesh(Geo, Mat);
//Up or down rotation
m = new THREE.Matrix4().set(0.3,-0.3,0,0,0.3,0.3,0,0,0,0,1,0)
Mesh.applyMatrix(m);
Mesh.updateMatrix();
Mesh.position.x=50;
Mesh.position.y=50;
Mesh.position.z=50;
octree.add(Mesh);
Mesh.updateMatrix();
scene.add( Mesh );
上面的工作正常,尽管毫不奇怪它在处理大量对象时遇到了困难。参考: https://gamedev.stackexchange.com/questions/81570/merging-geometry-mesh-without-losing-benefits
我已经合并了对象并且在速度提升方面取得了巨大的成功,它在 10,000+ 个对象上运行良好。我现在正在尝试再次设置选择,但我被卡住了。
以上 link 建议将网格保持在数组或八叉树中将启用选择,同时保持合并对象的速度优势。我已经实现了一个八叉树,所以这应该很容易再次使用,但选择对象现在与合并的场景对象不在同一位置。选择对象位于原点,八叉树似乎失去了其对象的位置,可能还有旋转。下面是麻烦代码的快照:
var TotalGeo = new THREE.Geometry();
//Add Objects
var Mat=new THREE.MeshBasicMaterial( { color: 0xffff00, wireframe: false, opacity: 0.5 , transparent:true} )
var Geo=new THREE.CubeGeometry( 20, 100, 20 )
var Mesh=new THREE.Mesh(Geo, Mat);
//Up or down rotation
m = new THREE.Matrix4().set(0.3,-0.3,0,0,0.3,0.3,0,0,0,0,1,0)
Mesh.applyMatrix(m);
Mesh.updateMatrix();
Mesh.position.x=50;
Mesh.position.y=50;
Mesh.position.z=50;
octree.add(Mesh);
Mesh.updateMatrix();
//scene.add( Mesh );
TotalGeo.merge( Mesh.geometry, Mesh.matrix );
//Add merged geo
var total = new THREE.Mesh(TotalGeo, Mat);
scene.add(total);
自定义几何图形需要手动旋转和定位。欢迎任何想法!谢谢
设置八叉树时,确保将 undemerred 设置为 true。像这样 -
octree = new THREE.Octree( {
undeferred: true,
depthMax: Infinity,
objectsThreshold: 8,
overlapPct: 0.15
} );
这应该可以解决问题![=11=]