Panorama SDK

We are happy to introduce the free version of our Panorama SDK as showcased in the App "DMD Panorama Lite" available on the App Store and Play Store. This free version has a few limitations such as 180 degrees. There is a commercial version available against a flat fee or a profit sharing model. You may contact us for more information.

You can easily make your own Panoramic App

The free Panorama SDK is an easy to use and robust library that comes with a sample code.

It is available on the following platforms:

How to use the Panorama SDK

Follow these easy steps to build your own Panoramic App:

For iOS:

Preparing the SDK's delegate

Create a view controller (we'll call it "PLITShootingVC") that implements the "MonitorDelegate" Protocol.

  • To do that you have to do the following:

    1. Declare that your view controller is conforming to the “MonitorDelegate” protocol as shown below:

      @interface PLITShootingVC : UIViewController

    2. In the implementation of the view controller "PLITShootingVC" you have to implement the following list of callbacks:

      - (void)preparingToShoot; (1)
      - (void)canceledPreparingToShoot; (2)
      - (void)takingPhoto;
      - (void)photoTaken;
      - (void)stitchingCompleted:(NSDictionary*)dict;
      - (void)shootingCompleted;
      - (void)deviceVerticalityChanged:(NSNumber*)isVertical;
      - (void)compassEvent:(NSDictionary*)info;


      "takingPhoto": notifies the delegate when the SDK is about to capture a photo. You can use this method to make an effect before a photo is taken.
      "photoTaken": notifies the delegate when the SDK finishes capturing a photo. You can use this method to count the number of photos or to display a message informing the user to continue rotating. 

      "shootingCompleted": notifies the delegate when the SDK finishes taking photos (such as when the user requests to stop capturing or when the maximum number of photos are captured). It's preferable to display a progress indicator until the SDK finishes processing the photos.
      "stitchingCompleted": notifies the delegate when the SDK finishes stitching. You can use this method to save the newly created panorama or view it using DMD 3D Viewer.


  • Now to enable shooting

    Set the previously created view controller "PLITShootingVC" as the MonitorDelegate’s delegate ­which is the DMD Engine.

    [Monitor instance].delegate = self;

    You can use the following methods to interact with the SDK:

    - (void)restart;
    - (void)startShooting;
    - (void)stopShooting;
    - (void)finishShooting;
    - (void)stopSensors;
    - (void)genEquiAt:(NSString*)fileName withHeight:(NSUInteger)height andWidth:(NSUInteger)width andMaxWidth:(NSUInteger)maxWidth;


    "restart": to restart the shooting process from the beginning. It will ignore previously captured photos and reset the SDK.
    "startShooting": to start capturing. This may be used when the user taps on the screen or a "start" button (you have to call "restart" function before calling it).
    "stopShooting": Ignores previously captured photos and stops the SDK. This can be used when the application goes to the background or to navigate to another section of your app.
    "finishShooting": the SDK will stop capturing and start stitching the photos.
    "genEquiAt:withHeight:andWidth:andMaxWidth:": saves the panorama to disk with a given height and optionally a specific or maximum width.

    Viewing your panorama using DerManDar 3D Viewer

    Create another view controller (we'll call it "PLITViewerVC") and define a member variable of type "PanoViewer" - which inherits from "UIView" - and add it as a subview.

    PanoViewer *_panoViewer;

    To start the viewer animation call:

    [_panoViewer performSelector:@selector(start) onThread:[Monitor instance].engineMgr.thread withObject:nil waitUntilDone:NO];

    To stop the animation call:

    [_panoViewer performSelector:@selector(stop) onThread:[Monitor instance].engineMgr.thread withObject:nil waitUntilDone:NO];

    Since DMD 3D Viewer uses a UIGestureRecognizer internally, the SDK gives you access to it:

    aGestureRecognizer requireGestureRecognizerToFail:_panoViewer.doubleTapGR];

  • What you should get by doing these easy steps mentioned above

    Run the app in portrait mode and you will get the following screen:



  • Tap on the screen then start rotating your device in the same direction (Left or Right).



  • After taking a minimum of 2 shots, you can tap on the screen or rotate your device to landscape mode to finish. DerManDar 3D Viewer will appear showing the captured panorama.



  • DMD Panorama Lite App

    To try the free application "DMD Panorama Lite", (created with this Panorama SDK) you can get it here.

    Commercial Panorama SDK

    For further information about the Commercial version of this Panorama SDK, please click here.

    For Android:

    Configuring the project

    • Add "dmd_pano_library_lite.jar" to "libs" folder inside the project.



    • Add the jar file to build path: Project properties - Java Build Path - Libraries - Add JARs - Select Jar file from "libs" folder.



    • Add the "anim" files in the resource folder "res/anim".

      anim.zip



    • Add the "drawable" files in the resource folder "res/drawable".

      drawable.zip



    • Add the images required by the library to the correspondent folders "drawable-mdpi", "drawable-hdpi" and "drawable-xhdpi"

      drawable-mdip.zip    drawable-hdip.zip    drawable-xhdip.zip



    • Add the layouts required by the library to the "layout" folder.

      layout.zip



    • Append the colors items into "res/values/colors.xml".

      colors.txt



    • Append the strings items into "res/values/strings.xml".

      strings.txt



    • Append the styles items into "res/values/styles.xml".

      styles.txt



    • Finally add the required "uses-permissions" and "uses-feature" tags to your "AndroidManifest.xml" in the root tag "<manifest>".

      AndroidManifest.txt



    Preparing the SDK's delegate

    Create an activity (we'll call it "ShooterActivity").

  • Define a member variable of type "DMD_Capture" and call it "mDMDCapture”, and "onCreate" for this activity put the following:
    also define another member variable of type "CallbackInterfaceShooter”, call it mCallbackInterface and instantiate it (we have to implement the following list of methods):

    "takingPhoto": notifies the delegate when the SDK is about to capture a photo. You can use this method to make an effect before a photo is taken.
    "photoTaken": notifies the delegate when the SDK finishes capturing a photo. You can use this method to count the number of photos or to display a message informing the user to continue rotating. 

    "shootingCompleted": notifies the delegate when the SDK finishes taking photos (such as when the user requests to stop capturing or when the maximum number of photos are captured). It's preferable to display a progress indicator until the SDK finishes processing the photos.
    "stitchingCompleted": notifies the delegate when the SDK finishes stitching. You can use this method to save the newly created panorama or view it using DMD 3D Viewer.
    "deviceVerticalityChanged": notifies the delegate when the SDK detects a change in the orientation from the vertical status.
    "compassEvent": notifies the delegate when the SDK detects an interference in the compass based devices.
    "shotTakenPreviewReady": notifies the delegate when the SDK finished taking a shot and a preview image is ready to be used.
    "onFinishGeneratingEqui": notifies the delegate when the SDK finished from generating and saving the wide image to the path provided to "genEquiAt" method.
  • Now to enable shooting

    Now it is the time to start shooting so we have to add the camera overlay to the activity we have created:

    mDMDCapture = new DMD_Capture();
    mViewGroupCamera = mDMDCapture.initShooter(this, mCallbackInterface, getWindowManager().getDefaultDisplay().getRotation(), true, true);
    mRelativeLayoutRoot.addView(mViewGroupCamera);
    mViewGroupCamera.setOnClickListener(mCameraOnClickListener);

    what methods does mDMDCapture provide me with?

    - (void)restart;
    - (void)startShooting;
    - (void)stopShooting;
    - (void)finishShooting;
    - (void)stopSensors;
    - (void)genEquiAt:(NSString*)fileName withHeight:(NSUInteger)height andWidth:(NSUInteger)width andMaxWidth:(NSUInteger)maxWidth;


    "restart": to stop the shooting process and start again.
    "startShooting": to start the shooting process.
    "stopShooting": to cancel the shooting process.
    "finishShooting": to stop the shooting process and start stitching. After that we have to set the orientation of the activity depending on the type of the device:

    if(mDMDCapture.isTablet()) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    }
    else {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }

    to save the newly created panorama you can easily call the "genEquiAt" method from "mDMDCapture" by giving it the path, the height, the width and the maximum width.

    mDMDCapture.genEquiAt(mEquiPath, 800, 0, 0);

    Viewing your panorama using DerManDar 3D Viewer

    Create another view controller (we'll call it "ViewerActivity") and define a member variable of type "DMD_Viewer" - let's call it mDMDViewer.

    private DMD_Viewer mDMDViewer;

    then we have to initialize this instance.

    mDMDViewer = new DMD_Viewer();
    mViewViewer = mDMDViewer.initViewer(this, mCallbackInterfaceViewer, getWindowManager().getDefaultDisplay().getRotation());

    "mViewViewer" is a member variable of type view, so we have to add "mViewViewer" to the layout to be displayed on the screen.

    Let's talk about "mCallbackInterfaceViewer". It is an interface that allows you to interact with the viewer through the following methods:
    "onSingleTapConfirmed": notifies the user when a single tap occured.
    "onFinishLoadingPanorama": notifies the user when the panoramic image has finished loading.
    "onFinishGeneratingEqui": notifies the user when the wide image creation has completed.

    To start the viewer animation call:

    mDMDViewer.startViewer();

    To stop the animation call:

    mDMDViewer.stopViewer();

    What you should get

    By following the previously mentioned easy steps you simply need to present your view controller to start shooting.

    Run the app in portrait mode and you will get the following screen:



  • Tap on the screen then start rotating your device in the same direction (Left or Right).



  • After taking a minimum of 2 shots, you can tap on the screen or rotate your device to landscape mode to finish. DerManDar 3D Viewer will appear showing the captured panorama.



  • DMD Panorama Lite App

    To try the free application "DMD Panorama Lite", (created with this Panorama SDK) you can get it here.

    Commercial Panorama SDK

    For further information about the Commercial version of this Panorama SDK, please click here.