2016-04-25 9 views
0

すでにすべての頂点を持つ図形にインデックスを追加する方法を理解しようとしています。私は頂点によって私が必要とするところにそれらを持っているのを見ることができますが、インデックスが適切に追加されていないことに起因する変なアーティファクトがあります。しかし、私はそれらを正しく追加する方法がわかりません。メッシュにインデックスを追加する

与えるものドロー頂点
Surface::Surface() 
{ 
    int size = 200; 
    ofPoint p1(0, 0, 0), p2(0, 0, size), p3(size, 0, size), p4(200, 0, 0); 

    s1 = new Curve(p1, p2); 
    s2 = new Curve(p2, p3); 
    s3 = new Curve(p4, p3); 
    s4 = new Curve(p1, p4); 

    for(double i = 0; i <= size; i++){ 
     for(double j = 0; j <= size; j++){ 
      mesh.addVertex(getPoint(i, j)); 
     } 
    } 

    int width = size, height = size; 
    for (int y = 0; y<=height; y++){ 
     for (int x=0; x<=width; x++){ 
      mesh.addIndex(x+y*width); 
      mesh.addIndex((x+1)+y*width); 
      mesh.addIndex(x+(y+1)*width); 

      mesh.addIndex((x+1)+y*width); 
      mesh.addIndex((x+1)+(y+1)*width); 
      mesh.addIndex(x+(y+1)*width); 
     } 
    } 
} 

enter image description here

をしかし、インデックスがあまりにも多くのドットを接続していると私はどのインデックスを接続する必要がありますどのようなものか不明です。

enter image description here

たぶんこの問題は、凹面形状に適切である:ワイヤーフレームを描きますか?誰もが多かれ少なかれ、彼らはメッシュ

答えて

1

にインデックスを追加したいときは、各次元でサイズ+ 1つの頂点を追加するために同じことを行うようだ:

for(double i = 0; i <= size; i++){ 
    for(double j = 0; j <= size; j++){ 
     mesh.addVertex(getPoint(i, j)); 
    } 
} 

しかし、その後、インデックスサイズ+各2つの頂点xとyとの寸法は、ループ内であなたが1に等しいサイズを追加することができる:

int width = size, height = size; 
for (int y = 0; y<=height; y++){ 
    for (int x=0; x<=width; x++){ 
     mesh.addIndex(x+y*width); 
     mesh.addIndex((x+1)+y*width); 
     mesh.addIndex(x+(y+1)*width); 

     mesh.addIndex((x+1)+y*width); 
     mesh.addIndex((x+1)+(y+1)*width); 
     mesh.addIndex(x+(y+1)*width); 
    } 
} 

これは、索引付けされごみ頂点をもたらすであろう。修正するには、単にループの状態を<の幅と<の高さに変更します。

int width = size, height = size; 
for (int y = 0; y<height; y++){ 
    for (int x=0; x<width; x++){ 
     mesh.addIndex(x+y*width); 
     mesh.addIndex((x+1)+y*width); 
     mesh.addIndex(x+(y+1)*width); 

     mesh.addIndex((x+1)+y*width); 
     mesh.addIndex((x+1)+(y+1)*width); 
     mesh.addIndex(x+(y+1)*width); 
    } 
} 

概念的には、頂点よりプリミティブが少ないものを作成する必要があります。想像するのが最も簡単なのは、サイズ== 1の場合です。頂点を2つ作成する必要がありますが、1つのクワッドしか作成する必要はありません。

+0

今はもっと意味がありますが、まだ多くのインデックスが追加されています。それは1から2から3から4までのポイントを行うべきラインのようなもので、4から1の最後のラインを追加します。毎回のループの実行時間を短くしてみましたが、役に立たないようです。変更なしで、あなたのコードは次のようになります:http://imgur.com/N8WIRIN – Axel

+0

はい、申し訳ありませんが、私は答えを編集しました。ループの条件を<=よりもむしろ<に変更する必要があります。概念的には、頂点よりプリミティブが少ないものを作成する必要があります。あなたが想像すれば、頂点の各ペアの間にクワッドを作成します。想像するのが最も簡単なのは、サイズ== 1の場合です。頂点を2つ作成する必要がありますが、1つのクワッドしか作成する必要はありません。 –

+0

私はそれのようなものを考え出しました。あなたがそれをする前に、あなたの編集に似たものを試していました。そして結果は同じです。私はあなたが私がそれらを追加していると思う順序でインデックスを追加していないと私は信じています。たとえば、forループを 'y Axel

関連する問題