본문 바로가기

DX

격자 평면 만들기

평면을 그릴 때는 삼각형 2개로 그릴 수 있다. 그러나 격자 구조로 그리드 형식으로 그리는데는 이유가 있다. 

 

이것은 지형이나 실린더, 구체와 같이 곡선이 들어가는 경우 이런 격자 형식이 필수적으로 사용된다.

아래와 같은 그림을 보면 확인 가능하다. 이제 저 각 점들을 원하는 각도로 회전시겨 이 사각형을 원처럼 감으면 실린더 형태가 나올 것이다.

 

 

이번엔 y 를 나누어보자.

 

 

아래 코드에서 너비와 높이 그리고 가로 세로 생길 사각형의 줄 개수를 정해주면 왼쪽 아래를 시작 위치로하여 너비 높이 폭 만큼 더해가며 vertex 를 만들고 인덱싱하여 mesh 에게 전해준다.

const float dx = width / numSlices;
const float dy = height / numStacks;

MeshData meshData;

vector<Vertex> &vertices = meshData.vertices;
vector<uint16_t> &indices = meshData.indices;

// y = -0.5f * height 인 점들
Vector3 stackStartPoint = Vector3(-0.5f * width, -0.5f * height, 0.0f);

for (int j = 0; j <= numStacks; j++)
{
    for (int i = 0; i <= numSlices; i++) {
        Vertex v;

        // x-y 평면에서 시작점을 x 방향으로 이동
        v.position = Vector3::Transform(
            stackStartPoint, Matrix::CreateTranslation(Vector3(
                                 dx * float(i), dy * float(j), 0.0f)));

        // 시점을 향하는 방향
        v.normal = Vector3(0.0f, 0.0f, -1.0f);
        v.texcoord = Vector2(float(i) / numSlices, 1.f - float(j) / numStacks);

        vertices.push_back(v);
    }
}    


// 인덱스 추가
for (int j = 0; j < numStacks; j++)
{
    const int offset = (numSlices + 1) * j;

    for (int i = 0; i < numSlices; i++) {

        // 첫번째 삼각형
        indices.push_back(offset + i);
        indices.push_back(offset + i + numSlices + 1);
        indices.push_back(offset + i + 1 + numSlices + 1);
        // 두 번째 삼각형  offset + 
        indices.push_back(offset + i);
        indices.push_back(offset + i + 1 + numSlices + 1);
        indices.push_back(offset + i + 1);
    }
}

 

 

그럼 z 값을 변경한다면?

 

v.position.z = sin(i * dx * 10.f) * 0.1;

 

아래처럼 굴곡을 줄 수 있다! 그런데 중간 부분이 살짝 평평한 느낌인데 이건 노멀 값을 바꾸지는 않았기 때문에 색이 제대로 들어가지 않은것이다.

 

 

'DX' 카테고리의 다른 글

구체 만들기  (0) 2025.07.12
실린더 모델링  (0) 2025.07.12
노멀 벡터 그리기  (0) 2025.07.06
와이어 프레임  (0) 2025.07.06
퐁 vs 블린 퐁  (0) 2025.06.16