I'm posting here below a code snippet that works, as I just tested it.

It's written for Android, but you can basically use it on iOS too, or adjust your code by comparing it with mine.

To give a bit of explanation to it:

what you need to do is to add your "backMotion_InWorldCoordinates" translation at the end of all your "usual" transformations by using multiplyMatrix function like for any other translation; please check how this is done in the code I paste here below.

Also, note that the inverseModelViewMatrix must be initalized to identity matrix in the rendering initialization function (otherwise at the first frame the matrix will be undefined or all zeros).

So, here is the code snippet:

for(int tIdx = 0; tIdx < state.getNumTrackableResults(); tIdx++)

{

// Get the trackable:

const QCAR::TrackableResult* result = state.getTrackableResult(tIdx);

const QCAR::Trackable& trackable = result->getTrackable();

QCAR::Matrix44F modelViewMatrix = QCAR::Tool::convertPose2GLMatrix(result->getPose());

QCAR::Matrix44F modelViewProjection;

//apply usual transformations here

SampleUtils::translatePoseMatrix(0.0f, 0.0f, kObjectScale,

&modelViewMatrix.data[0]);

SampleUtils::scalePoseMatrix(kObjectScale, kObjectScale, kObjectScale,

&modelViewMatrix.data[0]);

/////

//NEW: apply our custom backward translation here

QCAR::Vec3F backMoveCameraRef(0.0f, 0.0f, 1.0f);

QCAR::Vec3F backMoveWorldRef = SampleMath::Vec3FTransformNormal(backMoveCameraRef, inverseModelViewMatrix);

backMoveWorldRef = SampleMath::Vec3FNormalize(backMoveWorldRef);

float speed = 0.2f;

backTranslation.data[0] += speed*backMoveWorldRef.data[0];

backTranslation.data[1] += speed*backMoveWorldRef.data[1];

backTranslation.data[2] = 0.0f;

SampleUtils::translatePoseMatrix(backTranslation.data[0], backTranslation.data[1], backTranslation.data[2],

&modelViewMatrix.data[0]);

/////////////////////

//NEW: update inverseModelViewMatrix

inverseModelViewMatrix = SampleMath::Matrix44FInverse(modelViewMatrix);

//multiply modelview and projection matrix as usual

SampleUtils::multiplyMatrix(&projectionMatrix.data[0],

&modelViewMatrix.data[0] ,

&modelViewProjection.data[0]);

glUseProgram(shaderProgramID);

glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0,

(const GLvoid*) &teapotVertices[0]);

// etc.

Let me know if you have more questions on this.

You're welcome.