Jump to content

[SOLVED] Unigine Zoom problem(Camera management)


photo

Recommended Posts

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 by burakdogancay
Link to comment

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
  • silent changed the title to [SOLVED] Unigine Zoom problem(Camera management)
×
×
  • Create New...