Exemplo n.º 1
0
/*
================
AdjustAngles

Moves the local angle positions
================
*/
void CInput::AdjustAngles ( float frametime )
{
	float	speed;
	QAngle viewangles;
	
	// Determine control scaling factor ( multiplies time )
	speed = DetermineKeySpeed( frametime );
	if ( speed <= 0.0f )
	{
		return;
	}

	// Retrieve latest view direction from engine
	engine->GetViewAngles( viewangles );

	// Adjust YAW
	AdjustYaw( speed, viewangles );

	// Adjust PITCH if keyboard looking
	AdjustPitch( speed, viewangles );
	
	// Make sure values are legitimate
	ClampAngles( viewangles );

	// Store new view angles into engine view direction
	engine->SetViewAngles( viewangles );
}
Exemplo n.º 2
0
/*
================
AdjustAngles

Moves the local angle positions
================
*/
void CInput::AdjustAngles ( float frametime )
{
	float	speed;
	QAngle viewangles;
	
	// Determine control scaling factor ( multiplies time )
	speed = DetermineKeySpeed( frametime );
	if ( speed <= 0.0f )
	{
		return;
	}

	C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer();

	if (pPlayer && (pPlayer->GetFlags() & (FL_FREECAM | FL_REMOTECONTROLLED) || pPlayer->m_nButtons & IN_WALK))
		return;

	// Retrieve latest view direction from engine
	engine->GetViewAngles( viewangles );

	// Adjust YAW
	AdjustYaw( speed, viewangles );

	// Adjust PITCH if keyboard looking
	AdjustPitch( speed, viewangles );
	
	// Make sure values are legitimate
	ClampAngles( viewangles );

	// Store new view angles into engine view direction
	engine->SetViewAngles( viewangles );
}
Exemplo n.º 3
0
void CRouter::PreparePath(BOOL bLinear2Curve, D3DXMATRIX *mat, const float &fSpeed)
{
	m_fAgl2Ajust = 0.0f;
	m_fPerAgl = 0.0f;
	if (bLinear2Curve)//直线运动转向曲线运动
	{		
		//计算出转角
		D3DXVECTOR3 vTempB(m_pCurDest->pNext->pPos->x, mat->_42, m_pCurDest->pNext->pPos->z);
		D3DXVECTOR3 vTempA(m_pCurDest->pPos->x, mat->_42, m_pCurDest->pPos->z);
		D3DXMATRIX inverseOrt;
		D3DXMatrixInverse(&inverseOrt, NULL, mat);
		D3DXVec3TransformCoord(&vTempB, &vTempB, &inverseOrt);
		D3DXVec3TransformCoord(&vTempA, &vTempA, &inverseOrt);
		m_fAgl2Ajust = CaculateYaw(&(vTempB - vTempA));
		//计算出半径,从而计算角速度
		m_fRadius = (vTempA.z - vTempA.x/tanf(m_fAgl2Ajust))/tanf(m_fAgl2Ajust/2);
		if (fSpeed > 750)
		{
			m_fPerAgl = m_fAgl2Ajust/80.0f;
		}
		else if (fSpeed > 580)
		{
			m_fPerAgl = m_fAgl2Ajust/120.0f;
		}
		else if (fSpeed > 400)
		{
			m_fPerAgl = m_fAgl2Ajust/160.0f;
		}
		else if (fSpeed > 200)
		{
			m_fPerAgl = m_fAgl2Ajust/210.0f;
		}
		else 
		{
			m_fPerAgl = m_fAgl2Ajust/260.0f;
		}
	

	}
	else//曲线运动转向直线运动
	{
		//调整线速度矢量的方向
		D3DXVECTOR3 vTemp = *m_pCurDest->pPos - *m_pCurDest->pPrev->pPos;
		vTemp.y = mat->_42;
		D3DXMATRIX inverseOrt;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         		
		D3DXMatrixInverse(&inverseOrt, NULL, mat);
		D3DXVec3TransformNormal(&vTemp, &vTemp, &inverseOrt);
		m_fAgl2Ajust = CaculateYaw(&vTemp);
		m_fPerAgl = m_fAgl2Ajust/50;//分50次平滑地调整方向
		AdjustYaw(m_fPerAgl, mat);
	}
}
Exemplo n.º 4
0
void CRouter::MoveCurvely(D3DXVECTOR3 *vCurPos, D3DXMATRIX *mat, const float fSpeed, float fTime)
{
	//计算当前位置
	D3DXVECTOR3 vPos(m_fRadius*(1-cosf(m_fPerAgl)), 0, m_fRadius*sinf(m_fPerAgl));
	D3DXVec3TransformCoord(vCurPos, &vPos, mat);
	//绕Y轴调整物体的世界矩阵
	mat->_41 = vCurPos->x;
	mat->_42 = vCurPos->y;
	mat->_43 = vCurPos->z;
	if(fabs(m_fAgl2Ajust) > 1e-6)
	{
		AdjustYaw(m_fPerAgl, mat);
	}

}
Exemplo n.º 5
0
void CRouter::MoveLinearly(D3DXVECTOR3 *vCurPos, D3DXMATRIX *mat, const float fSpeed, float fTime)
{
	D3DXVECTOR3 vVel(mat->_31,0,mat->_33);
	D3DXVec3Normalize(&vVel, &vVel);
	vVel *= fSpeed;
	D3DXVECTOR3 vTrans = vVel*fTime;
	*vCurPos += vTrans;
	//平移调整物体世界坐标方向矩阵
	D3DXMATRIX mTrans;
	D3DXMatrixTranslation(&mTrans, vTrans.x, vTrans.y, vTrans.z);
	D3DXMatrixMultiply(mat, mat, &mTrans);
	if(fabs(m_fAgl2Ajust) > 1e-4)
	{
		AdjustYaw(m_fPerAgl, mat);
	}

}