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); }
//----------------------------------------------------------------------------- //! 正射影行列の初期化 //----------------------------------------------------------------------------- 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); }