void CAddCameraController::onLMouseUp(int x, int y) { IView *pView = getIView(); ICameraSceneNode *cam = pView->getSceneMgr()->getActiveCamera(); // get position core::vector3df hit; bool b = getPickPosition( &hit ); if ( b ) { core::vector3df camPos = cam->getAbsolutePosition(); core::line3df camRay( camPos, hit ); if ( camRay.getLength() < 5000 ) { CGameCamera *pObj = pView->getCurrentZone()->createCamera(); pObj->setPosition( hit ); pObj->setVisible( true ); // add history CHistoryManager::getInstance()->beginHistory(); CHistoryManager::getInstance()->addHistoryCreateObj( pObj ); CHistoryManager::getInstance()->endHistory(); } else pView->alertError( L"Can not create object because is too far" ); } else pView->alertError( L"Can not create object because is too far" ); }
bool CBaseAddController::getPickPosition( core::vector3df *pos ) { IView *pView = getIView(); // move object core::line3df ray = pView->getSelectRay(); // check hit on terrain CDocument *pDoc = (CDocument*) pView->getDocument(); ArrayZone* zones = pDoc->getAllZone(); ArrayZoneIter i = zones->begin(), end = zones->end(); while ( i != end ) { core::vector3df colPoint; core::triangle3df colTri; float maxDistance = ray.getLengthSQ(); if ( (*i)->getTerrainCollision( ray, maxDistance, colPoint, colTri ) == true ) { *pos = colPoint; return true; } i++; } core::plane3df plane( core::vector3df(0.0f, 0.0f, 0.0f), core::vector3df(0.0f, 1.0f, 0.0f) ); // get position core::vector3df hit; bool b = plane.getIntersectionWithLine( ray.start, ray.getVector(), hit ); if ( b ) { ICameraSceneNode *cam = pView->getSceneMgr()->getActiveCamera(); core::vector3df camPos = cam->getAbsolutePosition(); core::line3df camRay( camPos, hit ); if ( camRay.getLength() < 5000 ) { *pos = hit; return true; } } return false; }
void CAddWaypointController::onLMouseUp (int x, int y) { IView *pView = getIView(); ICameraSceneNode *cam = pView->getSceneMgr()->getActiveCamera(); // get position core::vector3df hit; bool b = getPickPosition( &hit ); if ( b ) { core::vector3df camPos = cam->getAbsolutePosition(); core::line3df camRay( camPos, hit ); if ( camRay.getLength() < 5000 ) { CWayPoint *pObj = pView->getCurrentZone()->createWaypoint(); pObj->setPosition( hit ); pObj->setVisible( true ); // add history CHistoryManager* pHistory = CHistoryManager::createGetInstance(); pHistory->beginHistory(); pHistory->addHistoryCreateObj( pObj ); if ( m_connect ) { pHistory->addHistoryBeginModifyObj( m_connect ); m_connect->setNext( pObj ); pHistory->addHistoryEndModifyObj( m_connect ); pHistory->addHistoryBeginModifyObj( pObj ); pObj->setBack( m_connect ); pHistory->addHistoryEndModifyObj( pObj ); } pHistory->endHistory(); m_connect = pObj; } else pView->alertError( L"Can not create object because is too far" ); } else pView->alertError( L"Can not create object because is too far" ); }
void ossimPpjFrameSensor::worldToLineSample(const ossimGpt& world_point, ossimDpt& image_point) const { ossimGpt wpt = world_point; if(wpt.isHgtNan()) { wpt.height(m_averageProjectedHeight); } ossimEcefPoint gnd_ecf(wpt); ossimEcefPoint cam_ecf(m_adjustedCameraPosition); ossimEcefVector ecfRay(gnd_ecf - cam_ecf); ossimColumnVector3d camRay(m_ecef2Cam*ecfRay.data()); double x = m_principalPoint.x + m_adjustedFocalLength*camRay[0]/camRay[2]; double y = m_principalPoint.y + m_adjustedFocalLength*camRay[1]/camRay[2]; ossimDpt p(x, y); image_point = p; }