Как использовать GLKit, чтобы вращаться вокруг центра спрайта от атласа - PullRequest
1 голос
/ 24 февраля 2012

У меня есть текстура, которая следует за пальцем пользователя в GLKit.Я вычисляю радиан, чтобы нарисовать угол при использовании арктана между двумя точками.

Часть хитрости здесь заключается в том, чтобы держать объект в центре недоедающего пальца.Поэтому я ввел идею узловой точки, так что все может быть обращено относительно их происхождения или центра.Моя цель - переместить спрайт на место, а затем вращать.В моем рендерере есть следующий код:

// lets adjust for our location based on our anchor point.
GLKVector2 adjustment = GLKVector2Make(self.spriteSize.width * self.anchorPoint.x, 
                                       self.spriteSize.height * self.anchorPoint.y);

GLKVector2 adjustedPosition = GLKVector2Subtract(self.position, adjustment);
GLKMatrix4 modelMatrix = GLKMatrix4Multiply(GLKMatrix4MakeTranslation(adjustedPosition.x, adjustedPosition.y, 1.0), GLKMatrix4MakeScale(adjustedScale.x, adjustedScale.y, 1));

modelMatrix = GLKMatrix4Rotate(modelMatrix, self.rotation, 0, 0, 1);

effect.transform.modelviewMatrix = modelMatrix;
effect.transform.projectionMatrix = scene.projection;

Еще одно замечание: мой спрайт находится на псевдониме текстуры.Если я уберу свое вращение, мой спрайт будет правильно отцентрирован под моим пальцем.Моя матрица проекта - GLKMatrix4MakeOrtho (0, CGRectGetWidth (self.frame), CGRectGetHeight (self.frame), 0, 1, -1);поэтому он совпадает с UIkit и представлением, в которое он встроен.

Ответы [ 2 ]

2 голосов
/ 25 февраля 2012

Мне пришлось добавить немного больше математики для вычисления дополнительных смещений, прежде чем я поверну.

// lets adjust for our location based on our anchor point.
GLKVector2 adjustment = GLKVector2Make(self.spriteSize.width * self.anchorPoint.x, 
                                       self.spriteSize.height * self.anchorPoint.y);

// we need to further adjust based on our so we can calucate the adjust based on our anchor point in our image.
GLKVector2 angleAdjustment;

angleAdjustment.x = adjustment.x * cos(self.rotation) - adjustment.y * sin(self.rotation);
angleAdjustment.y = adjustment.x * sin(self.rotation) + adjustment.y * cos(self.rotation);

// now create our real position.
GLKVector2 adjustedPosition = GLKVector2Subtract(self.position, angleAdjustment);
GLKMatrix4 modelMatrix = GLKMatrix4Multiply(GLKMatrix4MakeTranslation(adjustedPosition.x, adjustedPosition.y, 1.0), GLKMatrix4MakeScale(adjustedScale.x, adjustedScale.y, 1));

modelMatrix = GLKMatrix4Rotate(modelMatrix, self.rotation, 0, 0, 1);

Это создаст дополнительную настройку, основанную на том, где в изображении мы хотим повернуть, а затем преобразовать на основе этого.Это работает как шарм ..

0 голосов
/ 03 июня 2013

Существует аналогичный код, который я использовал, чтобы вращать спрайт вокруг его центра

Сначала вы перемещаете его в позицию, затем вращаете его, затем вы перемещаете его обратно на полсвет

- (GLKMatrix4) modelMatrix {
    GLKMatrix4 modelMatrix = GLKMatrix4Identity;

    float radians = GLKMathDegreesToRadians(self.rotation);
    modelMatrix = GLKMatrix4Multiply(
        GLKMatrix4Translate(modelMatrix, self.position.x , self.position.y , 0),
        GLKMatrix4MakeRotation(radians, 0, 0, 1));
    modelMatrix = GLKMatrix4Translate(modelMatrix, -self.contentSize.height/2, -self.contentSize.width/2 , 0);
    return modelMatrix;
}
...