개요


무게중심 좌표를 이용하여 삼각형 내의 한 점에 대한 정점 정보를 계산한다. 무게중심 좌표에는 각 삼각형의 정점과 비중값이 있기 때문에 각 정점 정보를 비중값으로 보간하여 계산할 수 있다.



Input


타입매개변수설명
inttID삼각형 ID
doublebary0, bary1, bary2무게중심 좌표 (합=1.0)


Output


타입매개변수설명
FVertexInfo&vinfo보간된 정점 속성들

FVertexInfo 구조체

struct FVertexInfo
{
    FVector3d Position;    // 위치
    bool      bHaveN;      // 법선 유무
    FVector3f Normal;      // 법선 (정규화됨)
    bool      bHaveC;      // 색상 유무
    FVector3f Color;       // 색상
    bool      bHaveUV;     // UV 유무
    FVector2f UV;          // UV 좌표
};


알고리즘


초기화

vinfo = FVertexInfo();                  // 기본값으로 초기화
const FIndex3i& tIDs = Triangles[ tID ];  // 삼각형의 정점 ID [A, B, C]

위치(Position) 보간

vinfo.Position = bary0 * Vertices[ tIDs[ 0 ] ] +
                 bary1 * Vertices[ tIDs[ 1 ] ] +
                 bary2 * Vertices[ tIDs[ 2 ] ];

법선(Normal) 보간

vinfo.bHaveN = HasVertexNormals();
if ( vinfo.bHaveN )
{
    const TDynamicVector< FVector3f >& normalsR = this->VertexNormals.GetValue();
    vinfo.Normal = (float)bary0 * normalsR[ tIDs[ 0 ] ] +
                   (float)bary1 * normalsR[ tIDs[ 1 ] ] +
                   (float)bary2 * normalsR[ tIDs[ 2 ] ];
    Normalize( vinfo.Normal );  // 정규화 필수!
}

법선 벡터는 방향만 중요하므로 보간 후 정규화한다.


색상(Color) 보간

vinfo.bHaveC = HasVertexColors();
if ( vinfo.bHaveC )
{
    const TDynamicVector< FVector3f >& colorsR = this->VertexColors.GetValue();
    vinfo.Color = (float)bary0 * colorsR[ tIDs[ 0 ] ] +
                  (float)bary1 * colorsR[ tIDs[ 1 ] ] +
                  (float)bary2 * colorsR[ tIDs[ 2 ] ];
}

UV 좌표 보간

vinfo.bHaveUV = HasVertexUVs();
if ( vinfo.bHaveUV )
{
    const TDynamicVector< FVector2f >& uvR = this->VertexUVs.GetValue();
    vinfo.UV = (float)bary0 * uvR[ tIDs[ 0 ] ] +
               (float)bary1 * uvR[ tIDs[ 1 ] ] +
               (float)bary2 * uvR[ tIDs[ 2 ] ];
}