Beispiel #1
0
int SOSetSymMotionPoint( int symmtype, CMotionPoint* srcmp, CMotionPoint* dstmp, int deginvflag )
{

	CMotionPoint tempmp;
	tempmp = *srcmp;

	D3DXQUATERNION symmxq;
	symmxq.w = tempmp.m_q.w;
	symmxq.x = tempmp.m_q.x;
	symmxq.y = tempmp.m_q.y;
	symmxq.z = tempmp.m_q.z;

	D3DXVECTOR3 symmaxis;
	float symmangle;

	D3DXQuaternionToAxisAngle( &symmxq, &symmaxis, &symmangle );		

	if( deginvflag != 0 ){
		symmangle *= -1.0f;//!!!
	}

	switch( symmtype ){
	case SYMMTYPE_XP:
	case SYMMTYPE_XM:
	case SYMMTYPE_X:
		symmaxis.x *= -1.0f;
		tempmp.m_mvx *= -1.0f;
		break;
	case SYMMTYPE_YP:
	case SYMMTYPE_YM:
	case SYMMTYPE_Y:
		symmaxis.y *= -1.0f;
		tempmp.m_mvy *= -1.0f;
		break;
	case SYMMTYPE_ZP:
	case SYMMTYPE_ZM:
	case SYMMTYPE_Z:
		symmaxis.z *= -1.0f;
		tempmp.m_mvz *= -1.0f;
		break;
	default:
		DbgOut( "SymmOpe : SetSymMotionPoint : symmtype error !!!\n" );
		_ASSERT( 0 );
		return 1;
		break;
	}

	D3DXQUATERNION newxq;
	D3DXQuaternionRotationAxis( &newxq, &symmaxis, symmangle );

	tempmp.m_q.w = newxq.w;
	tempmp.m_q.x = newxq.x;
	tempmp.m_q.y = newxq.y;
	tempmp.m_q.z = newxq.z;

	*dstmp = tempmp;

	return 0;
}
bool Application::OnUpdate()
{
	lcTime::Get()->Update();
	m_pKeyboard->Update();
	m_pMouse->Update();

	lcCamera::FreeLookCamera(m_pCamera,1.0f,1.0f);
	m_pCamera->Update();
	
	if(lcKeyboard::IsKeyDown(KEY_ESCAPE))
		return 0;

	D3DXMATRIX outMat;
	D3DXQUATERNION invQuat;

	m_pScene->SetTranslate(g_kRootPosition);

	D3DXQUATERNION tempq;
	D3DXVECTOR3 tempAxis;
	float tempAngle;

	D3DXQuaternionToAxisAngle(&g_kRootRotation, &tempAxis, &tempAngle);
	tempAxis = -tempAxis;
	D3DXQuaternionRotationAxis(&tempq, &tempAxis, tempAngle);

	D3DXMatrixRotationQuaternion(&outMat,&tempq);
	m_pScene->SetRotate(outMat);

	if(g_bWireframe)
	{
		g_pkBox->SetPrimativeTopology(D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP);
	}
	else
	{
		g_pkBox->SetPrimativeTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
	}


	lcRenderer::GetDeviceContext()->PSSetSamplers(0,1,&CubeSampleState);

	m_pScene->Update();

	return m_pWindow->Tick();
}
Beispiel #3
0
int CRps::CalcSymPose( TSELEM* tsptr, CModel* srcmodel, CTraQ* traq, 
	CQuaternion* newqptr, D3DXVECTOR3* newtraptr, D3DXVECTOR3* neweulptr, D3DXVECTOR3 befeul )
{
	int ret;
	CQuaternion tmpq =  traq->m_q;
	D3DXVECTOR3 tmptra = traq->m_tra;
	D3DXVECTOR3 tmpeul = traq->m_cureul;

	D3DXQUATERNION symmxq;
	symmxq.w = tmpq.w;
	symmxq.x = tmpq.x;
	symmxq.y = tmpq.y;
	symmxq.z = tmpq.z;

	D3DXVECTOR3 symmaxis;
	float symmangle;

	D3DXQuaternionToAxisAngle( &symmxq, &symmaxis, &symmangle );		

	symmangle *= -1.0f;//!!!

	symmaxis.x *= -1.0f;
	tmptra.x *= -1.0f;

		
	D3DXQUATERNION newxq;
	D3DXQuaternionRotationAxis( &newxq, &symmaxis, symmangle );
	CQuaternion srcq;
	srcq.SetParams( newxq.w, newxq.x, newxq.y, newxq.z );
	CQuaternion axisq;
	D3DXVECTOR3 cureul;
	ret = traq->QtoEul( srcmodel, srcq, befeul, 1, tsptr->jointno, &cureul, &axisq );
	_ASSERT( !ret );


	newqptr->SetParams( newxq.w, newxq.x, newxq.y, newxq.z );
	*newtraptr = tmptra;
	*neweulptr = cureul;

	return 0;
}
void Tank::Update(Input* input, float time, QuadTree *m_QuadTree){
	int deltaX, deltaY;
	input->GetMouseDelta(deltaX, deltaY);
	
	m_tankState->SetTime(time);
	
	m_tankState->ApplyForce(D3DXVECTOR3(0.0f, 0.0f, forward));
	forward = 0;

	m_tankState->SetYaw(turn * time);
	yaw -= turn * time;	
	turn    = 0;

	
	D3DXVECTOR3 position = *getTankState()->GetPosition(), vgarbage, normal5;
	float height;	

	m_QuadTree->GetHeightAtPosition(position.x, position.z, height, normal5);
	float netforce = -0.00098f;
	float y = m_tankState->GetPosition()->y;
	if (y-(height+17) < 0) {
		netforce -= (y-(height+17)) * 0.000065f;
	}

	m_tankState->ApplyForce(D3DXVECTOR3(0,netforce,0));

	//m_turretState->SetPitch(deltaY*0.01f);*/

	//m_turretState->SetYaw(rotation);

	D3DXQUATERNION quat = *m_tankState->GetRotation();
	D3DXQUATERNION inverse;
	D3DXQuaternionInverse(&inverse, &quat);
	D3DXQUATERNION temp;
	D3DXVECTOR3 output;
	
	float garbage;

	temp = quat * D3DXQUATERNION(FRONTRIGHT.x, FRONTRIGHT.y, FRONTRIGHT.z, 0.0f) * inverse;
	D3DXQuaternionToAxisAngle(&temp, &output, &garbage);
	m_frontRight = *m_tankState->GetPosition() + output;

	temp = quat * D3DXQUATERNION(FRONTLEFT.x, FRONTLEFT.y, FRONTLEFT.z, 0.0f) * inverse;
	D3DXQuaternionToAxisAngle(&temp, &output, &garbage);
	m_frontLeft = *m_tankState->GetPosition() + output;

	temp = quat * D3DXQUATERNION(REARLEFT.x, REARLEFT.y, REARLEFT.z, 0.0f) * inverse;
	D3DXQuaternionToAxisAngle(&temp, &output, &garbage);
	m_rearLeft = *m_tankState->GetPosition() + output;

	temp = quat * D3DXQUATERNION(REARRIGHT.x, REARRIGHT.y, REARRIGHT.z, 0.0f) * inverse;
	D3DXQuaternionToAxisAngle(&temp, &output, &garbage);
	m_rearRight = *m_tankState->GetPosition() + output;

	temp = quat * D3DXQUATERNION(CENTER.x, CENTER.y, CENTER.z, 0.0f) * inverse;
	D3DXQuaternionToAxisAngle(&temp, &output, &garbage);
	m_center = *m_tankState->GetPosition() + output;

	// Get the height of the triangle that is directly underneath the given tank position.
	//result = m_QuadTree->GetHeightAtPosition(position.x, position.z, height, vgarbage);
	//if(result) {
		// If there was a triangle under the tank then position the tank just above it by one unit.
	//	getTankState()->SetPosition(D3DXVECTOR3(position.x,m_tankState->GetPosition()->y, position.z));
	//}

	int count = 5;
	//D3DXVECTOR3 normal1, normal2, normal3, normal4, normal5;
	//result = m_QuadTree->GetHeightAtPosition(m_frontRight.x, m_frontRight.z, height, normal1);
	//if(!result) {
	//	normal1 = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
	//	count--;
	//}

	//result = m_QuadTree->GetHeightAtPosition(m_frontLeft.x, m_frontLeft.z, height, normal2);
	//if(!result) {
	//	normal2 = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
	//	count--;
	//}

	//result = m_QuadTree->GetHeightAtPosition(m_rearRight.x, m_rearRight.z, height, normal3);
	//if(!result) {
	//	normal3 = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
	//	count--;
	//}

	//result = m_QuadTree->GetHeightAtPosition(m_rearLeft.x, m_rearLeft.z, height, normal4);
	//if(!result) {
	//	normal4 = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
	//	count--;
	//}

	//result = m_QuadTree->GetHeightAtPosition(m_center.x, m_center.z, height, normal5);
	//if(!result) {
	//	normal5 = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
	//	count--;
	//}
		
	D3DXVECTOR3 line3;
	if (count > 0)
		line3 = normal5;
		//line3 = (normal1+normal2+normal3+normal4+normal5)/float(count);
	else
		line3 = *m_tankState->GetUp();

	float angle = acos(D3DXVec3Dot(&line3, m_tankState->GetUp()));// assume normalized vectors /(D3DXVec3Length(&line3)*D3DXVec3Length(m_tankState->getUp())));
	angle /= 15.0f;// * time;

	//if (angle > 0.015f)
	//{
		D3DXVECTOR3 cross;
		D3DXVec3Cross(&cross, &line3, m_tankState->GetUp());

		D3DXVec3Normalize(&cross, &cross);

		D3DXQUATERNION quaternion;
		D3DXQuaternionRotationAxis(&quaternion, &cross, -angle);
		m_tankState->multiplyOrientation(&quaternion);
	//}
	m_tankState->Update();




	D3DXQUATERNION orien;

	D3DXVECTOR3 slope, forward, turretProj;
	D3DXVec3Cross(&slope, m_tankState->GetUp(), &D3DXVECTOR3(0, 1, 0));
	D3DXVec3Normalize(&slope, &slope);
	D3DXVec3Cross(&forward, m_tankState->GetUp(), &slope);
	D3DXVec3Normalize(&forward, &forward);
	D3DXVec3Cross(&turretProj, m_tankState->GetUp(), m_turretState->GetForward());
	D3DXVec3Normalize(&turretProj, &turretProj);
	D3DXVec3Cross(&turretProj, m_tankState->GetUp(), &turretProj);
	D3DXVec3Normalize(&turretProj, &turretProj);

	float projangle = acos(abs(D3DXVec3Dot(&turretProj, &forward)));
	if (D3DXVec3Dot(&turretProj, &forward) < 0) projangle = float(D3DX_PI - projangle);

	float slopeangle = acos(abs(D3DXVec3Dot(&D3DXVECTOR3(0, 1, 0), &forward)));
	slopeangle = float(D3DX_PI/2 - slopeangle);

	float pitchOffset = (1 - cos(projangle)) * slopeangle;

	D3DXQuaternionRotationYawPitchRoll(&orien, yaw, pitch - pitchOffset, 0);
	orien = orien * *m_tankState->GetRotation();
	m_turretState->SetOrientation(&orien);
	m_turretState->Update();

	m_Bullet->Update(time);
}
void Quaternion::GetAxisAngle(Vec3& axis, float& angle) const
{
	D3DXQuaternionToAxisAngle(this, &axis, &angle);
}
inline void __Quaternion::AxisAngle(__Vector3& vAxisResult, float& fRadianResult)
{
	D3DXQuaternionToAxisAngle(this, &vAxisResult, &fRadianResult);
}