过剩 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 提供的范围等。抱歉含糊不清,只是您可能忽略了一些可能对您有帮助的事情。)
我有一个问题,即我能够在透视投影中看到所需的对象,而在正交投影中看不到对象,即使相机位于相同的坐标并查看相同的坐标。
我知道该对象已正确呈现,因为它在透视图中正确显示如下:
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 提供的范围等。抱歉含糊不清,只是您可能忽略了一些可能对您有帮助的事情。)