2016-03-30 18 views
2

dat.gui yoluyla bir 8 * * .obj (örneğin bir küp) 8 köşe ve 6 yüzü (köşe indeksi) ile yükliyorum. Puanlarımı köşe noktalarına başarıyla taşıyabilmeme rağmen, bunları modelin yüzlerine eşit olarak dağıtamam.üçJ içinde içe aktarılan * .obj yüzündeki hareketli parçacıklar üzerinde hareket eden parçacıklar

Bu benim süreç şimdiye kadar geçerli:

(1) YÜK OBJE DOSYASI

örnek * .obj oldukça basittir:

v 5.526871 -3.827843 1.523720 
v 5.526871 -1.827843 1.523720 
v 5.526871 -3.827843 -0.476280 
v 5.526871 -1.827843 -0.476280 
v 7.526871 -3.827843 1.523720 
v 7.526871 -1.827843 1.523720 
v 7.526871 -3.827843 -0.476280 
v 7.526871 -1.827843 -0.476280 
s off 
f 2 4 3 1 
f 4 8 7 3 
f 8 6 5 7 
f 6 2 1 5 
f 1 3 7 5 
f 6 8 4 2 

(2) ile köşeler TRIM & FACES

RegEx desenlerini kullanıyorum Köşeleri ve yüzleri kırpın ve daha sonra bunları geometrime doğru itin.

var faces_pattern1 = /f(+[\d]+)([\d]+)([\d]+)([\d]+)?/g; // f vertex vertex vertex ... 
if ((result = faces_pattern1.exec(line)) !== null) { 
    faces_pattern1.exec(line); 
    if (result[ 4 ] === undefined) { 
     faces1.push([ 
      parseInt(result[ 1 ]) - 1, 
      parseInt(result[ 2 ]) - 1, 
      parseInt(result[ 3 ]) - 1 
     ]); 
    } else { 
     faces1.push([ 
      parseInt(result[ 1 ]) - 1, 
      parseInt(result[ 2 ]) - 1, 
      parseInt(result[ 3 ]) - 1, 
      parseInt(result[ 4 ]) - 1 
     ]); 
    } 
} 
// push faces to geometry 
for (var i = 0; i < faces1.length; i++) { 
    this.renderer.geometry.faces.push(new THREE.Face3(faces1[i][0], faces1[i][1], faces1[i][2], faces1[i][3])); 
} 

(3) köşe noktaları

I vertices parçacıkların bir dizi I pozisyon bilgisi üzerinde hareket PARÇACIKLARI. Bu iyi çalışıyor.

var lg = allParticle.length; 
for(var i = 0; i < lg; i++){ 
    var p = allParticle[i]; 
    p.diffX = (vertices[h][0] * scale - p.x); 
    p.diffY = (-vertices[h][1] * scale - p.y); 
    p.diffZ = (-vertices[h][2] * scale - p.z); 
    h += 1; 
    if(h > nbVertices - 1) h = 0; 
} 

(4) PARÇACIKLAR AÇIK YÜZLER DISTRIBUTE

Ben şimdi eşit küp yüzlerinde aynı parçacıkları yaymak istiyoruz bir mafsal vardır. Ben Bu yalnızca x ekseni üzerinde puan dağıtan değil eşit yüzün alanda bu kullanarak GeometryUtils.randomPointsInGeometry

var randomPointPositions = THREE.GeometryUtils.randomPointsInGeometry(this.renderer.geometry, lg ); 
this.renderer.geometry.computeBoundingBox(); 
for(var i = 0; i < randomPointPositions.length; i++){ 

    var p = allParticle[i]; 
    p.diffX = randomPointPositions[i].x * scale ; 
    p.diffY = randomPointPositions[i].y * scale; 
    p.diffZ = randomPointPositions[i].z * scale ; 
} 

yapmaya çalışıyoruz. Herhangi bir ipucu?

- Bu yüzler (THREE.Face3) alıyorum şunlardır:

{a: 1, b: 3, c: 2, normal: T…E.Vector3, vertexNormals: Array[0]…} 
{a: 3, b: 7, c: 6, normal: T…E.Vector3, vertexNormals: Array[0]…} 
{a: 7, b: 5, c: 4, normal: T…E.Vector3, vertexNormals: Array[0]…} 
{a: 5, b: 1, c: 0, normal: T…E.Vector3, vertexNormals: Array[0]…} 
{a: 0, b: 2, c: 6, normal: T…E.Vector3, vertexNormals: Array[0]…} 
{a: 5, b: 7, c: 3, normal: T…E.Vector3, vertexNormals: Array[0]…} 

Onların hesaplanan _area daima sıfırdır.

Benzer soru: THREE.js - position particles evenly on objects faces rather than verticies

+0

böylece olmamalı işi çoğaltmak gerekiyor. mesh yüklendikten sonra, render etmemeyi seçebilir, ancak yine de vertices/faces/compute normals/etc. –

+0

teşekkürler! Aslında nesneyi render etmeden yüklüyorum ve sadece köşe noktalarını/yüzlerini oku. Bu harika çalışıyor; Yine de dördüncü adımda sıkıştım. –

+0

Ayrıca OBJLoader Yöntemini denedim. Mesh düzgün bir şekilde yükler, sonra şunu yaparım: object.traverse (işlev (çocuk) { \t (çocuk ÜÇÜNCÜ).Mesh) { \t \t var randomPointPositions = THREE.GeometryUtils.randomPointsInBufferGeometry (çocuk, 5000); }, ancak "Unsur okunamıyor" özelliğini GeometryUtils.js: 190 (vertices = geometry.attributes.position.array) –

cevap

3

Tamam - bu biraz zaman aldı, ama bunu çözdü.

G.Profenza tarafından önerilen OBJLoader Yöntemini denedim.

Temelde almak, nesneyi yüklemek onun örgü olsun, GeometryUtils.randomPointsinBufferGeometry kullanmak ve sonra vector3 için partikülleri taşıyın: Ben Three.js .obj ayrıştırıcı vardır hatırlamak

OBJLoader: function() { 
     var manager = new THREE.LoadingManager(); 
     manager.onProgress = function (item, loaded, total) { 
      console.log(item, loaded, total); 
     }; 

     var onProgress = function (xhr) { 
      if (xhr.lengthComputable) { 
       var percentComplete = xhr.loaded/xhr.total * 100; 
       console.log(Math.round(percentComplete, 2) + '% downloaded'); 
      } 
     }; 

     var onError = function (xhr) { 
      console.log ("ERROR", xhr); 
     }; 

     var loader = new THREE.OBJLoader(manager); 
     var allParticle = this.scene.getParticles(); 
     var lg = allParticle.length; 
     var scale = this.renderer.scale;  
     loader.load('/data/cube_02.obj', function (object) { 
      object.traverse(function (child) { 
      if (child instanceof THREE.Mesh) { 
       console.log (" === CHILD === "); 
       console.log (child.geometry); 
       var randomPointPositions = THREE.GeometryUtils.randomPointsInBufferGeometry(child.geometry, lg ); 


       console.log (randomPointPositions[0].x, randomPointPositions[0].y, randomPointPositions[0].z); 


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

        var p = allParticle[i]; 
        p.diffX = randomPointPositions[i].x * scale -p.x ; 
        p.diffY = randomPointPositions[i].y * scale -p.y; 
        p.diffZ = randomPointPositions[i].z * scale -p.z; 
       } 

      } 

     }); 


     //object.position.y = - 95; 
     //this.renderer.sceneGL.add(object); 

     }, onProgress, onError); 



    }