c++pangolin

Pangolin - s_cam vs d_cam - need help understanding the difference


I'm trying to get up to speed on using Pangolin. I'm starting with the first example:

https://github.com/stevenlovegrove/Pangolin/blob/master/examples/HelloPangolin/main.cpp

which I'll reproduce here for convenience:

#include <pangolin/pangolin.h>

int main( int /*argc*/, char** /*argv*/ )
{
    pangolin::CreateWindowAndBind("Main",640,480);
    glEnable(GL_DEPTH_TEST);

    // Define Projection and initial ModelView matrix
    pangolin::OpenGlRenderState s_cam(
        pangolin::ProjectionMatrix(640,480,420,420,320,240,0.2,100),
        pangolin::ModelViewLookAt(-2,2,-2, 0,0,0, pangolin::AxisY)
    );

    // Create Interactive View in window
    pangolin::Handler3D handler(s_cam);
    pangolin::View& d_cam = pangolin::CreateDisplay()
            .SetBounds(0.0, 1.0, 0.0, 1.0, -640.0f/480.0f)
            .SetHandler(&handler);

    while( !pangolin::ShouldQuit() )
    {
        // Clear screen and activate view to render into
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        d_cam.Activate(s_cam);

        // Render OpenGL Cube
        pangolin::glDrawColouredCube();

        // Swap frames and Process Events
        pangolin::FinishFrame();
    }
    
    return 0;
}

Having a background in related topics I can understand most of this code is doing, however I'm unclear on what s_cam and d_cam are, can anybody who is familiar with Pangolin explain this?

Before somebody says "read the documentation", I did build the Pangolin documentation but that basically just lists the functions and didn't help much.

Also I should mention this is a difficult thing to Google on due to Pangolin being the same name as the animal, and also there is a company that makes laser products with the same name.


Solution

  • You may look at s_cam as the State of the camera. It defines the relationship between the camera and world. It's defined by the Projection Matrix which is defined as

    OpenGlMatrixSpec pangolin::ProjectionMatrix(
    int w,
    int h,
    double fu,
    double fv,
    double u0,
    double v0,
    double zNear,
    double zFar
    )
    

    and ModelViewLookAt which is defined as

    OpenGlMatrix pangolin::ModelViewLookAt(
    double ex,
    double ey,
    double ez,
    double lx,
    double ly,
    double lz,
    double ux,
    double uy,
    double uz
    )
    
    

    In Summary, the ModelViewLookAt takes in 3 types of parameters: Where the Camera is? (3 params), Where the Object is? (3 params) and Where is the camera Looking? (3 Params).

    On the other hand, d_cam is the through which you are going to see. Basically, Display configuration by Bounds, Aspect Ratios, and Handler.

    Bounds can be seen as Upper and Lower bounds in 2 Axis (Bottom-Up, Left-Right). Bounds also include aspect ratio.

    Handler helps us create an Interactive View in Windows.

    SetBounds definition

    View & SetBounds (Attach bottom, Attach top, Attach left, Attach right, double aspect)
    

    SetHandler Definition

    View & pangolin::View::SetHandler ( Handler * handler )
    
    

    I hope this helps you in some way.