원 그리기
원은 삼각형을 여러개 그린 것입니다.
더 많은 삼각형을 사용할수록 원에 가까워집니다.
원이 있다라고 가정하면
원 위에있는 여러개의 점들 중에서
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를 추가합니다.
'컴퓨터 그래픽스 > Rasterization' 카테고리의 다른 글
Rasterization(6) - 깊이 버퍼(Depth Buffer) (0) | 2024.07.27 |
---|---|
Rasterization(5) - 위성 만들기 (0) | 2024.07.20 |
Rasterization(4) - 물체의 이동과 회전 (0) | 2024.07.20 |
Rasterization(2) - 삼각형 그리기 (0) | 2024.07.19 |
Rasterization(1) - Ray Tracing 보다 Rasterization이 빠른 이유 (0) | 2024.07.17 |