void GCamera::SetOrientation(float pitch, float yaw, float roll) { m_pitch = pitch; m_yaw = yaw; m_roll = roll; CalculateFrustum(); }
void CascadeShadow::CascadeUpdate(){ float nearClip = 0.01f; float farClip = 100.0f; float m_Lamda = 0.8f; // 平行分割処理. float splitPositions[MAX_CASCADE + 1]; ComputeSplitPositions(MAX_CASCADE, m_Lamda, nearClip, farClip, splitPositions); float SlideBack = 50.0f; auto camera = Game::GetMainCamera(); auto campos = camera->gameObject->mTransform->WorldPosition(); auto camvec = camera->gameObject->mTransform->Forward(); float forward = splitPositions[0]; // カスケード処理. for (int i = 0; i<MAX_CASCADE; ++i) { float size = splitPositions[i + 1] - splitPositions[i + 0]; auto lightPos = campos + camvec * (forward + size / 2) + mLightVect * -SlideBack; m_LightView = XMMatrixLookToLH(lightPos, mLightVect, XMVectorSet(0, 1, 0, 1)); forward += size; float aspect = float(WindowState::mWidth) / float(WindowState::mHeight); float fov = XM_PIDIV4; float farHeight = tanf(fov) * splitPositions[i + 1]; float farWidth = farHeight * aspect; size = farWidth * 1.41421356f * 1.41421356f; m_LightProj = XMMatrixOrthographicLH(size, size, 0.01f, 100.0f); // ライトのビュー射影行列. m_ShadowMatrix[i] = m_LightView * m_LightProj; XMVECTOR min, max; // 分割した視錘台の8角をもとめて,ライトのビュー射影空間でAABBを求める. CalculateFrustum( splitPositions[i + 0], splitPositions[i + 1], m_ShadowMatrix[i], &min, &max); // クロップ行列を求める. XMMATRIX crop = CreateCropMatrix(min, max); // シャドウマップ行列と分割位置を設定. m_ShadowMatrix[i] = m_ShadowMatrix[i] * crop; m_SplitPos[i] = splitPositions[i + 1]; } }
void CAMERA::Update(MOUSE &mouse, float timeDelta) { //Restrict focus movment to the xz-plane m_right.y = m_look.y = 0.0f; D3DXVec3Normalize(&m_look, &m_look); D3DXVec3Normalize(&m_right, &m_right); //Move Focus (i.e. Scroll) if(mouse.x < mouse.m_viewport.left + 10) Scroll(-m_right * timeDelta * 30.0f); if(mouse.x > mouse.m_viewport.right - 10) Scroll(m_right * timeDelta * 30.0f); if(mouse.y < mouse.m_viewport.top + 10) Scroll(m_look * timeDelta * 30.0f); if(mouse.y > mouse.m_viewport.bottom - 10) Scroll(-m_look * timeDelta * 30.0f); //Move Camera (i.e. Change Angle) if(KEYDOWN(VK_LEFT))Yaw(-timeDelta); if(KEYDOWN(VK_RIGHT))Yaw(timeDelta); if(KEYDOWN(VK_UP))Pitch(timeDelta); if(KEYDOWN(VK_DOWN))Pitch(-timeDelta); //Zoom (i.e. change fov) if(KEYDOWN(VK_ADD))Zoom(-timeDelta); if(KEYDOWN(VK_SUBTRACT))Zoom(timeDelta); //Change m_radius if(mouse.WheelUp()) ChangeRadius(-1.0f); if(mouse.WheelDown())ChangeRadius(1.0f); //Calculate Eye Position float sideRadius = m_radius * cos(m_beta); float height = m_radius * sin(m_beta); m_eye = D3DXVECTOR3(m_focus.x + sideRadius * cos(m_alpha), m_focus.y + height, m_focus.z + sideRadius * sin(m_alpha)); if(m_pDevice != NULL) { D3DXMATRIX view = GetViewMatrix(); D3DXMATRIX projection = GetProjectionMatrix(); m_pDevice->SetTransform(D3DTS_VIEW, &view); m_pDevice->SetTransform(D3DTS_PROJECTION, &projection); CalculateFrustum(view, projection); } }
// finds scene objects inside the camera frustum std::vector<SceneObject *> ShadowCamera::FindReceivers(void) { Frustum cameraFrustum = CalculateFrustum(m_fNearMin, m_fFarMax); cameraFrustum.CalculateAABB(); std::vector<SceneObject *> receivers; receivers.reserve(g_SceneObjects.size()); for(unsigned int i=0; i<g_SceneObjects.size(); i++) { SceneObject *pObject = g_SceneObjects[i]; // intersection test if(g_iVisibilityTest == VISTEST_ACCURATE) { // test accurately if(!IntersectionTest(pObject->m_AABB, cameraFrustum)) continue; } else if(g_iVisibilityTest == VISTEST_CHEAP) { // test only with AABB of frustum if(!IntersectionTest(pObject->m_AABB, cameraFrustum.m_AABB)) continue; } receivers.push_back(pObject); } return receivers; }
void GCamera::SetFieldOfView(float fov) { m_hfov = fov; m_vfov = m_hfov / m_aspect_ratio; CalculateFrustum(); }
GCamera::GCamera(unsigned int img_width, unsigned int img_height, float fov) : m_hfov(fov), m_pitch(0), m_yaw(0), m_roll(0) { SetImageDimensions(img_width, img_height); CalculateFrustum(); m_position = Vector3f::Zero(); }