DirectX

몬스터 -> 플레이어 추적 (내적 이용)

HYuk 2021. 7. 6. 16:02
728x90

#벡터의 내적

벡터의 내적은 두 벡터의 도트곱 이다.

내적을 하면 스칼라(크기)가 나오게 된다.

벡터의 내적은 다음과 같이 구할 수 있다.

이때 내적을 할 때 단위벡터로 내적을 하게 되면 cos(theta) 값을 구할 수 있는데,

그것을 acosf를 이용해서 각도를 구하면

몬스터가 플레이어를 바라보면서 자연스럽게 추적이 가능하다.

 

이때 내적을 하는 단위벡터가 하나가 필요한데

그 단위 벡터가 cos(theta)를 구하는 기준 축이 된다.

예를들어 D3DXVECTOR3 vA {1.f, 0.f, 0.f}; 와 내적을 하게 된다면

x축으로 부터 cos(theta)가 시작 되는 것이다.

 

D3DXVECTOR3 vA {0.f, 1.f, 0.f}; 로 내적을 하면 y축으로 부터 cos(theta)가 시작되므로

-1 곱해주는것도 x축 기준으로 해주어야한다.

 

https://youtu.be/Xl6raI7Mvhw

 

	POINT pt{};
	GetCursorPos(&pt);
	ScreenToClient(g_hWND, &pt);
	D3DXVECTOR3 vMouse{ (float)pt.x, static_cast<float>(pt.y), 0.f };
	m_tInfo.vDir = vMouse - m_tInfo.vPos; // 마우스 쪽으로의 벡터 (목적지 - 출발지)

	float fDist = D3DXVec3Length(&m_tInfo.vDir);

	D3DXVec3Normalize(&m_tInfo.vDir, &m_tInfo.vDir); // 단위벡터로 바꾸어줌

	D3DXVECTOR3 vLook{ 1.f, 0.f, 0.f }; // x방향의 단위벡터

	float fAngle = acosf(D3DXVec3Dot(&m_tInfo.vDir, &vLook)); // 내적 반환값으로 cos(theta)나옴
    //따라서 나온 cos(theta)를 acosf를 이용해서 각도를 구해줌

	if (m_tInfo.vPos.y < vMouse.y)
		fAngle *= -1.f;

	for (int i = 0; i < 4; ++i)
	{
		m_vQ[i].x = m_vP[i].x * cosf(fAngle) - m_vP[i].y * -sinf(fAngle);
		m_vQ[i].y = m_vP[i].x * -sinf(fAngle) + m_vP[i].y * cosf(fAngle);

		m_vQ[i] += m_tInfo.vPos;
	}

 

728x90

'DirectX' 카테고리의 다른 글

모작일지(3) 현재 진행상황  (0) 2021.08.09
모작일지(2)  (0) 2021.08.09
모작 일지 (1)  (0) 2021.08.05
D3DMATRIX, D3DXMATRIX 및 함수  (0) 2021.07.06
회전행렬을 이용하여 사각형 회전  (0) 2021.07.03