过剩 Ortho2D 投影不显示

Glut Ortho2D Projection not showing

我有一个问题,即我能够在透视投影中看到所需的对象,而在正交投影中看不到对象,即使相机位于相同的坐标并查看相同的坐标。

我知道该对象已正确呈现,因为它在透视图中正确显示如下:


Plane位于原点,高度为10,宽度为50,没有深度。它位于 (0, -10, 0)

我希望能够在正投影中查看它。 我在我的 CameraManager class:

中设置它的方式是这样的
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());

}

我不确定我错过了什么。

如果对象在正交视图中未垂直呈现,您可能什么也看不到(因为相机位于不同的 z 轴平面)。另外,你是从后面看它的背面剔除吗?那么你将永远看不到它。我会尝试 explicitly disabling this。我能想到更多的原因...z 轴在 OpenGL 中倒置(从典型的欧几里德视角 w/respect 到其他轴,负值是 屏幕,你可能也是关闭 w/clipping 提供的范围等。抱歉含糊不清,只是您可能忽略了一些可能对您有帮助的事情。)