btVector3 getRayTo(int x,int y) { if (!m_glApp->m_instancingRenderer) { btAssert(0); return btVector3(0,0,0); } float top = 1.f; float bottom = -1.f; float nearPlane = 1.f; float tanFov = (top-bottom)*0.5f / nearPlane; float fov = b3Scalar(2.0) * b3Atan(tanFov); btVector3 camPos,camTarget; m_glApp->m_instancingRenderer->getCameraPosition(camPos); m_glApp->m_instancingRenderer->getCameraTargetPosition(camTarget); btVector3 rayFrom = camPos; btVector3 rayForward = (camTarget-camPos); rayForward.normalize(); float farPlane = 10000.f; rayForward*= farPlane; btVector3 rightOffset; btVector3 m_cameraUp=btVector3(0,1,0); btVector3 vertical = m_cameraUp; btVector3 hor; hor = rayForward.cross(vertical); hor.normalize(); vertical = hor.cross(rayForward); vertical.normalize(); float tanfov = tanf(0.5f*fov); hor *= 2.f * farPlane * tanfov; vertical *= 2.f * farPlane * tanfov; b3Scalar aspect; float width = m_glApp->m_instancingRenderer->getScreenWidth(); float height = m_glApp->m_instancingRenderer->getScreenHeight(); aspect = width / height; hor*=aspect; btVector3 rayToCenter = rayFrom + rayForward; btVector3 dHor = hor * 1.f/width; btVector3 dVert = vertical * 1.f/height; btVector3 rayTo = rayToCenter - 0.5f * hor + 0.5f * vertical; rayTo += btScalar(x) * dHor; rayTo -= btScalar(y) * dVert; return rayTo; }
void GLInstancingRenderer::getMouseDirection(float* dir, int x, int y) { float top = 1.f; float bottom = -1.f; float nearPlane = 1.f; float tanFov = (top-bottom)*0.5f / nearPlane; float fov = b3Scalar(2.0) * b3Atan(tanFov); b3Vector3 rayFrom = m_data->m_cameraPosition; b3Vector3 rayForward = (m_data->m_cameraTargetPosition-m_data->m_cameraPosition); rayForward.normalize(); float farPlane = 10000.f; rayForward*= farPlane; b3Vector3 rightOffset; b3Vector3 vertical = m_data->m_cameraUp; b3Vector3 hor; hor = rayForward.cross(vertical); hor.normalize(); vertical = hor.cross(rayForward); vertical.normalize(); float tanfov = tanf(0.5f*fov); hor *= 2.f * farPlane * tanfov; vertical *= 2.f * farPlane * tanfov; b3Scalar aspect; aspect = m_screenWidth / (b3Scalar)m_screenHeight; hor*=aspect; b3Vector3 rayToCenter = rayFrom + rayForward; b3Vector3 dHor = hor * 1.f/float(m_screenWidth); b3Vector3 dVert = vertical * 1.f/float(m_screenHeight); b3Vector3 rayTo = rayToCenter - 0.5f * hor + 0.5f * vertical; rayTo += b3Scalar(x) * dHor; rayTo -= b3Scalar(y) * dVert; dir[0] = rayTo[0]; dir[1] = rayTo[1]; dir[2] = rayTo[2]; }