TA

TA 7강 / 3D 그래픽스 1,2

jh009 2026. 7. 16. 11:43

3D 그래픽스 1

Vertex → Triangle → Mesh → 3D Object

 

Vertex = 3D 공간의 점

Triangle = Vertex 3개로 구성된 면

Mesh = Vertex와 Triangle의 묶음


Mesh 기본 개념

3D 오브젝트의 형태를 표현하는 데이터 구조


Vertex

3D 공간의 한 점

 

3D 공간의 위치는 X, Y, Z 좌표로 표현

Vertex Position = (X, Y, Z)

Triangle

세 개의 Vertex로 만들어진 면

 

Triangle은 Vertex 배열의 0번, 1번, 2번 Vertex를 연결

  • Vertices[0]
  • Vertices[1]
  • Vertices[2]

Index를 사용하는 이유

Vertex 값을 Triangle마다 반복해서 저장하지 않고 Index로 참조하면 같은 Vertex를 재사용할 수 있


Trianale의 연결 순서

  • 두 Triangle은 같은 세 점을 사용하지만 연결 순서가 반대
  • Winding Order
    • 삼각형을 구성하는 Vertex를 어떤 순서로 연결했는지를 의미


MeshObject 구현

  • Vertex 목록
  • Triangle 목록


Triangle Mesh

MeshObject CreateTriangle()
{
    MeshObject mesh;

    mesh.AddVertex(0.0f, 0.0f, 0.0f);       // 0
    mesh.AddVertex(100.0f, 0.0f, 0.0f);     // 1
    mesh.AddVertex(0.0f, 100.0f, 0.0f);     // 2

    mesh.AddTriangle(0, 1, 2);

    return mesh;
}

 

 

Quad Mesh

MeshObject CreateQuad()
{
    MeshObject mesh;

    mesh.AddVertex(0.0f, 0.0f, 0.0f);       // 0
    mesh.AddVertex(100.0f, 0.0f, 0.0f);     // 1
    mesh.AddVertex(100.0f, 100.0f, 0.0f);   // 2
    mesh.AddVertex(0.0f, 100.0f, 0.0f);     // 3

    mesh.AddTriangle(0, 1, 2);
    mesh.AddTriangle(0, 2, 3);

    return mesh;
}

Cube의 기본 구조

여섯 개의 사각형 면

  • Face 6개
  • Face 1개 = Triangle 2개
  • Cube = Triangle 12개

Cube Vertex 배치

Cube의 크기를 Size라고 하고 절반 크기를 HalfSize라고 함

(-HalfSize, -HalfSize, -HalfSize)
( HalfSize, -HalfSize, -HalfSize)
( HalfSize,  HalfSize, -HalfSize)
(-HalfSize,  HalfSize, -HalfSize)

(-HalfSize, -HalfSize,  HalfSize)
( HalfSize, -HalfSize,  HalfSize)
( HalfSize,  HalfSize,  HalfSize)
(-HalfSize,  HalfSize,  HalfSize)
번호 X Y Z 의미
V0 아래쪽 면의 한 모서리
V1 + X 양의 방향으로 이동
V2 + + X와 Y 모두 양의 방향
V3 + Y 양의 방향으로 이동
V4 + V0의 바로 위
V5 + + V1의 바로 위
V6 + + + V2의 바로 위
V7 + + V3의 바로 위

Cube 생성 함수

MeshObject CreateCube(float size)
{
    MeshObject cube;

    const float h = size * 0.5f;

    cube.AddVertex(-h, -h, -h); // 0
    cube.AddVertex( h, -h, -h); // 1
    cube.AddVertex( h,  h, -h); // 2
    cube.AddVertex(-h,  h, -h); // 3

    cube.AddVertex(-h, -h,  h); // 4
    cube.AddVertex( h, -h,  h); // 5
    cube.AddVertex( h,  h,  h); // 6
    cube.AddVertex(-h,  h,  h); // 7

    // 아래쪽 면
    cube.AddTriangle(0, 2, 1);
    cube.AddTriangle(0, 3, 2);

    // 위쪽 면
    cube.AddTriangle(4, 5, 6);
    cube.AddTriangle(4, 6, 7);

    // 앞쪽 면
    cube.AddTriangle(0, 1, 5);
    cube.AddTriangle(0, 5, 4);

    // 뒤쪽 면
    cube.AddTriangle(3, 7, 6);
    cube.AddTriangle(3, 6, 2);

    // 왼쪽 면
    cube.AddTriangle(0, 4, 7);
    cube.AddTriangle(0, 7, 3);

    // 오른쪽 면
    cube.AddTriangle(1, 2, 6);
    cube.AddTriangle(1, 6, 5);

    return cube;
}
int main()
{
    MeshObject cube = CreateCube(100.0f);

    cube.PrintInfo();

    return 0;
}

3D 그래픽스 2

Vertex는 위치만 가진 점이 아님

 

Position Vertex

Position → Vertex 위치 결정

Triangle Index → Vertex 세 개를 연결해 면 구성

 

Rendering Vertex

데이터 역할
Position Vertex의 3D 위치
UV Texture를 읽기 위한 좌표
Normal 표면이 향하는 방향
Tangent 표면 위의 기준 방향
Color Vertex 단위 색상
Bone Index Skeletal Mesh의 뼈 정보
Bone Weight 뼈의 영향력

Cube의 Vertex가 8개에서 24개가 되는 이유


Vector2

UV에서는 X, Y 대신 U, V라고 부르기도 함

  • Vector2.X = U
  • Vector2.Y = V

UV

  • exture는 2D 이미지이고 Mesh는 3D 표면
  • Texture의 어느 위치를 Mesh의 어느 부분에 붙일지 알려주는 좌표가 필요하다.
    • Position = 3D 공간 좌표
    • UV = 2D Texture 좌표
    → 왼쪽 위 또는 아래 = (0, 0) / 오른쪽 끝 = U 1 / 세로 끝 = V 1

Quad의 UV

 

UV는 Vertex에 저장됨

  • UV는 면 하나에 저장되는 것이 아니라 일반적으로 Vertex 속성으로 저장
  • 그래픽스 파이프라인에서는 Vertex에 저장된 UV가 Triangle 내부에서 보관
    • Vertex UV→ 각 Pixel의 UV 결정
    • → Texture Sampling
    • → Triangle 내부에서 보간

Texture Sampling

UV 좌표를 사용해 Texture의 색상이나 데이터를 읽는 과정

 

UV

→ 색상 또는 데이터 읽기

→ Material 계산에 사용

→ Texture 위치 선택


Tangent

표면 위를 따라가는 기준 방향 중 하나

 

Normal

→ 표면 바깥 방향

 

Tangent

→ 표면 위의 U 방향 기준