Я просто создаю приложение, такое как osx preview app.Я использую opengl или metalkit для рендеринга изображения.Я могу сделать масштабирование с центральной точкой (0,0) по некоторой матрице, но я не могу сделать масштабирование с точкой между двумя пальцами с помощью сенсорной панели, как приложение предварительного просмотра, потому что я не знаю, как создать свою матрицу модели.
Я просто задаю свою проблему на форуме разработки Apple, и я нахожу демо на github, но никто не может мне помочь.
- (void)magnifyWithEvent:(NSEvent *)event {
NSPoint eventLocation = [event locationInWindow];
NSPoint center = [self.view convertPoint:eventLocation fromView:nil];
NSPoint openglCenter = CGPointMake(center.x / ([[[NSApplication sharedApplication] mainWindow] frame].size.width / 2.0) - 1.0, center.y / ([[[NSApplication sharedApplication] mainWindow] frame].size.height / 2.0) - 1.0);
NSRect frame = [[[NSApplication sharedApplication] mainWindow] frame];
if ([event magnification] > 0)
{
if ([self zoomValue] <= 2.0)
{
[self setZoomValue:[self zoomValue] + [event magnification]];
if(self.zoomValue > 2.0) {
return;
}
self.slider.floatValue = [self zoomValue];
self.panMatrix = GLKMatrix4Translate(GLKMatrix4Identity, self.swipX / (frame.size.width / 2.0), -self.swipY / (frame.size.height / 2.0), 1);
self.scaleMatrix = GLKMatrix4Scale(self.baseScaleMatrix, self.zoomValue, self.zoomValue, 1);
GLKMatrix4 model = GLKMatrix4Multiply(self.panMatrix, self.scaleMatrix);
[self.testView makeChangeWithMat:model];
} else {
[self setZoomValue:2.0];
self.slider.floatValue = [self zoomValue];
self.panMatrix = GLKMatrix4Translate(GLKMatrix4Identity, self.swipX / (frame.size.width / 2.0), -self.swipY / (frame.size.height / 2.0), 1);
self.scaleMatrix = GLKMatrix4Scale(self.baseScaleMatrix, self.zoomValue, self.zoomValue, 1);
GLKMatrix4 model = GLKMatrix4Multiply(self.panMatrix, self.scaleMatrix);
[self.testView makeChangeWithMat:model];
}
}
else if ([event magnification] < 0)
{
if ([self zoomValue] + [event magnification] >= 1.0)
{
[self setZoomValue:[self zoomValue] + [event magnification]];
self.slider.floatValue = [self zoomValue];
self.panMatrix = GLKMatrix4Translate(GLKMatrix4Identity, self.swipX / (frame.size.width / 2.0), -self.swipY / (frame.size.height / 2.0), 1);
self.scaleMatrix = GLKMatrix4Scale(self.baseScaleMatrix, self.zoomValue, self.zoomValue, 1);
GLKMatrix4 model = GLKMatrix4Multiply(self.panMatrix, self.scaleMatrix);
[self.testView makeChangeWithMat:model];
}
else
{
[self setZoomValue:1.0];
if(self.zoomValue < 1.0) {
return;
}
self.slider.floatValue = [self zoomValue];
self.panMatrix = GLKMatrix4Translate(GLKMatrix4Identity, self.swipX / (frame.size.width / 2.0), -self.swipY / (frame.size.height / 2.0), 1);
self.scaleMatrix = GLKMatrix4Scale(self.baseScaleMatrix, self.zoomValue, self.zoomValue, 1);
GLKMatrix4 model = GLKMatrix4Multiply(self.panMatrix, self.scaleMatrix);
[self.testView makeChangeWithMat:model];
}
}
}