본문 바로가기

게임수학/CK소프트렌더러

벡터 크기와 이동

 벡터로 원그리기 실습을 진행하고자 한다.

 

1. 원을 생성하는 사고방식

지정한 반지름을 가진 원을 만들려면, 우선 원을 둘러싼 사각형 영역을 설정해야한다.

사각한 영역으로부터 간격이 일정한 벡터들을 모두 생성하고, 원의 영역에만 속한 벡터만 골라내어 벡터의 묶을 만들 수 있다.

 

2. 사각형에 속한 벡터의 크기는 Vector2 Size()함수에 구현되어 있다.

FORCEINLINE float Vector2::Size() const
{
	return sqrtf(SizeSquared());
}

 

3. 입력에 따라 원을 이동시키는 코드

// 게임 로직과 렌더링 로직이 공유하는 변수
// 변수 선언 영역
Vector2 currentPosition(100.f, 100.f);


// 게임 로직을 담당하는 함수
void SoftRenderer::Update2D(float InDeltaSeconds)
{
	// 게임 로직에서 사용하는 모듈 내 주요 레퍼런스
	auto& g = Get2DGameEngine();
	const InputManager& input = g.GetInputManager();

	// 게임 로직의 로컬 변수
	static float moveSpeed = 100.f;

	// X축과 Y축 입력을 결합해 입력 벡터를 생성한다.
	// X, Y축을 동시에 입력받게 되면 벡터 크기 값이 급성장함으로 정규화시킨다. GetNormalize()
	Vector2 inputVector = Vector2(input.GetAxis(InputAxis::XAxis), input.GetAxis(InputAxis::YAxis)).GetNormalize();

	Vector2 deltaPosition = inputVector * moveSpeed * InDeltaSeconds;

	//물체의 최종 상태 설정
	currentPosition += deltaPosition;
}

// 렌더링 로직을 담당하는 함수
void SoftRenderer::Render2D()
{
	// 렌더링 로직에서 사용하는 모듈 내 주요 레퍼런스
	auto& r = GetRenderer();	// 화면의 시각적 표현을 위해 렌더러 모듈의 래퍼런스를 가져옴
	const auto& g = Get2DGameEngine();

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

	// 렌더링 로직의 로컬 변수
	static float radius = 50.f;
	static std::vector<Vector2> circles;

	if (circles.empty())
	{
		for (float x = -radius; x <= radius; x++)
		{
			for (float y = -radius; y <= radius; y++)
			{
				Vector2 pointToTest = Vector2(x, y);	// x, y를 결합해 벡터를 선언한다.
				float squaredLength = pointToTest.SizeSquared();	// 벡터의 크기를 구한다.
				if (squaredLength <= radius * radius)
				{
					circles.push_back(Vector2(x, y));
				}


			}
		}
	}
	
	// 원을 구성하는 벡터를 모두 붉은색으로 표시
	for (auto const& v : circles)
	{
		r.DrawPoint(v + currentPosition, LinearColor::Red);
	}

	r.PushStatisticText("Coordinate : " + currentPosition.ToString());

}

 

'게임수학 > CK소프트렌더러' 카테고리의 다른 글

WireFrame Rendering  (0) 2024.09.18
CMaker 소프트렌더러 첫 실습  (0) 2024.09.10
CK 소프트 렌더러 입력 축  (0) 2024.09.10