void	GL_PushCSMCamera(camera_t *light, camera_t *viewer, int split)
{
	
	Cam_ConstructOpenGLMat44(light, &lightView);
	
	updateFrustumPoints(shadowFrusta[split], viewer);
	
	/*float minZ =*/ applyCropMatrix(shadowFrusta[split], lightView, split);
	
	GL_MatrixMode(GL_MODELVIEW);
	GL_PushMatrix();
	glLoadIdentity();
	glMultMatrixf(lightView.matrix);
}
Beispiel #2
0
//-----------------------------------------------------------------------------
//! 正射影行列の初期化
//-----------------------------------------------------------------------------
void CascadedShadow::initOrthoMatrix()
{
	CameraBase*	cam = GmCameraMan()->getCurrentCamera();
	Vector3		camPos = cam->getPosition();
	Matrix		camMat = cam->getMatrix();

	// 分割距離の更新
	updateSplitDist(0.01f, 3000.0f);

	for (s32 i = 0; i<SPLIT_COUNT; ++i)
	{
		// 視錐台の8点を更新
		updateFrustumPoints(f[i], camPos, camMat);

		// 視線方向を求める
		Vector3 viewDir = -Vector3(camMat._m[2]).normalize();

		// 中心までの距離を求める
		f32 centerOfClip = f[i]._fard - f[i]._neard / 2.0f;
		_centerLength[i]  = centerOfClip + f[i]._neard;
		
		// 視線方向を中点までの距離にし、カメラ座標に足す
		Vector3 center = (viewDir * _centerLength[i]) + camPos;



		// 近クリップ面から遠クリップ面までの距離を求める
		Vector3 p1 = f[i]._point[0];
		Vector3 p2 = f[i]._point[4];
		Vector3 p3 = f[i]._point[6];

		Sphere  clipShpere = calcCircumscribeCircle(p1,p2,p3);

		// 半径を求める(半径がまだ正しくない模様現段階は少し大きめにする)
		f32	 rad = clipShpere.getRadius() * 1.2f;

		_depthProj[i] = Matrix::ortho(-rad, rad, -rad, rad, -rad, rad);
	}

	TaskModelX::setShadowProj(_depthProj);
}