Camera

김태훈·2024년 1월 10일
0

Win32API

목록 보기
18/24
post-custom-banner

Camera 기본 개념

카메라가 보는 곳이 화면의 중앙

obj pos는 실제 obj의 위치

카메라에 따라 obj이가 보이는 위치가 달라져야 한다.
실 좌표와 출력 좌표가 나뉘어 져야한다

렌더링을 진행 할때만 좌표를 카메라에 따라 달리 해준다

카메라가 있었진 않지만 현재 카메라의 위치는 해상도의 중앙이다
따라서 카메라가 처음 보는 곳이 해상도 중앙

모든 obj들이 camera를 알고 있어야함, 자식obj헤더에서 카메라헤더 파일참조

render pos

카메라가 움직인다면
카메라가 해상도 중앙에서 이동한 거리만큼
물체들은 반대쪽으로 이동해야 함

render pos는 실제 위치에서 중앙으로부터 차이를 빼주면 나온다

Vec2 CCamera::GetRenderPos(Vec2 _vObjPos)
{					  //중앙으로부터의 차이         
	return _vObjPos - m_vDiff;
}

target camera

매 업데이트 마다 타겟 obj의 위치를 카메라 중심으로 한다
void CCamera::update
{
if (m_pTargetObj)
{
if (m_pTargetObj->IsDead())
m_pTargetObj = nullptr;
else { m_vLookAt = m_pTargetObj->GetPos(); }
}
}

smoooth follow(마우스 클릭 좌표에 따른)


마우스 클릭이 발생하면 그 좌표에 카메라가 속력과 함께 이동한다

KeyMgr update에서 마우스 pos 얻기

POINT ptPos = {};
GetCursorPos(&ptPos);//마우스 위치를 컴퓨터 스크린 기준으로 알려줌
현재 윈도우와 스크린의 차이값이 발생
//현재 윈도우기준 값으로 바꿔준다
ScreenToClient(CCore::GetInst()->GetMainHwnd(),&ptPos);
m_vCurMousPos = Vec2((float)ptPos.x, (float)ptPos.y);

마우스 좌표 렌더링->실 좌표

클라이언트 속 마우스 좌표는 카메라 렌더링 중의 좌표이다
카메라의 위치는 실 위치를 알아야 하므로 렌더링->실제 좌표로 바꿔야 한다
Vec2 CCamera::GetRealPos(Vec2 _vObjPos)
{
return m_vDiff + _vObjPos;
}
마우스 좌 클릭하면 그곳의 실 좌표를 카메라로 하고 이동진행 시간을 0초로 초기화 한다
void SetLookAt(Vec2 _vLook) { m_vLookAt = _vLook; m_frunningtime = 0.f; }

방향벡터를 알아야 쫓아 갈수 있다

Vec2 vLookDir = (m_vLookAt - m_vPrevLookAt);//쫓아갈 방향 벡터

등속도 카메라 이동 업데이트

void CCamera::CalDiff(){
Vec2 vLookDir = (m_vLookAt - m_vPrevLookAt);//쫓아갈 방향 벡터
	m_frunningtime+=fDT;
	if (m_frunningtime >= m_ftime) 
    { m_vCurLookAt = m_vLookAt; 
    m_frunningtime = 0.f; m_fspeed = 0.f; 
    }
    //이동진행 시간이 목표 시간보다 같거나 클때,위치를 현재 위치를 목적지로 옮긴다
	else
	{	if(m_fspeed==0.f)
		m_fspeed = fdistance / m_ftime;//등속도 지정
		m_vCurLookAt = m_vPrevLookAt + (vLookDir.Normalize() * m_fspeed * fDT);
	}
	
	m_vDiff = m_vCurLookAt-vCenter ;// 현재 카메라와 화면중앙의 차이
	m_vPrevLookAt = m_vCurLookAt;//현재 지점이 이전 지점이 된다
}

}
profile
복습을 위한 핵심 내용 및 모작
post-custom-banner

0개의 댓글