Вращение объекта OpenGL ES с помощью GLKit - PullRequest
1 голос
/ 05 января 2012

Я пытаюсь повернуть объект OpenGL в iOS с помощью касания, но у меня возникли некоторые проблемы.Я хватаю пользователя, который нажимает здесь:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
    UITouch *touch = [touches anyObject];
    startPoint = [touch locationInView:self.view];
    }

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
   {
   UITouch *touch = [touches anyObject];
   CGPoint point = [touch locationInView:self.view];
   dx = point.y - startPoint.y;
   dy = point.x - startPoint.x;
   startPoint = point;
   }

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

- (void)update
   {    
   float aspect = fabsf(self.view.bounds.size.width / self.view.bounds.size.height);
   GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 0.1f, 100.0f);

   self.effect.transform.projectionMatrix = projectionMatrix;

   GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -3.5f);
   modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, -1, startPoint.x, startPoint.y, 0.0f);
   dx = dy =0;
   self.effect.transform.modelviewMatrix = modelViewMatrix;
   }

Ответы [ 2 ]

2 голосов
/ 05 января 2012

Поскольку вы говорите, чтобы он вращался как по x, так и по y:)

Попробуйте:

modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, startPoint.x, 1.0f, 0.0f, 0.0f);

Это будет вращать радианты startPoint.x вокруг оси x.

Вы можете вращаться вокруг любой оси, если хотите, изменив последние 3 параметра (т.е. 0,1,0 будет вращаться вокруг оси Y, 1,1,0 будет вращаться вокруг оси 45 ° между x иу.)

NB. Спасибо @Marcelo Cantos за разъяснения:)

1 голос
/ 05 января 2012

Согласно deanWombourne, вы используете GLKMatrix4Rotate неправильно. Когда вы выполняете:

GLKMatrix4Rotate(modelViewMatrix, -1, startPoint.x, startPoint.y, 0.0f);

Вы вращаете -1 радиан вокруг оси (startPoint.x, startPoint.y, 0.0f). Похоже, что вы хотите вращать радианы startPoint.x вокруг (1, 0, 0) и радианы startPoint.y вокруг (0, 1, 0). Так, например:

modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, startPoint.x, 1.0f, 0.0f 0.0f);
modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, startPoint.y, 0.0f, 1.0f 0.0f);

Или, возможно, вы хотите разделить startPoint.x и startPoint.y, потому что это будет гиперчувствительным к прикосновениям.

У него также будут некоторые проблемы с блокировкой карданного подвеса - по сути, потому что, если вы сначала поворачиваете вокруг x, то ось y не обязательно там, где вы думаете, а если вы поворачиваете вокруг y сначала, то ось x не обязательно где вы думаете это. Вас это беспокоит?

...