void animateScene(int value) { glutTimerFunc(REFRESH_MILISECS, animateScene, 0); static float scale = 1.0f; VECTOR4D Speed = { 0.02f, 0.02f, 0.02f, 0.0f }; //MATRIX4D P = PerspectiveWidthHeightRH(0.5f, 0.5f, 1.0f, 10.0f); MATRIX4D InvV = FastInverse(Vi); VECTOR4D XDir = { InvV.m00, InvV.m10, InvV.m20, 0.0f }; VECTOR4D YDir = { InvV.m01, InvV.m11, InvV.m21, 0.0f }; VECTOR4D ZDir = { InvV.m02, InvV.m12, InvV.m22, 0.0f }; VECTOR4D EyePos = { InvV.m03, InvV.m13, InvV.m23, 1.0f }; P = PerspectiveWidthHeightRH(0.5f, 0.5f, 1.0f, 10.0f); if (bLeft) EyePos = EyePos + XDir * Speed; if (bRight) EyePos = EyePos - XDir * Speed; if (bDown) EyePos = EyePos + YDir * Speed; if (bUp) EyePos = EyePos - YDir * Speed; if (bBackward) EyePos = EyePos + ZDir * Speed; if (bForward) EyePos = EyePos - ZDir * Speed; InvV.m03 = EyePos.x; InvV.m13 = EyePos.y; InvV.m23 = EyePos.z; Vi = FastInverse(InvV); if (bRotateX) { //R = R * RotationX(INCREMENT); VECTOR4D Axis = {1, 0, 0, 0}; R = R * RotationAxis(INCREMENT, Axis); } if (bRotateY) { //R = R * RotationY(INCREMENT); VECTOR4D Axis = { 0, 1, 0, 0 }; R = R * RotationAxis(INCREMENT, Axis); } if (bRotateZ) { //R = R * RotationZ(INCREMENT); VECTOR4D Axis = { 0, 0, 1, 0 }; R = R * RotationAxis(INCREMENT, Axis); } if (bScaleUp) scale += INCREMENT; if (bScaleDown) scale -= INCREMENT; T = (P * Vi) * R * Scaling(scale, scale, scale); glutPostRedisplay(); }
void Quad::rotate(float r, int x, int y ,int z) { glm::vec3 RotationAxis(x,y,z); Rotate = glm::rotate(r,RotationAxis); }
void AtmosphereSample::Update(double CurrTime, double ElapsedTime) { SampleBase::Update(CurrTime, ElapsedTime); m_fElapsedTime = static_cast<float>(ElapsedTime); const auto& SCDesc = m_pSwapChain->GetDesc(); // Set world/view/proj matrices and global shader constants float aspectRatio = (float)SCDesc.Width / SCDesc.Height; float3 CamZ = normalize( m_f3CameraDir ); float3 CamX = normalize( cross( float3( 0, 1, 0 ), CamZ ) ); float3 CamY = normalize( cross( CamZ, CamX ) ); m_mCameraView = translationMatrix( -m_f3CameraPos ) * ViewMatrixFromBasis( CamX, CamY, CamZ ); // This projection matrix is only used to set up directions in view frustum // Actual near and far planes are ignored float FOV = (float)M_PI/4.f; float4x4 mTmpProj = Projection(FOV, aspectRatio, 50.f, 500000.f, m_bIsDXDevice); float fEarthRadius = AirScatteringAttribs().fEarthRadius; float3 EarthCenter(0, -fEarthRadius, 0); float fNearPlaneZ, fFarPlaneZ; ComputeApproximateNearFarPlaneDist(m_f3CameraPos, m_mCameraView, mTmpProj, EarthCenter, fEarthRadius, fEarthRadius + m_fMinElevation, fEarthRadius + m_fMaxElevation, fNearPlaneZ, fFarPlaneZ); fNearPlaneZ = std::max(fNearPlaneZ, 50.f); fFarPlaneZ = std::max(fFarPlaneZ, fNearPlaneZ+100.f); fFarPlaneZ = std::max(fFarPlaneZ, 1000.f); m_mCameraProj = Projection(FOV, aspectRatio, fNearPlaneZ, fFarPlaneZ, m_bIsDXDevice); #if 0 if( m_bAnimateSun ) { auto &LightOrientationMatrix = *m_pDirLightOrienationCamera->GetParentMatrix(); float3 RotationAxis( 0.5f, 0.3f, 0.0f ); float3 LightDir = m_pDirLightOrienationCamera->GetLook() * -1; float fRotationScaler = ( LightDir.y > +0.2f ) ? 50.f : 1.f; float4x4 RotationMatrix = float4x4RotationAxis(RotationAxis, 0.02f * (float)deltaSeconds * fRotationScaler); LightOrientationMatrix = LightOrientationMatrix * RotationMatrix; m_pDirLightOrienationCamera->SetParentMatrix(LightOrientationMatrix); } float dt = (float)ElapsedTime; if (m_Animate && dt > 0 && dt < 0.2f) { float3 axis; float angle = 0; AxisAngleFromRotation(axis, angle, m_SpongeRotation); if (length(axis) < 1.0e-6f) axis[1] = 1; angle += m_AnimationSpeed * dt; if (angle >= 2.0f*FLOAT_PI) angle -= 2.0f*FLOAT_PI; else if (angle <= 0) angle += 2.0f*FLOAT_PI; m_SpongeRotation = RotationFromAxisAngle(axis, angle); } #endif UpdateGUI(); }