Как заполнить загруженную сетку STL (НЕ ПРОСТО ФОРМЫ, КАК КУБ ETC) случайными частицами и анимировать с этой геометрией, связанной в three.js - PullRequest
0 голосов
/ 25 октября 2018

Как я могу заполнить загруженную сетку STL (например, сюзане, НЕ ПРОСТО ФОРМЫ, КАК КУБ и т. Д.) Случайными частицами и анимировать ее внутри границ этой геометрии с помощью three.js?

Я вижумного примеров, но все это для простых форм с геометрическими границами, такими как куб или сфера с ограничением по координатам вокруг центра

https://threejs.org/examples/?q=points#webgl_custom_attributes_points3

TNX

1 Ответ

0 голосов
/ 28 октября 2018

Концепция, использующая луч, который считает пересечения луча с гранями сетки, и если число нечетное, это означает, что точка находится внутри сетки:

Codepen

  function fillWithPoints(geometry, count) {

    var ray = new THREE.Ray()

    var size = new THREE.Vector3();
    geometry.computeBoundingBox();
    let bbox = geometry.boundingBox;

    let points = [];

    var dir = new THREE.Vector3(1, 1, 1).normalize();
    for (let i = 0; i < count; i++) {
      let p = setRandomVector(bbox.min, bbox.max);
      points.push(p);
    }

    function setRandomVector(min, max){
      let v = new THREE.Vector3(
        THREE.Math.randFloat(min.x, max.x),
        THREE.Math.randFloat(min.y, max.y),
        THREE.Math.randFloat(min.z, max.z)
      );
      if (!isInside(v)){return setRandomVector(min, max);}
      return v;
    }

    function isInside(v){

      ray.set(v, dir);
      let counter = 0;

      let pos = geometry.attributes.position;
      let faces = pos.count / 3;
      let vA = new THREE.Vector3(), vB = new THREE.Vector3(), vC = new THREE.Vector3();

      for(let i = 0; i < faces; i++){
        vA.fromBufferAttribute(pos, i * 3 + 0);
        vB.fromBufferAttribute(pos, i * 3 + 1);
        vC.fromBufferAttribute(pos, i * 3 + 2);
        if (ray.intersectTriangle(vA, vB, vC)) counter++;
      }

      return counter % 2 == 1;
    }

    return new THREE.BufferGeometry().setFromPoints(points);
  }
...