응애맘마조
230601 강의 본문
충돌 처리에 대한 것들을 이어서 했습니다. 게임을 만들 때 충돌 처리에 대한 상호작용이 많이 중요합니다. 이번엔 바닥을 따로 만들고 그 안에서 마우스 클릭으로 객체를 움직이는 방법에 대해서 했었습니다.
if (INPUT->KeyDown(VK_RBUTTON))
{
Ray CamToMouseRay;
CamToMouseRay = Util::MouseToRay(INPUT->position, Camera::main);
Vector3 hit;
if (plane->Intersect(CamToMouseRay, hit))
{
src = dead->GetWorldPos();
dest = hit;
t = 0.0f;
Vector3 disV = dest - src;
dis = disV.Length();
dead->rotation.y = -atan2f(disV.z, disV.x) - PI * 0.5f;
}
}
if (t < 1.0f)
{
t += DELTA * 10.0f / dis ;
dead->SetWorldPosX(Util::Lerp(src, dest, t).x);
dead->SetWorldPosZ(Util::Lerp(src, dest, t).z);
}
마우스 오른쪽 클릭을 했을 때 캐릭터가 마우스 방향을 바라보고 움직이는 방식입니다.
실행 창 내에서의 마우스 사용과 NDC 좌표로 변환하는 것과 View 좌표로 변환에 대해 강의했었습니다.
마우스 커서는 사실 실행창과는 큰 연관이 없습니다. 스크린상 좌표도 다르고 월드 좌표도 다릅니다. 하지만 사용하기 위해 스크린 좌표와 월드 좌표값의 차이를 구해 그만큼 차이를 미리 줄여놓고 사용하기 때문에 큰 문제없이 사용할 수 있었습니다.
Ray Util::MouseToRay(Vector3 Mouse, Camera* Cam)
{
Mouse.x -= Cam->viewport.x;
Mouse.y -= Cam->viewport.y;
Vector2 MousePos;
//ndc로의 변환
MousePos.x = ((2.0f * Mouse.x) / Cam->viewport.width - 1.0f);
MousePos.y = ((-2.0f * Mouse.y) / Cam->viewport.height + 1.0f);
// view로의 변환
MousePos.x /= Cam->proj._11;
MousePos.y /= Cam->proj._22;
Ray CamToMouse;
CamToMouse.position = Cam->GetWorldPos();
CamToMouse.direction = Vector3(MousePos.x, MousePos.y, 1.0f);
Matrix inverse = Cam->view.Invert();
CamToMouse.direction = Vector3::TransformNormal(CamToMouse.direction, inverse);
CamToMouse.direction.Normalize();
return CamToMouse;
}
해당 코드를 보면 알 수 있듯이 좌표가 전부 똑같지 않기 때문에 그만큼의 차이를 줄여놓고 사용하는 방법입니다.
읽어주셔서 감사합니다.