几何交点从直接几何转换为缓冲几何

时间:2016-11-14 05:31:15

标签: three.js geometry buffer decal

我正在使用Three.js。找到了一个由Benpurdy编写的非常好的Decal库。它很容易修改,并且还使用了here

所描述的技术

但是,该技术使用几何。我所在的项目使用BufferGeometry。我跟踪了几何相交的代码,无法弄清楚从面和顶点到属性的转换。

this.createGeometry = function(matrix, mesh) {

  var geom = mesh.geometry;

  var decalGeometry = new THREE.Geometry(); 

  var projectorInverse = matrix.clone().getInverse(matrix);
  var meshInverse = mesh.matrixWorld.clone().getInverse(mesh.matrixWorld);
  var faces = [];

  for(var i = 0; i < geom.faces.length; i++){

    var verts = [geom.faces[i].a, geom.faces[i].b, geom.faces[i].c];

    var pts = [];
    var valid = false;

    for(var v = 0; v < 3; v++) {

      var vec = geom.vertices[verts[v]].clone();

      vec.applyMatrix4(mesh.matrixWorld);
      vec.applyMatrix4(matrix);

      if((vec.z > 1) || (vec.z < -1) || (vec.x > 1) || (vec.x < -1) || (vec.y > 1) || (vec.y < -1)) {
      } else {
        valid = true;
      }

      pts.push(vec);
    }

    if(valid) {

      var uv = [];
      for(var n = 0; n < 3; n++){
        uv.push(new THREE.Vector2( (pts[n].x + 1) / 2, (pts[n].y + 1) / 2));

        pts[n].applyMatrix4(projectorInverse);
        pts[n].applyMatrix4(meshInverse);

        decalGeometry.vertices.push( pts[n] );
      }

      // update UV's
      decalGeometry.faceVertexUvs[0].push(uv);

      var newFace = geom.faces[i].clone();

      newFace.a = decalGeometry.vertices.length - 3;
      newFace.b = decalGeometry.vertices.length - 2;
      newFace.c = decalGeometry.vertices.length - 1;

      decalGeometry.faces.push(newFace);
    }

  }

  return decalGeometry;
}

欣赏是否有人可以阐明如何去追求这个?感谢。

3 个答案:

答案 0 :(得分:0)

overridePendingTransition(R.anim.enter, R.anim.exit); 有一个方法BufferGeometry().fromGeometry()

Populates this BufferGeometry with data from a Geometry object.

UPD。你可以反过来使用。

var geom = new THREE.BoxGeometry(1,1,1);
var bufGeom = new THREE.BufferGeometry().fromGeometry(geom);

答案 1 :(得分:0)

我最后通过编写另一个函数来计算交叉点并使用缓冲区几何来解决问题。我花了一些时间试图理解原始缓冲几何代码。

('1', '2', '3')

答案 2 :(得分:0)

快速而肮脏的解决方案是从bufferGeometry创建几何体并在计算出处理创建的几何体之后

this.compute = function()
{
   this.geometry = mesh.geometry
   if(this.geometry.attributes)
   {
        this.geometry = new THREE.Geometry().fromBufferGeometry(this.geometry);
        this.computeDecal();
        this.geometry.dispose();
    }
    else
    {
        this.computeDecal();
    }
}