개요
무게중심 좌표를 이용하여 삼각형 내의 한 점에 대한 정점 정보를 계산한다. 무게중심 좌표에는 각 삼각형의 정점과 비중값이 있기 때문에 각 정점 정보를 비중값으로 보간하여 계산할 수 있다.
Input
| 타입 | 매개변수 | 설명 |
|---|---|---|
| int | tID | 삼각형 ID |
| double | bary0, 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 ] ];
}