응애맘마조

230601 강의 본문

공부/3D강의

230601 강의

TH.Wert 2023. 6. 1. 18:53

충돌 처리에 대한 것들을 이어서 했습니다. 게임을 만들 때 충돌 처리에 대한 상호작용이 많이 중요합니다. 이번엔 바닥을 따로 만들고 그 안에서 마우스 클릭으로 객체를 움직이는 방법에 대해서 했었습니다.

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

해당 코드를 보면 알 수 있듯이 좌표가 전부 똑같지 않기 때문에 그만큼의 차이를 줄여놓고 사용하는 방법입니다.

 

읽어주셔서 감사합니다.

'공부 > 3D강의' 카테고리의 다른 글

회전보간  (0) 2023.06.05
230602 강의  (0) 2023.06.05
230531 강의  (0) 2023.05.31
230530 강의  (0) 2023.05.30
230526 강의  (0) 2023.05.29