1

パート1:

どうやって

for i = 1 To polyop.getNumEdges $ do
(
  append faces ((polyop.getfacesusingedge $ #{i}) as array)
  if faces[i][2] != undefined then
  (
    f1 = polyop.getfacenormal $ faces[i][1];
    f2 = polyop.getfacenormal $ faces[i][2];  
  )
)

meshopを使用して見て?

このコードは、編集可能なポリゴンからすべてのエッジを読み取り、簡単にアクセスできるようにエッジで接続している面を面に追加し法線を取得します。

問題は、以前はオブジェクトが編集可能なメッシュだったことです。ep に変換した後、何らかの理由で面の数が少なくなります。オブジェクト全体を三角形のみで構成する必要があるため、変換によっていくつかの三角形がポリゴンに結合されているように見えるため、このアプローチは使用できません。

パート2:

私には機能があります

fn getAnglebetweentwoFaces face1 face2 =
(
    --theAngle = acos(dot face1 face2)
    theAngle = acos(dot (normalize face1) (normalize face2))
    return theAngle
) 

これは「うまく」機能します。2つの面の間の角度を教えてくれますが、2つの面がオブジェクトの一部であるか外側であるかを知る必要があります。それ、どうやったら出来るの?

前もって感謝します。

編集:追加しました

if face2Coord < 0 then
(
  normAngle = 360 - normAngle
)
normAngle = 180 - normAngle
return normAngle

あなたの関数に、内角のマイナス値と外角のプラス値を取得するようになりました

4

1 に答える 1

1

パート1:

直接的な答えではありませんが、変換後に面の数が減少しているように見えることが唯一の問題であり、それをシンプルに保ちたい場合は、変換する前にすべてのメッシュ エッジを表示してください。編集可能なメッシュの構造は、編集可能なポリゴンの構造とはまったく異なります。eMesh では、それぞれが 3 つの頂点と 3 つのエッジを持ち、いずれも別の面と共有されない面を反復処理するため、これらのようなことが不必要に複雑になります。ePoly では、構造はエッジによって定義されるため、ループやリングの選択や、面 (実際にはポリゴン) 間で共有されるエッジの検索がはるかに簡単になります。

パート2:

これを実現するには、面の中心などの追加データが必要です (ジオメトリのねじれ具合に応じて、getFaceCenter または getSafeFaceCenter メソッドのいずれかを選択します)。これらのポイントがある場合、残りは簡単です。一方の面の中心がもう一方の面の平面の上にある場合、それはより小さい角度であり、それを変更しません。反対の場合は、それは実験 (360 - 角度)。

fn getAngleBetweenFaces normal1 normal2 center1 center2 =
(
    local face1Matrix = translate (matrixFromNormal normal1) center1
    local face2Coord = (center2 * (inverse face1Matrix)).z
    local normAngle = acos(dot (normalize normal1) (normalize normal2))
    if face2Coord < 0 do normAngle = 360 - normAngle
    normAngle 
)
于 2012-04-07T23:31:03.753 に答える