2016-05-12 7 views
0

У меня проблема, когда я могу видеть желаемый объект в перспективной проекции, не будучи в состоянии видеть объект в ортогональной проекции, даже когда камера находится в тех же координатах и ​​смотрит на нее координат.Вытяжка Ortho2D Проецирование не отображается

Я знаю, что объект визуализируется правильно, так как он правильно отображает в перспективе следующим образом:

Perspective projection

Самолет расположен в начале координат с высотой 10, шириной 50, и никакой глубины. Он расположен на (0, -10, 0)

Я хотел был бы иметь возможность просмотреть это в орфографической проекции. Так я поставил его, как это в моем CameraManager классе:

void CameraManager::UpdateCamera() { 

    // exit in erroneous situations 
    if (m_screenWidth == 0 && m_screenHeight == 0) 
     return; 

    switch (m_projectionType) 
    { 
    case TWO_DIMENSIONAL: 
     SetupOrthographicCamera(); 

     break; 
    case THREE_DIMENSIONAL: 
     SetupPerspectiveCamera(); 

     break; 
    default: 
     break; 
    } 

    SetupModelView(); 

} 

Тогда в моей SetupOrthographicCamera() Я делаю это:

void CameraManager::SetupOrthographicCamera() { 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    //float aspectRatio = m_screenWidth/(float)m_screenHeight; 
    gluOrtho2D(-50, 50, -100, 100); 

    /* 
    m_cameraPosition = btVector3(0, 0, -1); 

    glMatrixMode(GL_MODELVIEW); 
    gluLookAt(m_cameraPosition[0], m_cameraPosition[1], m_cameraPosition[2], m_cameraTarget[0], m_cameraTarget[1], m_cameraTarget[2], m_upVector.getX(), m_upVector.getY(), m_upVector.getZ()); 
    */ 
} 

Это моя перспектива камеры:

void CameraManager::SetupPerspectiveCamera() { 

    // select the projection matrix 
    glMatrixMode(GL_PROJECTION); 
    // set it to the matrix-equivalent of 1 
    glLoadIdentity(); 
    // determine the aspect ratio of the screen 
    float aspectRatio = m_screenWidth/(float)m_screenHeight; 
    // create a viewing frustum based on the aspect ratio and the 
    // boundaries of the camera 
    glFrustum(-aspectRatio * m_nearPlane, aspectRatio * m_nearPlane, -m_nearPlane, m_nearPlane, m_nearPlane, m_farPlane); 
    // the projection matrix is now set 
} 

И это мой SetupModelView():

void CameraManager::SetupModelView() { 

    // select the view matrix 
    glMatrixMode(GL_MODELVIEW); 
    // set it to '1' 
    glLoadIdentity(); 

    // our values represent the angles in degrees, but 3D 
    // math typically demands angular values are in radians. 
    float pitch = m_cameraPitch * RADIANS_PER_DEGREE; 
    float yaw = m_cameraYaw * RADIANS_PER_DEGREE; 

    // create a quaternion defining the angular rotation 
    // around the up vector 
    btQuaternion rotation(m_upVector, yaw); 

    // set the camera's position to 0,0,0, then move the 'z' 
    // position to the current value of m_cameraDistance. 
    btVector3 cameraPosition(0, 0, 0); 
    cameraPosition[2] = -m_cameraDistance; 

    // create a Bullet Vector3 to represent the camera 
    // position and scale it up if its value is too small. 
    btVector3 forward(cameraPosition[0], cameraPosition[1], cameraPosition[2]); 
    if (forward.length2() < SIMD_EPSILON) { 
     forward.setValue(1.f, 0.f, 0.f); 
    } 

    // figure out the 'right' vector by using the cross 
    // product on the 'forward' and 'up' vectors 
    btVector3 right = m_upVector.cross(forward); 

    // create a quaternion that represents the camera's roll 
    btQuaternion roll(right, -pitch); 

    // turn the rotation (around the Y-axis) and roll (around 
    // the forward axis) into transformation matrices and 
    // apply them to the camera position. This gives us the 
    // final position 
    cameraPosition = btMatrix3x3(rotation) * btMatrix3x3(roll) * cameraPosition; 

    // save our new position in the member variable, and 
    // shift it relative to the target position (so that we 
    // orbit it) 
    m_cameraPosition[0] = cameraPosition.getX(); 
    m_cameraPosition[1] = cameraPosition.getY(); 
    m_cameraPosition[2] = cameraPosition.getZ(); 
    m_cameraPosition += m_cameraTarget; 

    // create a view matrix based on the camera's position and where it's 
    // looking 
    //printf("Camera Position = %f, %f, %f\n", cameraPosition[0], cameraPosition[1], cameraPosition[2]); 
    // the view matrix is now set 
    gluLookAt(m_cameraPosition[0], m_cameraPosition[1], m_cameraPosition[2], m_cameraTarget[0], m_cameraTarget[1], m_cameraTarget[2], m_upVector.getX(), m_upVector.getY(), m_upVector.getZ()); 

} 

Я не уверен, что мне не хватает.

+0

Помните, что объект, скорее всего, имеет совсем другой размер в перспективе и орфографической визуализации, если вы не выбрали границы очень осторожно. Просто может быть, что объект находится вне экрана (потому что все действительно большое) или так мало, что вы не можете его увидеть (потому что все действительно мало). Я заметил, что ваша камера ***, а не ***, указывающая прямо на объект, потому что центр экрана (в рендеринге перспективы) синий, а не зеленый. – immibis

ответ

0

Если объект не отображается перпендикулярно в орто-представлении, вы можете ничего не видеть (поскольку камера находится в другой плоскости оси z). Кроме того, вы смотрите на него сзади с отбрасыванием задней поверхности? Тогда вы никогда этого не увидите. Я бы попробовал explicitly disabling this. Я могу придумать больше причин ... z-axis инвертируется в OpenGL (отрицательный в экран с типичной евклидовой точки зрения по отношению к другим осям, вы можете быть слишком близко к диапазонам отсечения и т. Д. Извините для неопределенности, просто некоторые вещи, которые вы, возможно, упустили из виду, которые могут вам помочь.)

+0

Привет, поэтому я считаю, что объект отображается перпендикулярно орто-представлению. Моя камера выглядит так, как будто она находится за объектом, так как я вычитаю расстояние и смотрю на источник. Я также отключил отбраковку так: 'glDisable (GL_CULL_FACE);' Но я все еще не вижу этого. = [ – terminix00

+0

Вы пытались инвертировать знак на оси z камеры, чтобы увидеть, вдруг ли это появляется? Я был в вашей обуви много раз, и почти всегда бывает, что я стал «дезориентированным» в своей собственной системе координат; часто один щелчок с флагом исправляет проблему. Конечно, не переворачивайте знаки наугад - вы должны это продумать. Я не могу не заметить, что ваши значения очень малы (например, 'x + 1.0f' в операторе' if'). Попробуйте рисовать большой прямоугольник и отступать на большое расстояние. – EntangledLoops

+0

Хорошо, теперь у меня есть ситуация, когда я создаю плоскость ящика на 0,0,10. Когда я увеличиваю свою камеру до положения 0,0,10, плоскость коробки занимает весь экран. Когда я делаю еще один шаг в любом направлении 0,0,5 или 0,0,15, плоскость коробки исчезает. Вы знаете, что может быть проблемой? – terminix00