//---------------------------------------------------------------------------// void CameraComponent::setProjectionPersp( float yFov_deg, float fWidth, float fHeight, float fNear, float fFar ) { m_matProjection = MathUtil::perspectiveFov( yFov_deg, fWidth, fHeight, fNear, fFar ); m_fNear = fNear; m_fFar = fFar; m_fFovDeg = yFov_deg; m_bIsOrtho = false; m_fWidth = fWidth; m_fHeight = fHeight; //Calculate focal length float fFovHor2 = glm::atan( getAspectRatio() * glm::tan( getFovRad() / 2.0f ) ); m_fFocalLength = 1.0f / glm::tan( fFovHor2 ); onProjectionChanged(); }
void kore::Camera::setProjectionPersp(float yFov_deg, float fWidth, float fHeight, float fNear, float fFar) { _matProjection = glm::perspectiveFov(yFov_deg, fWidth, fHeight, fNear, fFar); _fNear = fNear; _fFar = fFar; _fFovDeg = yFov_deg; _bIsOrtho = false; _fWidth = fWidth; _fHeight = fHeight; // Calculate focal length float fFovHor2 = glm::atan( getAspectRatio() * glm::tan(getFovRad() / 2.0f)); _fFocalLength = 1.0f / glm::tan(fFovHor2); paramsChanged(); }
std::vector<glm::vec3> kore::Camera::getWSfrustumCorners() { glm::mat4 matViewInv = getViewInv(); // calculate frustum corner coordinates float fFov2 = getFovRad() / 2.0f; float tanFov2 = glm::tan(fFov2); float h2Far = tanFov2 * _fFar; float h2Near = tanFov2 * _fNear; float hFar = 2.0f * h2Far; float hNear = 2.0f * h2Near; const glm::ivec2& res = kore::RenderManager::getInstance()->getRenderResolution(); float aspect = static_cast<float>(res.x) / static_cast<float>(res.y); float w2Far = (hFar * aspect) / 2.0f; float w2Near = (hNear * aspect) / 2.0f; glm::vec3 v3Corners[8]; v3Corners[0] = glm::vec3(-1.0f * w2Near, -1.0f * h2Near, -_fNear); // lbn v3Corners[1] = glm::vec3(1.0f * w2Near, -1.0f * h2Near, -_fNear); // rbn v3Corners[2] = glm::vec3(1.0f * w2Near, 1.0f * h2Near, -_fNear); // rtn v3Corners[3] = glm::vec3(-1.0f * w2Near, 1.0f * h2Near, -_fNear); // ltn v3Corners[4] = glm::vec3(-1.0f * w2Far, -1.0f * h2Far, -_fFar); // lbn v3Corners[5] = glm::vec3(1.0f * w2Far, -1.0f * h2Far, -_fFar); // rbn v3Corners[6] = glm::vec3(1.0f * w2Far, 1.0f * h2Far, -_fFar); // rtn v3Corners[7] = glm::vec3(-1.0f * w2Far, 1.0f * h2Far, -_fFar); // ltn std::vector<glm::vec3> vReturnCorners; // transform each corner into WS for (int i = 0; i < 8; ++i) { glm::vec4 v4Result = matViewInv * glm::vec4(v3Corners[ i ], 1.0f); vReturnCorners.push_back(glm::vec3(v4Result.x, v4Result.y, v4Result.z)); } return vReturnCorners; }
//---------------------------------------------------------------------------// FixedArray<glm::vec3, 8u> CameraComponent::getWSfrustumCorners(float aViewportAspectRatio) { //calculate frustum corner coordinates float fFov2 = getFovRad() * 0.5f; float tanFov2 = glm::tan( fFov2 ); float h2Far = tanFov2 * m_fFar; float h2Near = tanFov2 * m_fNear; float hFar = 2.0f * h2Far; float hNear = 2.0f * h2Near; Rendering::RenderOutput* renderer = Fancy::GetCurrentRenderOutput(); float aspect = aViewportAspectRatio; float w2Far = ( hFar * aspect ) / 2.0f; float w2Near = ( hNear * aspect ) / 2.0f; glm::vec3 v3Corners[ 8 ]; v3Corners[ 0 ] = glm::vec3( -1.0f * w2Near, -1.0f * h2Near, -m_fNear ); //l,b,n v3Corners[ 1 ] = glm::vec3( 1.0f * w2Near, -1.0f * h2Near, -m_fNear ); //r,b,n v3Corners[ 2 ] = glm::vec3( 1.0f * w2Near, 1.0f * h2Near, -m_fNear ); //r,t,n v3Corners[ 3 ] = glm::vec3( -1.0f * w2Near, 1.0f * h2Near, -m_fNear ); //l,t,n v3Corners[ 4 ] = glm::vec3( -1.0f * w2Far, -1.0f * h2Far, -m_fFar ); //l,b,n v3Corners[ 5 ] = glm::vec3( 1.0f * w2Far, -1.0f * h2Far, -m_fFar ); //r,b,n v3Corners[ 6 ] = glm::vec3( 1.0f * w2Far, 1.0f * h2Far, -m_fFar ); //r,t,n v3Corners[ 7 ] = glm::vec3( -1.0f * w2Far, 1.0f * h2Far, -m_fFar ); //l,t,n FixedArray<glm::vec3, 8u> vReturnCorners; vReturnCorners.resize(8); //transform each corner into WS for( int i = 0; i < 8; ++i ) { vReturnCorners[i] = glm::vec3( m_matViewInv * glm::vec4( v3Corners[ i ], 1.0f ) ); } return vReturnCorners; }