8. 삼각형

CJB_ny·2023년 2월 28일
0

이득우 겜수

목록 보기
6/9

8-1

메시를 구성하는 정점 배열, 인덱스 배열 만들어준다.

인덱스배열의 크기는 항상 삼각형 수 * 3이다. 정점의 인덱스 (순번)을 나타내야하기 때문에.

0, 1, 2
0, 2, 3

순이다.

이동, 회전, 크기 부분은 이전과 동일하게 이동 변환행렬, 회전 변환행렬, 크기 변환행렬을 곱해

크기->회전->이동 순으로 적용시킨 합성행렬을 통해 좌표들을 찍어낸다.

// 렌더링 로직을 담당하는 함수
void SoftRenderer::Render2D()
{
	// 렌더링 로직에서 사용하는 모듈 내 주요 레퍼런스
	auto& r = GetRenderer();
	const auto& g = Get2DGameEngine();

	// 배경에 격자 그리기
	DrawGizmo2D();

	// 메시 데이터의 선언
	static constexpr float squareHalfSize = 0.5f;
	static constexpr size_t vertexCount = 4;
	static constexpr size_t triangleCount = 2;
	
	// 메시를 구성하는 정점 배열 생성
	static constexpr std::array<Vertex2D, vertexCount> rawVertices =
	{
		Vertex2D(Vector2(-squareHalfSize, -squareHalfSize)),
		Vertex2D(Vector2(-squareHalfSize, squareHalfSize)),
		Vertex2D(Vector2(squareHalfSize, squareHalfSize)),
		Vertex2D(Vector2(squareHalfSize, -squareHalfSize))
	};

	// 메시를 구성하는 인덱스 배열 생성
	static constexpr std::array<size_t, triangleCount * 3> indices =
	{
		0, 1, 2,
		0, 2, 3
	};

	// 아핀 변환 행렬 ( 크기 ) 
	Vector3 sBasis1(currentScale, 0.f, 0.f);
	Vector3 sBasis2(0.f, currentScale, 0.f);
	Vector3 sBasis3 = Vector3::UnitZ;
	Matrix3x3 sMatrix(sBasis1, sBasis2, sBasis3);

	// 아핀 변환 행렬 ( 회전 ) 
	float sin = 0.f, cos = 0.f;
	Math::GetSinCos(sin, cos, currentDegree);
	Vector3 rBasis1(cos, sin, 0.f);
	Vector3 rBasis2(-sin, cos, 0.f);
	Vector3 rBasis3 = Vector3::UnitZ;
	Matrix3x3 rMatrix(rBasis1, rBasis2, rBasis3);

	// 아핀 변환 행렬 ( 이동 ) 
	Vector3 tBasis1 = Vector3::UnitX;
	Vector3 tBasis2 = Vector3::UnitY;
	Vector3 tBasis3(currentPosition.X, currentPosition.Y, 1.f);
	Matrix3x3 tMatrix(tBasis1, tBasis2, tBasis3);

	// 모든 아핀 변환을 곱한 합성 행렬. 크기-회전-이동 순으로 적용
	Matrix3x3 finalMatrix = tMatrix * rMatrix * sMatrix;

	// 행렬을 적용한 메시 정보를 사용해 물체를 렌더링
	static std::vector<Vertex2D> vertices(vertexCount);
	for (size_t Vi = 0; Vi < vertexCount; ++Vi)
	{
		vertices[Vi].Position = finalMatrix * rawVertices[Vi].Position;
	}

	// 변화된 정점을 잇는 선 그리기
	for (size_t ti = 0; ti < triangleCount; ++ti)
	{
		size_t bi = ti * 3;
		r.DrawLine(vertices[indices[bi]].Position, vertices[indices[bi + 1]].Position, _WireframeColor);
		r.DrawLine(vertices[indices[bi]].Position, vertices[indices[bi + 2]].Position, _WireframeColor);
		r.DrawLine(vertices[indices[bi + 1]].Position, vertices[indices[bi + 2]].Position, _WireframeColor);
	}

	// 현재 위치, 크기, 각도를 화면에 출력
	r.PushStatisticText(std::string("Position : ") + currentPosition.ToString());
	r.PushStatisticText(std::string("Scale : ") + std::to_string(currentScale));
	r.PushStatisticText(std::string("Degree : ") + std::to_string(currentDegree));
}
profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글