Пример #1
0
	void GCamera::SetOrientation(float pitch, float yaw, float roll)
	{
		m_pitch = pitch;
		m_yaw = yaw;
		m_roll = roll;
		CalculateFrustum();
	}
Пример #2
0
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];
	}
}
Пример #3
0
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);
	}	
}
Пример #4
0
// 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;
}
Пример #5
0
	void GCamera::SetFieldOfView(float fov)
	{
		m_hfov = fov;
		m_vfov = m_hfov / m_aspect_ratio;
		CalculateFrustum();
	}
Пример #6
0
	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();
	}