/* ================ 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 ); }
/* ================ 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 ); }
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); } }
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); } }
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); } }