PDA

View Full Version : Accumulated transformation



dmitry
09-23-2016, 03:12 AM
Hello. I'am developing control for visualising raster maps (google maps, mapbox etc) on iOS platform. Only raster tiles. All ok, but I have one problem: user can touch any point on screen (this is anchor point for rotation and scale). But does not work. Now I have modelView matrix, and every frame i updating this matrix with deltas (delta scale, delta rotation, delta translation). All work fine, but i can't control animation of camera (I can only reset matrix and translate). When I trying control transform (without deltas), and every frame reset, translate, rotate, scale - all just twitches. And I have one question: How I can control transform (cumulate) with anchor point? Every frame now i do (based on gestures):

- (void)tick {
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(0, screenBounds.size.width, screenBounds.size.height, 0, -1, 1);

glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(modelView.m);

GLKMatrix4 invModelView = GLKMatrix4Invert(modelView, nil);
GLKVector4 anchorInCC = GLKMatrix4MultiplyVector4(invModelView, GLKVector4Make(cameraAnchor.x, cameraAnchor.y, 0, 1));

glTranslatef(mCurrentTranslation.x, mCurrentTranslation.y, 0);
mCurrentTranslation = GLKVector2Make(0, 0);
glTranslatef(anchorInCC.x, anchorInCC.y, 0);

if (mCurrentScale != 0) {
mAccumulatedScale += mCurrentScale;
mCurrentScale = 0.0;

glGetFloatv(GL_MODELVIEW_MATRIX, modelView.m);
modelView = GLKMatrix4Scale(modelView, mAccumulatedScale, mAccumulatedScale, 1);
mAccumulatedScale = 1.0;
glLoadMatrixf(modelView.m);
}

glRotatef(mCurrentRotation * 180.0 / M_PI, 0, 0, 1);
mCurrentRotation = 0.0;

glTranslatef(-anchorInCC.x, -anchorInCC.y, 0);

glGetFloatv(GL_MODELVIEW_MATRIX, modelView.m);

// Render geometry

}