//----------------------------------------------------------------------------- // Name: Bound::operator* // Desc: transforms the bound by the current matrix //----------------------------------------------------------------------------- Bound Bound::operator*( CXMMATRIX World ) const { //$OPTIMIZE: store matrix decomposed XMVECTOR Translation = World.r[3]; FLOAT Scale = XMVectorGetX( XMVector3Length( World.r[2] ) ); XMVECTOR Rotation = XMQuaternionNormalize( XMQuaternionRotationMatrix( World ) ); // switch based off this bounds type and call the correct // bound transform function switch( m_Type ) { case Bound::Sphere_Bound: { Sphere WorldSphere = GetSphere(); TransformSphere( &WorldSphere, &WorldSphere, Scale, Rotation, Translation ); return Bound( WorldSphere ); } case Bound::Frustum_Bound: { Frustum WorldFrustum = GetFrustum(); TransformFrustum( &WorldFrustum, &WorldFrustum, Scale, Rotation, Translation ); return Bound( WorldFrustum ); } case Bound::OBB_Bound: { OrientedBox WorldObb = GetObb(); TransformOrientedBox( &WorldObb, &WorldObb, Scale, Rotation, Translation ); return Bound( WorldObb ); } case Bound::AABB_Bound: { AxisAlignedBox WorldAabb = GetAabb(); TransformAxisAlignedBox( &WorldAabb, &WorldAabb, Scale, Rotation, Translation ); return Bound( WorldAabb ); } case Bound::No_Bound: return Bound(); } return Bound(); }
void IObject::Scale(float scaleX, float scaleY, float scaleZ) { XMVECTOR quat = XMQuaternionRotationMatrix(XMLoadFloat4x4(&m_mWorld)); XMFLOAT3 pos = *GetPosition(); XMMATRIX newScale = XMMatrixIdentity(); XMMATRIX newMat = XMMatrixIdentity(); newScale = XMMatrixScaling(scaleX, scaleY, scaleZ); newMat = newScale * XMMatrixRotationQuaternion(quat); XMStoreFloat4x4(&m_mWorld, newMat); m_mWorld._41 = pos.x; m_mWorld._42 = pos.y; m_mWorld._43 = pos.z; if (m_cpRenderMesh) m_cpRenderMesh->GetPositionMatrix() = m_mWorld; }
XMVECTOR LimitAngle(const XMVECTOR& quat, const XMVECTOR& rotmin, const XMVECTOR& rotmax) { XMVECTOR rot_xyz = GetAngle(quat); /* XMMATRIX mtx = XMMatrixRotationQuaternion(quat); //ZYX Y=-90〜90°Y軸=ねじり方向 float rx = -atan2f(XMVectorGetY(mtx.r[2]),XMVectorGetZ(mtx.r[2])); float ry = asinf(XMVectorGetX(mtx.r[2])); float rz = -atan2f(XMVectorGetX(mtx.r[1]),XMVectorGetX(mtx.r[0])); XMVECTOR rot_xyz = {rx,ry,rz,0}; *rotang_before = rot_xyz; */ rot_xyz = XMVectorMax(rot_xyz, rotmin); rot_xyz = XMVectorMin(rot_xyz, rotmax); XMMATRIX mtx = XMMatrixRotationZ(XMVectorGetZ(rot_xyz)); mtx = XMMatrixMultiply(mtx, XMMatrixRotationY(XMVectorGetY(rot_xyz))); mtx = XMMatrixMultiply(mtx, XMMatrixRotationX(XMVectorGetX(rot_xyz))); return XMQuaternionRotationMatrix(mtx); }
void Game::Update() { m_pCube->Update(); XMVECTOR cameraPos = XMLoadFloat3(&m_pCamera->GetCameraPos()); /*cameraPos += XMVectorSet(0.0001f,0.0f,0.0f,0.0f); XMFLOAT3 newCameraPos; XMStoreFloat3(&newCameraPos,cameraPos);*/ //cameraPos * XMMatrixRotationY(XM_PIDIV2/9.0f); //Camera Rotation code /*XMFLOAT3 newCameraPos; cameraPos = XMVector3Rotate(cameraPos,XMQuaternionRotationMatrix(XMMatrixRotationY(-(XM_PIDIV2/9000.0f)))); XMStoreFloat3(&newCameraPos,cameraPos); m_pCamera->SetCameraPos(newCameraPos); m_pCamera->UpdateViewMatrix();*/ //keyboard input test code //bool pressed = ENGINE->GetInputManager()->IsKeyDown(VK_UP); //cout << pressed; XMFLOAT3 newCameraPos; if(ENGINE->GetInputManager()->IsKeyDown(VK_UP)) { cameraPos = XMVector3Rotate(cameraPos,XMQuaternionRotationMatrix(XMMatrixRotationX((XM_PIDIV2/9000.0f)))); } if(ENGINE->GetInputManager()->IsKeyDown(VK_DOWN)) { cameraPos = XMVector3Rotate(cameraPos,XMQuaternionRotationMatrix(XMMatrixRotationX(-(XM_PIDIV2/9000.0f)))); } if(ENGINE->GetInputManager()->IsKeyDown(VK_LEFT)) { cameraPos = XMVector3Rotate(cameraPos,XMQuaternionRotationMatrix(XMMatrixRotationY((XM_PIDIV2/9000.0f)))); } //if(ENGINE->GetInputManager()->IsKeyDown(VK_RIGHT)) if(ENGINE->GetInputManager()->IsCommandDown(L"RIGHT")) { cameraPos = XMVector3Rotate(cameraPos,XMQuaternionRotationMatrix(XMMatrixRotationY(-(XM_PIDIV2/9000.0f)))); } if(ENGINE->GetInputManager()->IsKeyDown(0x57))//W { cameraPos = XMVector3Transform(cameraPos,XMMatrixTranslation(0,0,0.01f)); } if(ENGINE->GetInputManager()->IsKeyDown(0x53))//S { cameraPos = XMVector3Transform(cameraPos,XMMatrixTranslation(0,0,-0.01f)); } if(ENGINE->GetInputManager()->IsKeyDown(0x41))//A { cameraPos = XMVector3Transform(cameraPos,XMMatrixTranslation(-0.01f,0,0)); } if(ENGINE->GetInputManager()->IsKeyDown(0x44))//D { cameraPos = XMVector3Transform(cameraPos,XMMatrixTranslation(0.01f,0,0)); } if(ENGINE->GetInputManager()->IsKeyDown(0x51))//Q { cameraPos = XMVector3Transform(cameraPos,XMMatrixTranslation(0,-0.01f,0)); } if(ENGINE->GetInputManager()->IsKeyDown(0x45))//E { cameraPos = XMVector3Transform(cameraPos,XMMatrixTranslation(0,0.01f,0)); } XMStoreFloat3(&newCameraPos,cameraPos); m_pCamera->SetCameraPos(newCameraPos); m_pCamera->UpdateViewMatrix(); }
Quaternion::Quaternion(const Float3x3& m) { *this = XMQuaternionRotationMatrix(m.ToSIMD()); }