2016-11-14 2 views
0

Я использую Three.js. Нашел действительно хорошую библиотеку Decal, написанную Benpurdy. Он очень легко модифицируется, а также использует описанные методы. 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; 
} 

Цените, если кто-нибудь может пролить свет на то, как это сделать? Благодарю.

ответ

0

Я решил решить эту проблему, написав еще одну функцию для вычисления пересечений с буферометрией. Потребовалось некоторое время, пытаясь понять исходный код геометрии буфера.

this.createGeometryFromBufferGeometry = 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.attributes.position.array.length; i+=9){ 

    var pts = []; 
    var valid = false; 

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


     var vec = new THREE.Vector3(geom.attributes.position.array[i+v],geom.attributes.position.array[i+v+1],geom.attributes.position.array[i+v+2]); 
     console.log((i+v) + " " + (i+v+1) + " " + (i+v+2)); 
     console.log(vec); 

     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]); 
     } 

     decalGeometry.faceVertexUvs[0].push(uv); 

     var newFace = new THREE.Face3() 

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

     decalGeometry.faces.push(newFace); 
    } 

    } 
    return decalGeometry; 
} 
0

BufferGeometry() имеет способ .fromGeometry(). Populates this BufferGeometry with data from a Geometry object.

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

UPD. Вы можете использовать другой путь.

var bufGeom = new THREE.BoxBufferGeometry(1,1,1); 
var geom = new THREE.Geometry().fromBufferGeometry(bufGeom); 
+0

Спасибо, я пробовал. В то время как он работает, функция «деколь», которую я использую, быстро становится дорогой и медленной на моделях с умеренной значимостью. Но спасибо за это. –

+0

Я обновил ответ. – prisoner849

+0

Спасибо за обновление. Да, они преобразуются между геометрией и буферометрией. Я попробовал их и, как уже упоминалось, вызывает всплеск памяти от 200 до 900 мб. У меня есть решение, которое я кодировал, обратился к проблеме в ее корне, имея дело с пересечением сетки и создавая сетку, способную обрабатывать буферную метрику. –

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(); 
    } 
} 
Смежные вопросы