// 게임 로직과 렌더링 로직이 공유하는 변수
Vector2 currentPosition;
float currentScale = 10.f;
float currentDegree = 0.f;

// 게임 로직을 담당하는 함수
void SoftRenderer::Update2D(float InDeltaSeconds)
{
	...
	// 게임 로직의 로컬 변수
	static float moveSpeed = 100.f;
	static float scaleMin = 5.f;
	static float scaleMax = 20.f;
	static float scaleSpeed = 20.f;
	static float rotateSpeed = 180.f;

	Vector2 inputVector = Vector2(input.GetAxis(InputAxis::XAxis), input.GetAxis(InputAxis::YAxis)).GetNormalize();
	Vector2 deltaPosition = inputVector * moveSpeed * InDeltaSeconds;
	float deltaScale = input.GetAxis(InputAxis::ZAxis) * scaleSpeed * InDeltaSeconds;
	float deltaDegree = input.GetAxis(InputAxis::WAxis) * rotateSpeed * InDeltaSeconds;

	// 물체의 최종 상태 결정
	currentPosition += deltaPosition;
	currentScale = Math::Clamp(currentScale + deltaScale, scaleMin, scaleMax);
	currentDegree += deltaDegree;
}

// 렌더링 로직을 담당하는 함수
void SoftRenderer::Render2D()
{
	...

	// 렌더링 로직의 로컬 변수
	float rad = 0.f;
	static float increment = 0.001f;
	static std::vector<Vector2> hearts;


	// 하트를 구성하는 점 생성
	if (hearts.empty())
	{
		for (rad = 0.f; rad < Math::TwoPI; rad += increment)
		{
			// 하트 방정식
			// x와 y를 구하기.
			float sin = sinf(rad);
			float cos = cosf(rad);
			float cos2 = cosf(2 * rad);
			float cos3 = cosf(3 * rad);
			float cos4 = cosf(4 * rad);
			float x = 16.f * sin * sin * sin;
			float y = 13 * cos - 5 * cos2 - 2 * cos3 - cos4;

			hearts.push_back(Vector2(x, y));
		}
	}

	float sin = 0.f, cos = 0.f;
	Math::GetSinCos(sin, cos, currentDegree);

	for (auto const& v : hearts)
	{
		Vector2 scaledV = v * currentScale;
		Vector2 rotatedV = Vector2(scaledV.X * cos - scaledV.Y * sin, scaledV.X * sin + scaledV.Y * cos);
		Vector2 translatedV = rotatedV + currentPosition;

		r.DrawPoint(translatedV, LinearColor::Blue);
	}

	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));

}

출력 결과물

GetSinCos 함수를 사용해 currentDegree 값의 sin과 cos 값을 얻어낸다. 표준 라이브러리의 sinf, cosf함수의 인자는 호도법을 사용하지만 이 함수는 각도법을 사용하도록 구현되어있다. 

하트를 구성하는 점에 크기를 우선 적용한 뒤에 회전 공식을 저장한다. 그 뒤에 현재 위치값을 더해 최종 위치를 구해 출력한다.

'게임 수학' 카테고리의 다른 글

삼각 함수를 활용한 물체의 회전(개념)  (0) 2024.11.29
삼각함수(실습)  (0) 2024.11.29
삼각함수(개념)  (0) 2024.11.28
벡터의 결합과 생성  (0) 2024.11.27
벡터의 크기와 이동  (0) 2024.11.27

+ Recent posts