Ejemplo n.º 1
0
void 	Roll(CVector3f tarVec,CVector3f curVec,FLOAT &roll)//z
{
	tarVec.z = 0;
	tarVec.normalize();
	curVec.z =0;
	curVec.normalize();
	if((curVec.x == 0 && curVec.y == 0)
	||  (tarVec.x == 0 && tarVec.y == 0))
	{
		roll = 0;return;
	}
	FLOAT dot = dotpdut(tarVec,curVec);
	if (dot < 0.9999 && dot > -0.9999)
	{
		CVector3f axis = cropdut(tarVec,curVec);
		if(axis.z > 0)
		{
			roll =  acos(dot) * H3DMath::M_RAD2DEG;
		}
		else
		{
			roll =  -acos(dot) * H3DMath::M_RAD2DEG;
		}
	}
	else
	{
		roll = 0;
	}
}
Ejemplo n.º 2
0
void 	Pitch(CVector3f tarVec,CVector3f curVec,FLOAT &pitch)//x
{
	tarVec.x = 0;
	tarVec.normalize();
	curVec.x =0;
	curVec.normalize();
	if( (curVec.y == 0 && curVec.z == 0)
	||  (tarVec.y == 0 && tarVec.z == 0))//if curVec or tarVec is zero-vector
	{
		pitch = 0;return;
	}
	FLOAT dot = dotpdut(tarVec,curVec);
	if (dot < 0.9999 && dot > -0.9999)
	{
		CVector3f axis = cropdut(curVec,tarVec);
		if(axis.x > 0)
		{
			pitch =  acos(dot) * H3DMath::M_RAD2DEG;
		}
		else
		{
			pitch =  -acos(dot) * H3DMath::M_RAD2DEG;
		}
	}
	else
	{
		pitch = 0;
	}
}
Ejemplo n.º 3
0
void 	Yaw(CVector3f tarVec,CVector3f curVec,FLOAT &yaw)//y
{
	tarVec.y = 0;
	tarVec.normalize();
	curVec.y =0;
	curVec.normalize();
	if((curVec.x == 0 && curVec.z == 0)
	||  (tarVec.x == 0 && tarVec.z == 0))
	{
		yaw = 0;return;
	}
	FLOAT dot = dotpdut(tarVec,curVec);
	if (dot < 0.9999 && dot > -0.9999)
	{
		CVector3f axis = cropdut(tarVec,curVec);
		if(axis.y > 0)
		{
			yaw =  acos(dot) * H3DMath::M_RAD2DEG;
		}
		else
		{
			yaw =  -acos(dot) * H3DMath::M_RAD2DEG;
		}
	}
	else
	{
		yaw = 0;
	}
}
Ejemplo n.º 4
0
CQuaternion CCD(CVector3f root,CVector3f curEnd,CVector3f desireEnd)
{
	//Local Variables
	FLOAT	cosAngle,turnAngle;
	CVector3f curVector,targetVector;
	CQuaternion quat(0,0,0,1);
	FLOAT IK_POS_THRESH = 0.0000029403;
	// SEE IF I AM ALREADY CLOSE ENOUGH
	if (euclideanDist(curEnd, desireEnd) > IK_POS_THRESH){
			// CREATE THE VECTOR TO THE CURRENT EFFECTOR POS
			curVector	= curEnd	- root;
			// CREATE THE DESIRED EFFECTOR POSITION VECTOR
			targetVector= desireEnd - root;
			// NORMALIZE THE VECTORS (EXPENSIVE, REQUIRES A SQRT)
			curVector.normalize();
			targetVector.normalize();
			// THE DOT PRODUCT GIVES ME THE COSINE OF THE DESIRED ANGLE
			cosAngle = dotpdut(targetVector,curVector);

			assert(! (fabs(cosAngle)-0.0000001 > 1));//fabscosAngle = [0,1]
			// IF THE DOT PRODUCT RETURNS 1.0, I DON'T NEED TO ROTATE AS IT IS 0 DEGREES
			if(cosAngle < 0.99999999999)
			{
				// USE THE CROSS PRODUCT TO CHECK WHICH WAY TO ROTATE
				CVector3f crossResult = cropdut(curVector,targetVector);
				crossResult.normalize();			//normalize the vector

				turnAngle = acos((FLOAT)cosAngle);	// GET THE ANGLE

				//calculate quaternion
				CQuaternion quat(\
					crossResult.x*sin(turnAngle/2),\
					crossResult.y*sin(turnAngle/2),\
					crossResult.z*sin(turnAngle/2),\
					cos(turnAngle/2));

				quat.normalize();
				return quat;
			}
	}
	return quat;
}
Ejemplo n.º 5
0
	void CAnimCamera::OnEvent(InputEvent & event)
	{
		COperator *pOperator = NULL;
		pOperator = CMapEditApp::GetInst()->GetOperator();
		if ( pOperator == NULL || !m_bActive )
		{
			return;
		}

		CVector3f vecVector;
		CVector3f hitpoint = pOperator->GetHitPoint();
		switch ( event.eType )
		{
		case EIET_KB_KEYDOWN :
			{
				// handle keyboard
				if ( m_bMovable )
				{
					// left
					if ( event.dwData == DIK_A )
					{
						vecVector	= -m_pCamEx->getRIGHT();
						vecVector.y = 0;
						vecVector.normalize();
						vecVector   *= MOVE_SPEED_RATIO;
						MoveRTS(vecVector) ;
						hitpoint.x	+= vecVector.x;
						hitpoint.z	+= vecVector.z;
						pOperator->SetHitPoint(hitpoint);
						m_bResetVS  = true;
					}

					// right
					if ( event.dwData == DIK_D )
					{
						vecVector	= m_pCamEx->getRIGHT();
						vecVector.y = 0;
						vecVector.normalize();
						vecVector   *= MOVE_SPEED_RATIO;
						MoveRTS(vecVector) ;
						hitpoint.x	+= vecVector.x;
						hitpoint.z	+= vecVector.z;
						pOperator->SetHitPoint(hitpoint);
						m_bResetVS  = true;
					}

					// up
					if ( event.dwData == DIK_W )
					{
						vecVector	= m_pCamEx->getDIRECTION();
						vecVector.y	= 0;
						vecVector.normalize();
						vecVector	*= MOVE_SPEED_RATIO;
						MoveRTS(vecVector);
						hitpoint.x	+= vecVector.x;
						hitpoint.z	+= vecVector.z;
						pOperator->SetHitPoint(hitpoint);
						m_bResetVS  = true;
					}

					// down
					if ( event.dwData == DIK_S )
					{
						vecVector	= -m_pCamEx->getDIRECTION();
						vecVector.y	= 0;
						vecVector.normalize();
						vecVector	*= MOVE_SPEED_RATIO;
						MoveRTS(vecVector);
						hitpoint.x	+= vecVector.x;
						hitpoint.z	+= vecVector.z;
						pOperator->SetHitPoint(hitpoint);
						m_bResetVS = true;
					}


					// up another type
					if ( event.dwData == DIK_Q )
					{
						vecVector	= m_pCamEx->getDIRECTION();
						vecVector   *= MOVE_SPEED_RATIO;
						MoveRTS(vecVector);
						hitpoint.x	+= m_pCamEx->getDIRECTION().x;
						hitpoint.y	+= m_pCamEx->getDIRECTION().y;
						pOperator->SetHitPoint(hitpoint);
						m_bResetVS = true;
						CMapEditApp::GetInst()->GetOperator()->SetGPushed(false);
					}

					// down another type
					if ( event.dwData == DIK_E )
					{
						vecVector	= -m_pCamEx->getDIRECTION();
						vecVector   *= MOVE_SPEED_RATIO;
						MoveRTS(vecVector);
						hitpoint.x	-= m_pCamEx->getDIRECTION().x;
						hitpoint.y	-= m_pCamEx->getDIRECTION().y;
						pOperator->SetHitPoint(hitpoint);
						m_bResetVS = true;
						CMapEditApp::GetInst()->GetOperator()->SetGPushed(false);
					}
				}
			}
			break;

		case EIET_MS_WHEEL :
			{
				vecVector	= -m_pCamEx->getDIRECTION();
				vecVector.normalize();
				vecVector	*= -event.fData*ZOOM_SPEED_RATIO;
				Zoom(vecVector);
				hitpoint.x	+= vecVector.x;
				hitpoint.z	+= vecVector.z;
				pOperator->SetHitPoint(hitpoint);
				m_bResetVS = true;
			}
			break;

		case EIET_MS_MOVE :
			{
				if ( CInputDevice::GetInst()->GetButtonState(MK_RBUTTON) ) // right button down rotate
				{
					if( pOperator->GetEditState() == COperator::EES_SET_TILE_BLOCK )
						return;

					if ( m_bRotate )
					{
						int x,y;
						CInputDevice::GetInst()->GetMouseDelta(x,y);
						float pitch = 0.004f * y;
						float yaw	= 0.004f * x;

						// ÈÆ×ÔÉíÐýת
						Rotate(yaw, pitch);

						m_bResetVS = true;
						CMapEditApp::GetInst()->GetOperator()->SetGPushed(false);
					}
				}

				if ( CInputDevice::GetInst()->GetButtonState(MK_MBUTTON) )
				{
					int x,y;
					CInputDevice::GetInst()->GetMouseDelta(x,y);
					vecVector  = -m_pCamEx->getDIRECTION();
					vecVector *= y*ZOOM_SPEED_RATIO;
					Zoom(vecVector);
					m_bResetVS = true;
					CMapEditApp::GetInst()->GetOperator()->SetGPushed(false);
				}
			}
			break;

		default:
			break;
		}

		if ( m_bResetVS )
		{
			CMapEditApp::GetInst()->GetOperator()->UpdateParamsView();
		}
	}