burakdogancay Posted March 9, 2020 Share Posted March 9, 2020 (edited) Hello everyone, Nowadays I am working on camera and its requirments for digital and manual zoom effect.I already wrote a code but unfortunately it does not work properly.I would apreciate if you help me on the subject. INIT METHODE //Camera Init Function //I BASİCALLY CONFİGURED MY CAMERA FOR ZOOMING OPERATION Manager::BCameraManager::initCamera(Unigine::NodePtr pNode, Unigine::NodePtr pReference) { camera = Unigine::PlayerDummy::cast(pNode); camerashift = Unigine::PlayerDummy::cast(pNode); //camerashift->setParent(pNode); if(!camera.get()) return; cameraBase = camera->getPlayer(); valid = true; referenceNode = pReference; initialWorldTransform = camera->getWorldTransform(); initialTransform = camera->getTransform(); camera->setEnabled(0); near = camera->getZNear(); far = camera->getZFar(); initialFov = camera->getFov(); thermalMode = 0; QString tBlurMaterialName = mPayload.getMaterial(CameraBase::Blur); //"post_blur_radial_custom"; mPayload.blurMaterial = Unigine::Materials::get()->findMaterial(tBlurMaterialName.toStdString().c_str()); camera->getCamera()->setZNear(0.1f); camera->getCamera()->setZFar(400000.0f); camera->setFov(35.5); camera->setViewportMask(0x0000401); // CAMERA VİEWPORT MASK postProcess(CameraBase::Blur); } FOV CONFIGURATIONS BCameraManager::processSensorType(const quint8 sensorType, const float zoomRatio, SensorParameters & param) { float tMin = 31.2f; float tMax = 1.79f; param.fov = (tMin + zoomRatio * (tMax - tMin));//I get zoom ratio and it is correct, all fov operations are correct param.maxFov = tMin; } UPDATE CAMERA ZOOM METHODE BCameraManager::update(float pTimeSince, Network::Interface &pData) { QString tCurrentPostProcess(camera->getPostMaterials()); QString tTargetPostProcess = ""; float tZoomRatio = static_cast<float>(pData.zoom); // 0..1 SensorParameters params; params.fov = 0.0; params.lux = 100000.0; params.viewportMask = 0x1; params.postProcessMask = CameraBase::Blur; int tTailPostProcessMask = CameraBase::Distort; int tFreePostProcessMask = CameraBase::None; int tPlayerPostProcessMask = CameraBase::None; processSensorType(pData.sensor, tZoomRatio, params);//HERE I CALCULATE CAMERA FOV AS ABOVE float tDigitalZoomFactor = 1.0; if(pData.digitalZoom > 0) tDigitalZoomFactor = tDigitalZoomFactor / (pData.digitalZoom*2); params.fov = params.fov * tDigitalZoomFactor; int tCurrentViewportMask = mPayload.camera->getViewportMask(); if(tCurrentViewportMask != params.viewportMask) { mPayload.camera->setViewportMask(params.viewportMask); } if(mThermalLightSource.get()) { float tCurrentLux = mThermalLightSource->getLux(); if(!qFuzzyCompare(params.lux, tCurrentLux)) { mThermalLightSource->setLux(params.lux); } } if(BWeatherManager::instance()->weatherCondition() != BWeatherManager::WcClear) { params.postProcessMask |= CameraBase::Rain; tPlayerPostProcessMask |= CameraBase::Rain; tFreePostProcessMask |= CameraBase::Rain; } mPlayer.postProcess(params.postProcessMask); mFree.postProcess(tFreePostProcessMask); mPayload.postProcess(params.postProcessMask); mTail.postProcess(tTailPostProcessMask); //I HAVE PROBLEM HERE FOR MANUAL ZOOM, UNFORTUNATELY MY CAMERA DOES NOT MOVE ON Z AXIS, IT MOVES ON EACH AXIS float tCurrentFov =camera->getFov(); if(qFuzzyCompare(tCurrentFov, params.fov) == false) { // mPayload.camera->setFov(params.fov); camera->setFov(params.maxFov);//SET CALCULATED FOV AND IT IS CORRECT // UPDATE : Calculate distance. { //Unigine::Game::get()->setPlayer(camerashift); float tcurrent_zoom_factor = params.maxFov/params.fov;//CALCULATE ZOOM FACTOR ACCORDING TO MAX FOV(THIS ONE IS CORRECT TOO) float z_far = camera->getZFar(); float z_near = camera->getZNear(); Unigine::Math::vec3 direction = camera->getWorldDirection(Unigine::Math::AXIS_NZ);//GET CAMERA DIRECTION Unigine::Math::Vec3 p1 = camera->getWorldPosition();//GET INIT POS OF CAMERA Unigine::Math::Vec3 p2 = p1 + Unigine::Math::Vec3(direction * 20000.0);//GET SECOND POS ACCORDING TO INIT POS auto intersection = Unigine::WorldIntersection::create(); // mPayload.camera->setViewportMask(0x400); auto res = Unigine::World::get()->getIntersection(p1, p2, 0x00000400, intersection);//CALCULATE INTERSECTION WITH LANDSCAPE , THIS ONE GETS CORRECT RESULT // mPayload.camera->setViewportMask(0x1); Unigine::Math::Vec3 point; float distance = 20000.0; //MY MAX DISTANCE if (res) { point = intersection->getPoint();//GETS INTERSECTION POINT distance = length(point - p1); qDebug()<<"intersection @"<<distance; } else { point = p2; qDebug()<<"No intersection!"; } distance -= distance/tcurrent_zoom_factor; ////CALCULATE REAL DISTANCE //I HAVE PROBLEM HERE, IT DOES NOT MOVE CAMERA IN Z DIRECTION, SETWORLD TRANSFORM METHODE MOVES BUT IT IS NOT APPROPRIATE FOR CALCULATED FOV OPERATION, JUST I NEED TO CORRECT THISS SECTION camerashift->setPosition(Unigine::Math::Vec3(0,0, -distance)); camerashift->setProjection(Unigine::Math::perspective(params.fov, 1.0f, z_near, z_far) * Unigine::Math::translate(Unigine::Math::vec3(0, 0, -distance))); qDebug()<<"Camera shift : "<<distance<<camerashift->getWorldPosition().z<<params.maxFov<<params.fov; //camera->getCamera()->setModelview(Unigine::Math::inverse(mPayload.camera->getWorldTransform())); camera->getCamera()->setProjection(Unigine::Math::perspective(params.maxFov, 1.0f, z_near, z_far)); Unigine::Visualizer::get()->renderLine3D(camerashift->getWorldPosition(),point,Unigine::Math::vec4(0,0,255,1)); Unigine::Visualizer::get()->renderLine3D(camera->getWorldPosition(),point,Unigine::Math::vec4(0,255,0,1)); //Unigine::Visualizer::get()->renderBillboard3D(mPayload.camera->getWorldPosition(),point,Unigine::Math::vec4(0,255,0,1)); auto sp = camerashift->getWorldPosition(); qDebug()<<"Camera shift : "<<sp.x<<sp.y<<sp.z; sp = camera->getWorldPosition(); qDebug()<<"Camera Pos: "<<sp.x<<sp.y<<sp.z; } ///////////////////END//////////////////////// } Thank you in advanced for your help. Edited March 9, 2020 by burakdogancay Link to comment
burakdogancay Posted March 10, 2020 Author Share Posted March 10, 2020 Ok, I solved it Here is a solution, please check update function and add below lines to apropriate position of the code. //Check update function and write below codes to apropriate section which is available distance -= distance/tcurrent_zoom_factor; Unigine::Math::Vec3 ZPoint = p1+ Unigine::Math::Vec3(direction * distance); mPayload.camera->getCamera()->setPosition(ZPoint); Link to comment
Recommended Posts