2016-08-14 5 views
-1

.OFFファイルでエンコードされた3Dメッシュがあります。頂点、これらの頂点の座標、および接続のみが符号化されます。いくつかの論文では、3Dメッシュを単位境界ボックスで正規化することができます。これは本当に何を意味しますか?私たちはこれをどうやってできるのですか?ユニット境界ボックス内の3D非着色メッシュを正規化する方法

答えて

1

つまり、メッシュは、サイズが1の軸合わせキューブによって定義されたスペースに収まることを意味します。たとえば、角:A(-0.5,-0.5,-0.5)B(+0.5,+0.5,+0.5)で定義されます。すべての使用の頂点を通じてだから、ループの実際のバウンディングボックスに

を取得し、各軸A0(xmin,ymin,zmin),B0(xmax,ymax,zmax)座標最小値と最大値を覚えて

  1. :これを達成するために

  2. ノーマライズバウンディングボックスA,B

    (線形補間によって)だから、再び各頂点をループし、それらを再計算します。たとえば、次のようになります。

    Vertex[i].x=A.x + (B.x-A.x)*(Vertex[i].x-A0.x)/(B0.x-A0.x) 
    Vertex[i].y=A.y + (B.y-A.y)*(Vertex[i].y-A0.y)/(B0.y-A0.y) 
    Vertex[i].z=A.z + (B.z-A.z)*(Vertex[i].z-A0.z)/(B0.z-A0.z) 
    

    問題はアスペクト比を考慮しないことです。

    scale = min((B.x-A.x)/(B0.x-A0.x)), 
          (B.y-A.y)/(B0.y-A0.y), 
          (B.z-A.z)/(B0.z-A0.z)) 
    Vertex[i].x=(Vertex[i].x-0.5*(A0.x+B0.x))*scale+0.5*(A.x+B.x) 
    Vertex[i].y=(Vertex[i].y-0.5*(A0.y+B0.y))*scale+0.5*(A.y+B.y) 
    Vertex[i].z=(Vertex[i].z-0.5*(A0.z+B0.z))*scale+0.5*(A.z+B.z) 
    

    私は右のSO/SEエディタでそれを得て、私は間違いをしなかった希望:ケースでは、メッシュは、あなたがこれを変更する必要があり、それを維持する必要があります。新しい境界ボックスのサイズ(最大のメッシュ軸のサイズが新しい境界ボックスに正確に収まる)を超えていないmax scaleを計算し、古い境界ボックスの中心が新しい境界ボックスの中心になるように、メッシュを再スケーリングします。

    一部のメッシュには、独自の変換行列も含まれています。その場合、頂点をそのまま残して、この変換をこの行列に直接エンコードすることができます。しかし、通常、メッシュの正規化が必要な場合は、いくつかの頂点の操作でそれを必要とするため、頂点を変更する方が一般的です。

関連する問題