//=========================================================================== bool cCamera::select(const int a_windowPosX, const int a_windowPosY, const int a_windowWidth, const int a_windowHeight, cCollisionRecorder& a_collisionRecorder, cCollisionSettings& a_collisionSettings) { // clear collision recorder a_collisionRecorder.clear(); // update my m_globalPos and m_globalRot variables m_parentWorld->computeGlobalPositions(false); // make sure we have a legitimate field of view if (fabs(m_fieldViewAngle) < 0.001f) { return (false); } // compute the ray that leaves the eye point at the appropriate angle // // m_fieldViewAngle / 2.0 would correspond to the _top_ of the window double distCam = (a_windowHeight / 2.0f) / cTanDeg(m_fieldViewAngle / 2.0f); cVector3d selectRay; selectRay.set(-distCam, (a_windowPosX - (a_windowWidth / 2.0f)), ((a_windowHeight / 2.0f) - a_windowPosY)); selectRay.normalize(); selectRay = cMul(m_globalRot, selectRay); // create a point that's way out along that ray cVector3d selectPoint = cAdd(m_globalPos, cMul(100000, selectRay)); // search for intersection between the ray and objects in the world bool result = m_parentWorld->computeCollisionDetection( m_globalPos, selectPoint, a_collisionRecorder, a_collisionSettings); // return result return result; }
//=========================================================================== bool cCamera::select(const int a_windowPosX, const int a_windowPosY, const int a_windowWidth, const int a_windowHeight, cCollisionRecorder& a_collisionRecorder, cCollisionSettings& a_collisionSettings) { // sanity check if ((a_windowWidth <= 0) || (a_windowHeight <= 0)) return (false); // clear collision recorder a_collisionRecorder.clear(); // update my m_globalPos and m_globalRot variables m_parentWorld->computeGlobalPositions(false); // init variable to store result bool result = false; if (m_perspectiveMode) { // make sure we have a legitimate field of view if (fabs(m_fieldViewAngle) < 0.001f) { return (false); } // compute the ray that leaves the eye point at the appropriate angle // // m_fieldViewAngle / 2.0 would correspond to the _top_ of the window double distCam = (a_windowHeight / 2.0f) / cTanDeg(m_fieldViewAngle / 2.0f); cVector3d selectRay; selectRay.set(-distCam, (a_windowPosX - (a_windowWidth / 2.0f)), ((a_windowHeight / 2.0f) - a_windowPosY)); selectRay.normalize(); selectRay = cMul(m_globalRot, selectRay); // create a point that's way out along that ray cVector3d selectPoint = cAdd(m_globalPos, cMul(100000, selectRay)); // search for intersection between the ray and objects in the world result = m_parentWorld->computeCollisionDetection( m_globalPos, selectPoint, a_collisionRecorder, a_collisionSettings); } else { double hw = (double)(a_windowWidth) * 0.5; double hh = (double)(a_windowHeight)* 0.5; double aspect = hw / hh; double offsetX = ((a_windowPosX - hw) / hw) * 0.5 * m_orthographicWidth; double offsetY =-((a_windowPosY - hh) / hh) * 0.5 * (m_orthographicWidth / aspect); cVector3d pos = cAdd(m_globalPos, cMul(offsetX, m_globalRot.getCol1()), cMul(offsetY, m_globalRot.getCol2())); // create a point that's way out along that ray cVector3d selectPoint = cAdd(pos, cMul(100000, cNegate(m_globalRot.getCol0()))); result = m_parentWorld->computeCollisionDetection(pos, selectPoint, a_collisionRecorder, a_collisionSettings); } // return result return (result); }