Image Tracker
The Image Tracker recognizes and tracks planar images. It can demonstrate not only 3D objects but also videos, even the transparent one.
Create Instants
Starting / Stopping the Tracker
Using the Tracking Information
Setting a Target Image
Adding / Replacing a Target Image
Changing Tracking Mode
Create Instants
>ImageTrackerViewController.swift
var cameraDevice:MasCameraDevice = MasCameraDevice() var backgroundRenderer:MasBackgroundRenderer = MasBackgroundRenderer() var trackingManager:MasTrackerManager = MasTrackerManager()
Starting / Stopping the Tracker
To start / stop Tracker after loading the map, refer to the following code.
>ImageTrackerViewController.swift
@objc func resumeAR()
{
...
trackingManager.start(.TRACKER_TYPE_IMAGE)
}
@objc func pauseAR()
{
trackingManager.stopTracker()
...
}
Using the Tracking Information
In the folder where SDK is installed, go to ‘data > SDKSample > Original > ImageTarget' folder, and there is sample target image. Print the image.
If you use the sample code, the following content will be augmented for each image.
- Blocks.jpg: The alpha video is augmented.
- Lego.jpg: The normal video is augmented.
- Glacier.jpg: The cube with the texture is augmented.
To apply tracking results to augmented objects, refer to the following code.
>ImageTrackerViewController.swift
override func glkView(_ view: GLKView, drawIn rect: CGRect) {
...
let trackingState:MasTrackingState = trackingManager.updateTrackingState()
let result:MasTrackingResult = trackingState.getTrackingResult()
guard let backgroundTexture = backgroundRenderer.getBackgroundTexture() else {
return
}
backgroundRenderer.begin(backgroundTexture)
backgroundRenderer.renderBackgroundToTexture()
backgroundRenderer.end()
backgroundQuad.draw(texture: backgroundTexture, projectionMatrix: cameraDevice.getBackgroundPlaneProjectionMatrix())
glEnable(GLenum(GL_DEPTH_TEST))
let projectionMatrix:matrix_float4x4 = cameraDevice.getProjectionMatrix()
let trackingCount:Int32 = result.getCount()
if trackingCount > 0 {
for i in stride(from: 0, to: trackingCount, by: 1) {
let trackable:MasTrackable = result.getTrackable(i)
if trackable.getName() == "Lego" {
if videoCaptureController.getState() == MEDIA_STATE.PLAYING {
videoCaptureController.play()
videoCaptureController.update()
videoPanelRenderer.setVideoTextureId(videoTextureId: videoCaptureController.getTextureId())
videoPanelRenderer.setProjectionMatrix(projectionMatrix: projectionMatrix)
videoPanelRenderer.setPoseMatrix(poseMatrix: trackable.getPose())
videoPanelRenderer.setTranslation(x: 0.0, y: 0.0, z: 0.0)
videoPanelRenderer.setScale(x: 0.26, y: -0.15, z: 1.0)
videoPanelRenderer.draw()
}
} else if trackable.getName() == "Blocks" {
if chromakeyVideoCaptureController.getState() == MEDIA_STATE.PLAYING {
chromakeyVideoCaptureController.play()
chromakeyVideoCaptureController.update()
chromakeyVideoPanelRenderer.setVideoTextureId(videoTextureId: chromakeyVideoCaptureController.getTextureId())
chromakeyVideoPanelRenderer.setProjectionMatrix(projectionMatrix: projectionMatrix)
chromakeyVideoPanelRenderer.setPoseMatrix(poseMatrix: trackable.getPose())
chromakeyVideoPanelRenderer.setTranslation(x: 0.0, y: 0.0, z: 0.0)
chromakeyVideoPanelRenderer.setScale(x: 0.26, y: -0.18, z: 1.0)
chromakeyVideoPanelRenderer.draw()
}
} else if trackable.getName() == "Glacier" {
textureCube.setProjectionMatrix(projectionMatrix: projectionMatrix)
textureCube.setPoseMatrix(poseMatrix: trackable.getPose())
textureCube.setTranslation(x: 0.0, y: 0.0, z: -0.025)
textureCube.setScale(x: 0.15, y: 0.15, z: 0.05)
textureCube.draw()
} else {
coloredCube.setProjectionMatrix(projectionMatrix: projectionMatrix)
coloredCube.setPoseMatrix(poseMatrix: trackable.getPose())
coloredCube.setTranslation(x: 0.0, y: 0.0, z: -0.025)
coloredCube.setScale(x: 0.15, y: 0.15, z: 0.005)
coloredCube.draw()
}
}
}
else {
videoCaptureController.pause()
chromakeyVideoCaptureController.pause()
}
glDisable(GLenum(GL_DEPTH_TEST))
}
Setting a Target Image
By calling function addTrackerData to register the map file and calling function loadTrackerData, the target image can be tracked. To set a target image, refer to the following code.
>ImageTrackerViewController.swift
func startEngin()
{
...
let blocksTrackerMapPath:String = Bundle.main.path(forResource: "Blocks", ofType: "2dmap", inDirectory: "data/SDKSample")!
let glacierTrackerMapPath:String = Bundle.main.path(forResource: "Glacier", ofType: "2dmap", inDirectory: "data/SDKSample")!
let legoTrackerMapPath:String = Bundle.main.path(forResource: "Lego", ofType: "2dmap", inDirectory: "data/SDKSample")!
trackingManager.start(.TRACKER_TYPE_IMAGE)
trackingManager.setTrackingOption(.NORMAL_TRACKING)
trackingManager.addTrackerData(blocksTrackerMapPath)
trackingManager.addTrackerData(glacierTrackerMapPath)
trackingManager.addTrackerData(legoTrackerMapPath)
trackingManager.loadTrackerData()
}
Adding / Replacing a Target Image
Create a map file refer to Documentation > Target Manager.
Download the file you created.
Unzip the downloaded file and copy it to the desired path.
Changing Tracking Mode
Image Tracker has three Tracking modes : normal, extended, and multi.
The default setting is normal mode.
- normal mode: This is the normal image tracker.
trackingManager.setTrackingOption(.NORMAL_TRACKING)
- extended mode: This function is traceable even when the distance from the target image is far away.
trackingManager.setTrackingOption(.EXTENDED_TRACKING)
- multi mode: This function allows you to recognize and track up to three target images at the same time.
trackingManager.setTrackingOption(.MULTI_TRACKING)
