diff options
author | r.kuznetsov <r.kuznetsov@corp.mail.ru> | 2015-12-07 18:48:47 +0300 |
---|---|---|
committer | Daria Volvenkova <d.volvenkova@corp.mail.ru> | 2015-12-29 16:36:16 +0300 |
commit | 23c2bfe2fde8eca0693fb9349eb9cb18f7e3f418 (patch) | |
tree | 1c3874ef34a2dd985824fedd3788241bcbeb96dc /geometry | |
parent | 1602dd561ad8132e1ab0f08b70d32c739453ad0b (diff) |
Fixed clipping
Diffstat (limited to 'geometry')
-rw-r--r-- | geometry/screenbase.cpp | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/geometry/screenbase.cpp b/geometry/screenbase.cpp index a6f433cd58..b6b46fb4e8 100644 --- a/geometry/screenbase.cpp +++ b/geometry/screenbase.cpp @@ -14,7 +14,7 @@ ScreenBase::ScreenBase() : m_Angle(0.0), m_Org(320, 240), m_3dFOV(0.0), - m_3dNearZ(0.0), + m_3dNearZ(0.001), m_3dFarZ(0.0), m_3dAngleX(0.0), m_3dMaxAngleX(0.0), @@ -325,9 +325,8 @@ void ScreenBase::SetRotationAngle(double rotationAngle) translateM(3, 2) = offsetZ; Matrix3dT projectionM = math::Zero<double, 4>(); - m_3dNearZ = cameraZ; m_3dFarZ = cameraZ + 2.0 * sin(m_3dAngleX) * m_3dScaleY; - projectionM(0, 0) = projectionM(1, 1) = m_3dNearZ; + projectionM(0, 0) = projectionM(1, 1) = cameraZ; projectionM(2, 2) = m_3dAngleX != 0.0 ? (m_3dFarZ + m_3dNearZ) / (m_3dFarZ - m_3dNearZ) : 0.0; projectionM(2, 3) = 1.0; @@ -384,9 +383,12 @@ m2::PointD ScreenBase::P3dtoP(m2::PointD const & pt) const double normalizedZ = 0.0; if (m_3dAngleX != 0.0) { + double const halfFOV = m_3dFOV / 2.0; + double const cameraZ = 1.0 / tan(halfFOV); + double const tanX = tan(m_3dAngleX); double const cameraDistanceZ = - m_3dNearZ * (1.0 + (normalizedY + 1.0) * tanX / (m_3dNearZ - normalizedY * tanX)); + cameraZ * (1.0 + (normalizedY + 1.0) * tanX / (cameraZ - normalizedY * tanX)); double const a = (m_3dFarZ + m_3dNearZ) / (m_3dFarZ - m_3dNearZ); double const b = -2.0 * m_3dFarZ * m_3dNearZ / (m_3dFarZ - m_3dNearZ); |