Lightspeed views supports the projection of images on a 3D terrain. A typical use case consists of representing the field of view recorded from a moving Unmanned Aerial Vehicle (UAV).
This article explains how to get started with the LuciadLightspeed image projection API. The package
com.luciad.view.lightspeed.layer.imageprojection
defines the tools to accomplish such image projections. The sample lightspeed.imageprojection provides a demonstration of a moving plane projecting a sequence of images.
Using TLspImageProjectionLayerBuilder
and ILspImageProjector
You can visualize image projections in ILspImageProjectionLayer
layers only. The ILspImageProjectionLayer
interface is not intended for implementation. Create the layer with the layer builder TLspImageProjectionLayerBuilder
.
As usual when you are building a Lightspeed layer, you need to assign a styler to the layer. The styler must map each domain
object of the model to a TLspImageProjectionStyle
. You need instances of TLspImageProjector
and ALspTextureObject
to build a TLspImageProjectionStyle
. They represent the projector and the projected image respectively.
TLspImageProjectionStyle
for a single element model (from samples/lightspeed/imageprojection/ProjectionStyler
)
TLspImageProjectionStyle style = TLspImageProjectionStyle
.newBuilder()
.image(domainObject.getTexture())
.projector(domainObject.getProjector())
.build();
The most common ALspTextureObject
implementation is TLsp2DImageTextureObject
, which is used here to project a buffered image. The TLspImageProjector
interface defines the location and the direction of the projector. There is a default implementation, called TLspImageProjector
, which contains setters for the projector parameters.
samples/lightspeed/imageprojection/ImageProjector
)
public void update(VirtualCamera aCamera) {
TLcdDefaultModelXYZWorldTransformation transformation = new TLcdDefaultModelXYZWorldTransformation();
transformation.setModelReference(fVideoReference);
transformation.setXYZWorldReference(fReference);
TLcdXYZPoint eye = new TLcdXYZPoint();
TLcdXYZPoint ref = new TLcdXYZPoint();
try {
transformation.modelPoint2worldSFCT(aCamera.getEye(), eye);
transformation.modelPoint2worldSFCT(aCamera.getRef(), ref);
} catch (TLcdOutOfBoundsException e) {
// not visible
eye.move3D(Double.NaN, Double.NaN, Double.NaN);
ref.move3D(Double.NaN, Double.NaN, Double.NaN);
}
fProjector.setEyePoint(eye);
fProjector.setReferencePoint(ref);
fProjector.setUpVector(aCamera.getUp());
fProjector.setFieldOfView(aCamera.getFov());
fProjector.setAspectRatio(aCamera.getAspectRatio());
fProjector.setRange(1e5);
fTexture.setImage(aCamera.getImage());
}