// 게임 로직과 렌더링 로직이 공유하는 변수
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 |