예제 #1
0
//---------------------------------------------------------------------------//
  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();
  }
예제 #2
0
파일: Camera.cpp 프로젝트: Delwin9999/KoRE
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();
}
예제 #3
0
파일: Camera.cpp 프로젝트: Delwin9999/KoRE
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;
}
예제 #4
0
//---------------------------------------------------------------------------//
  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;
  }