add aspect ratio in glFrustum/ray picking
This commit is contained in:
@@ -180,7 +180,17 @@ void DemoApplication::updateCamera() {
|
|||||||
m_cameraPosition[1] = eyePos.getY();
|
m_cameraPosition[1] = eyePos.getY();
|
||||||
m_cameraPosition[2] = eyePos.getZ();
|
m_cameraPosition[2] = eyePos.getZ();
|
||||||
|
|
||||||
glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 10000.0);
|
if (m_glutScreenWidth > m_glutScreenHeight)
|
||||||
|
{
|
||||||
|
btScalar aspect = m_glutScreenWidth / (btScalar)m_glutScreenHeight;
|
||||||
|
glFrustum (-aspect, aspect, -1.0, 1.0, 1.0, 10000.0);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
btScalar aspect = m_glutScreenHeight / (btScalar)m_glutScreenWidth;
|
||||||
|
glFrustum (-1.0, 1.0, -aspect, aspect, 1.0, 10000.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
glMatrixMode(GL_MODELVIEW);
|
glMatrixMode(GL_MODELVIEW);
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
gluLookAt(m_cameraPosition[0], m_cameraPosition[1], m_cameraPosition[2],
|
gluLookAt(m_cameraPosition[0], m_cameraPosition[1], m_cameraPosition[2],
|
||||||
@@ -545,7 +555,7 @@ btVector3 DemoApplication::getRayTo(int x,int y)
|
|||||||
btVector3 rayFrom = getCameraPosition();
|
btVector3 rayFrom = getCameraPosition();
|
||||||
btVector3 rayForward = (getCameraTargetPosition()-getCameraPosition());
|
btVector3 rayForward = (getCameraTargetPosition()-getCameraPosition());
|
||||||
rayForward.normalize();
|
rayForward.normalize();
|
||||||
float farPlane = 600.f;
|
float farPlane = 10000.f;
|
||||||
rayForward*= farPlane;
|
rayForward*= farPlane;
|
||||||
|
|
||||||
btVector3 rightOffset;
|
btVector3 rightOffset;
|
||||||
@@ -558,11 +568,25 @@ btVector3 DemoApplication::getRayTo(int x,int y)
|
|||||||
vertical.normalize();
|
vertical.normalize();
|
||||||
|
|
||||||
float tanfov = tanf(0.5f*fov);
|
float tanfov = tanf(0.5f*fov);
|
||||||
|
|
||||||
|
btScalar aspect = m_glutScreenHeight / (btScalar)m_glutScreenWidth;
|
||||||
|
|
||||||
hor *= 2.f * farPlane * tanfov;
|
hor *= 2.f * farPlane * tanfov;
|
||||||
vertical *= 2.f * farPlane * tanfov;
|
vertical *= 2.f * farPlane * tanfov;
|
||||||
|
|
||||||
|
if (aspect<1)
|
||||||
|
{
|
||||||
|
hor/=aspect;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
vertical*=aspect;
|
||||||
|
}
|
||||||
|
|
||||||
btVector3 rayToCenter = rayFrom + rayForward;
|
btVector3 rayToCenter = rayFrom + rayForward;
|
||||||
btVector3 dHor = hor * 1.f/float(m_glutScreenWidth);
|
btVector3 dHor = hor * 1.f/float(m_glutScreenWidth);
|
||||||
btVector3 dVert = vertical * 1.f/float(m_glutScreenHeight);
|
btVector3 dVert = vertical * 1.f/float(m_glutScreenHeight);
|
||||||
|
|
||||||
|
|
||||||
btVector3 rayTo = rayToCenter - 0.5f * hor + 0.5f * vertical;
|
btVector3 rayTo = rayToCenter - 0.5f * hor + 0.5f * vertical;
|
||||||
rayTo += x * dHor;
|
rayTo += x * dHor;
|
||||||
rayTo -= y * dVert;
|
rayTo -= y * dVert;
|
||||||
|
|||||||
Reference in New Issue
Block a user