2017-01-29 2 views
2

Я пытаюсь реализовать каркасную, который отображает четверной вместо трис с помощью этого кодаThreeJS Майя как реализации каркасного

var geo = new THREE.EdgesGeometry(_this.geometry); // or WireframeGeometry 
var mat = new THREE.LineBasicMaterial({ color: 0xffffff, linewidth: 2 }); 
var wireframe = new THREE.LineSegments(geo, mat); 
_this.scene.add(wireframe); 

Это производит следующее, когда модель оказывается

Maya and Threejs wireframes

Как видно из изображения, он не отображает все ребра и все еще отображает некоторые три. Мне нужно, чтобы это было похоже на то, как Maya отображает каркасы.

Я читал, что ThreeJS больше не поддерживает Face4, поэтому он всегда отображает tris вместо квадов, но мне было интересно, есть ли способ обойти это? Я также видел некоторые упоминания об использовании пиксельного шейдера для отображения только краев сетки, но я havnt смог понять/получить эту работу.

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

Это источник модели (http://pastebin.com/21XUKYbw)

Приветствия

+0

'EdgesGeometry' не оказывает копланарных ребер. Трис, вероятно, не плоский. – WestLangley

+0

@WestLangley Спасибо за ответ. Я только что прочитал ответ mrdoobs по вопросам github. Означает ли это, что нет способа добиться того, что я хочу с помощью трех? Было бы стыдно переходить к чему-то еще – Nexidian

+0

Извините, я не знаю, чего вы хотите, и я не экспериментировал с вашей моделью, поэтому я не могу ответить на ваш вопрос. – WestLangley

ответ

1

Ответ на это для тех, кто натыкается на этот вопрос в будущем.

Следуя за комментарием, сделанным WestLangley, я изменил код в WireframeGeometry.js, чтобы игнорировать рендеринг внутренних диагоналей, которые присутствуют при рендеринге каркаса, что дает вид четырехгранных граней. Что более знакомо 3D-художникам.

enter image description here

Это изменение, которое я сделал на дно WireframeGeometry.js. Это, по общему признанию, довольно хакерское исправление. Альтернативой было бы вычисление строк, которые вы хотите отобразить, до того, как trjs выполнит триангуляцию. Вы можете хранить предварительно треугольные грани в отдельном буфере.

 // non-indexed BufferGeometry 
     position = geometry.attributes.position; 

     var _i = 0; 
     for (i = 0, l = (position.count/3); i < l; i ++) { 

      for (j = 0; j < 3; j ++) 
       // three edges per triangle, an edge is represented as (index1, index2) 
       // e.g. the first triangle has the following edges: (0,1),(1,2),(2,0) 

       // Added a simple check here to only push the vertices that are not diagonal lines 
       if(!(j == 2 && _i == 1) || !(j == 1 && _i == 0)){ 
        index1 = 3 * i + j; 
        vertex.fromBufferAttribute(position, index1); 
        vertices.push(vertex.x, vertex.y, vertex.z); 

        index2 = 3 * i + ((j + 1) % 3); 
        vertex.fromBufferAttribute(position, index2); 
        vertices.push(vertex.x, vertex.y, vertex.z); 
       } 
      } 

      _i++; 
      if(_i == 2){ 
       _i = 0 
      } 
     }