Skip to main content

Viewing Object Scans

You can view the 3D point clouds from processed captures by accessing the bytes with .fetchPlyBytes():

val bytes = session.capturesProcessed.firstOrNull()?.fetchPlyBytes()

With these bytes you can use our PLY rendering utilities to render the point cloud. Here is a base jetpack composable example that implements these:

import ai.dockware.core.shipments.models.Dimensions
import ai.dockware.core.ui.ply_renderer.PlyRenderer
import ai.dockware.core.ui.ply_renderer.PlyRendererController
import ai.dockware.core.ui.ply_renderer.TouchableGLSurfaceView
import android.widget.FrameLayout
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.viewinterop.AndroidView

@Composable
fun PlyViewer(
plyBytes: ByteArray?,
outlineDimensions: Dimensions, // in meters
modifier: Modifier = Modifier
) {

val controller = remember {
PlyRendererController()
}

LaunchedEffect(plyBytes) {
plyBytes?.let {
controller.loadData(it)
}
}

LaunchedEffect(outlineDimensions) {
controller.setBoxDimensions(outlineDimensions)
}

AndroidView(
factory = { context ->
FrameLayout(context).apply {
val renderer = PlyRenderer(context, null, null)
val glView = TouchableGLSurfaceView(context, renderer).apply {
setEGLContextClientVersion(2)
setEGLConfigChooser(8, 8, 8, 8, 16, 0)
setRenderer(renderer)
}

controller.bind(glView, renderer)

addView(glView)
}
},
modifier = modifier
)
}

Using this component:

PlyViewer(
plyBytes = bytes,
outlineDimensions = Point3(40f, 30f, 48f).inchesToMeters().toDimensions()
)