THREE.ExplodedModifier黑客攻击

THREE.ExplodeModifier hacking

本文关键字:攻击 黑客 ExplodedModifier THREE      更新时间:2023-09-26

我正在使用ExplodeModifier来复制顶点,这样我就可以单独控制Face3对象。对于我的特定示例,仅此一项在视觉上看起来很差,所以我决定添加3个额外的面(每个现有面),这样我就可以有一个指向几何体内部的金字塔形状。

我设法修改了ExplodeModifier并创建了额外的面,但我遇到了几个错误:

THREE.DirectGeometry.fromGeometry():未定义的顶点Uv和THREE.BufferAttribute.copyVector3sArray():矢量为未定义的

我知道现在我每个面有9个额外的顶点,所以我需要根据uv,因为我不需要纹理,但需要纯色,所以我不介意有错误的uv。。。所以,我也复制了uvs,避免了第一个警告,但我无法摆脱copyVector2sArray。。。

伪代码:

var geometry = new THREE.IcosahedronGeometry( 200, 1 );
var material = new THREE.MeshPhongMaterial( { shading: THREE.FlatShading } );
var explodeModifier = new THREE.ExplodeModifier();
explodeModifier.modify( geometry );
var mesh = new THREE.Mesh( geometry, material );
scene.addChild( mesh );

爆炸修改器有这样的伪代码:

var vertices = [];
var faces = [];
for ( var i = 0, il = geometry.faces.length; i < il; i ++ ) {
    (...)
    var extraFace1 = new THREE.Face3().copy(face)
    extraFace1.c = geometry.vertices[0]
    var extraFace2 = new THREE.Face3().copy(face)
    extraFace2.b = geometry.vertices[0]
    var extraFace3 = new THREE.Face3().copy(face)
    extraFace3.a = geometry.vertices[0]
    faces.push( extraFace1 );
    faces.push( extraFace2 );
    faces.push( extraFace3 );
}
geometry.vertices = vertices;
geometry.faces = faces;

```

我在这里添加了一个例子。它有效,但我想避免控制台警告。。。

正如@mrdoob所指出的,我为添加的THREE.Face3分配了THREE.Vector3,而不是index

 var extraFace1 = new THREE.Face3().copy(face)
 extraFace1.a = geometry.faces.length * 3 - 1
 var extraFace2 = new THREE.Face3().copy(face)
 extraFace2.b = geometry.faces.length * 3 - 1
 var extraFace3 = new THREE.Face3().copy(face)
 extraFace3.c = geometry.faces.length * 3 - 1

jsfiddle更新了