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(); }
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); }