Esempio n. 1
0
//-----------------------------------------------------------------------------//
// 인공지능클래스가 담당하는 캐릭터에 명령이 내려질때 마다
// 이 함수가 호출된다. CControl 클래스에서 호출된다.
//-----------------------------------------------------------------------------//
void CAIObject::Command( SMsg Msg )
{
	switch( Msg.type )
	{
	case MSG_KEYDOWN:
//		KeyProc( Msg.lparam, Msg.wparam );
		break;

	case MSG_SETPOS:
		{
			Vector3 *pv = (Vector3*)Msg.lparam;
			if( m_pHero )
			{
				Vector3 v1 = m_pHero->GetPos();
				m_Distance = sqrtf( pv->LengthRoughly( v1 ) );
			}
		}
		break;

	case MSG_MOVPOS:
		{

		}
		break;
	}

}
Esempio n. 2
0
bool cMove::ActionUpdate(const float elapseTime)
{
	IArtificialIntelligence *obj = GetOwner();
	RETV(!obj, false);

	const Vector3 curPos = obj->aiGetTransform().GetPosition();

	// 회전 보간 계산
	if (m_rotateTime < m_rotateInterval)
	{
		m_rotateTime += elapseTime;

		const float alpha = min(1, m_rotateTime / m_rotateInterval);
		const Quaternion q = m_fromDir.Interpolate(m_toDir, alpha);
		obj->aiGetTransform() = q.GetMatrix();
	}

	// 캐릭터 이동.
	const Vector3 pos = curPos + m_dir * m_speed * elapseTime;
	obj->aiGetTransform().SetPosition(pos);

	// 목적지에 가깝다면 종료.
	// 프레임이 낮을 때, 통과되는 문제가 있을 수 있다.
	if (pos.LengthRoughly(m_dest) < 0.01f)
		return false; // 목적지 도착. 액션종료.

	return true;
}
Esempio n. 3
0
// 광선 orig, dir 에 충돌된 면이 있다면 true 를 리턴하고, 충돌 위치를 out에 
// 저장해서 리턴한다.
bool cGrid2::Pick( const Vector3 &orig, const Vector3 &dir, Vector3 &out )
{
	bool isFirst = true;
	sVertexNormTex *vertices = (sVertexNormTex*)m_vtxBuff.Lock();
	WORD *indices = (WORD*)m_idxBuff.Lock();
	RETV(!vertices || !indices, false);

	for (int i=0; i < m_idxBuff.GetFaceCount()*3; i+=3)
	{
		const Vector3 &p1 = vertices[ indices[ i]].p;
		const Vector3 &p2 = vertices[ indices[ i+1]].p;
		const Vector3 &p3 = vertices[ indices[ i+2]].p;

		const Triangle tri(p1, p2, p3);
		const Plane p(p1, p2, p3);

		const float dot = dir.DotProduct( p.N );
		if (dot >= 0)
			continue;

		float t;
		if (tri.Intersect(orig, dir, &t))
		{
			if (isFirst)
			{
				isFirst = false;
				out = orig + dir * t;
			}
			else
			{
				const Vector3 v = orig + dir * t;
				if (orig.LengthRoughly(v) < orig.LengthRoughly(out))
					out = v;
			}
		}
	}
	m_vtxBuff.Unlock();
	m_idxBuff.Unlock();

	return !isFirst;
}