본문 바로가기
컴퓨터 그래픽스/Rasterization

Rasterization(3) - 원 그리기

by SL123 2024. 7. 20.

원 그리기

원은 삼각형을 여러개 그린 것입니다.
더 많은 삼각형을 사용할수록 원에 가까워집니다.

원이 있다라고 가정하면
원 위에있는 여러개의 점들 중에서
x축에서 각도가 theta 만큼 회전한 위치의 좌표는 costheta, sintheta로 

계산할 수 있습니다.
원의 반지름이 r이라면 앞에 r을 곱해주면 됩니다.

x축에서 봤을 때 빗변이 costheta 높이가 sintheta가 됩니다.
이 식을 이용해 회전을 구해 원을 그릴 수 있습니다.

theta 를 radian 각도로 구한다면
theta = 120도 = 120 / 180 * 3.14(파이)
이렇게 구하면됩니다.

삼각형을 그려 원을 만들때 정점을 시계방향으로 무조건 그려야합니다.

반지름, 원의 중심, 삼각형을 몇 개 그릴 지를 선언합니다.
int numberOfTriangles = 24;

그 후 float thetaRate = 2*PI / float(numberOfTriangles) 를 선언합니다.

2번째 정점을 임시로 정해줍니다.
vec3(center.x + radius, center.y, center.z);


3개의 정점을 구성하는 삼각형을 만듭니다.
theta += thetaRate; // 각도를 상승시킵니다.
Triangle.v0.pos = center; // 첫 번째 정점(가운데)
Triangle.v2.pos = vertex; // 세 번째 정점(오른쪽)
vertex = center + vec3(cos(theta) * radius, sin(theta) * radius, 0.f); // 회전
Triangle.v1.pos = vertex; // 두 번째 정점(위쪽)

가운데 -> 위쪽 -> 오른쪽 시계방향으로 그리게 됩니다.
이렇게 생성된 정점들을 담아서 그리게 되면 원이 완성됩니다.

하지만 DirectX에서는 GPU에 연산을 맡기기 때문에 이렇게 원을 그리지 않습니다.
DirectX는 vertices, indices 를 바탕으로 그리게 됩니다.

vertex는 6각형을 정의한다면 가운데 점 하나와 각을 잇는 점들의 위지만 

저장해주면됩니다.
18개의 vertex를 구현하면 편하겠지만 메모리를 많이 차지해 가급적이면 

적게 저장해주는 것이 좋습니다.

indices 는 vertex가 시계방향으로 돌아갈 수 있도록 설정해서
vertex의 배열에서 삼각형을 그릴 수 있도록 시계방향으로 설정해야합니다.
(삼각형 하나 당 indices는 3개)

똑같이 중심에 있는 vertex는 0이며 위에 기본적으로 했던 구현을 바탕으로 

thetaRate를 이용해 vertex를 추가합니다.