2012-01-05 1 views
1

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

- (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; 
    } 
+0

не уверен, как это сделать в GLK, но вы переводите его в начало, прежде чем поворачивать его (и обратно)? – dan

+0

Нет, я не думаю, что я это делаю. Объект не отодвигается от экрана, он вращается, просто не так, как я этого хочу. Должен ли я это делать? – Adam

+0

в OpenGL, вы сначала переводите (= слайд) объект в начало координат (0,0,0), затем поворачиваете его, а затем переводите обратно в предполагаемое положение. OpenGL всегда вращается вокруг источника, если вы не сдвигаете его туда, ваш объект «вращает» начало координат, но не вращается, как ожидалось, сам по себе. – dan

ответ

2

Потому что вы говорите это, чтобы вращаться в обоих х и у :)

Попробуйте это:

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

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

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

NB Благодаря @Marcelo кантосё для осветления :)

+0

Спасибо за ответ. Я понимаю ваши рассуждения, и это имеет смысл. Я выстрелил, но теперь он совсем не движется. – Adam

+0

Я понял. Вы были на правильном пути. Я не совсем уверен, почему то, что у меня было, не работает, но я нашел что-то, что работает. Вместо того, чтобы делать оба перемещения одновременно с использованием GLKMatrix4Rotate(), я использую GLKMatrix4RotateX() и GLKMatrix4RotateY(). – Adam

+0

Извините, я неправильно понял подпись метода и перепутал свои топоры/радианы - извините! См. Мое редактирование для лучшего ответа! – deanWombourne

1

в соответствии с 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 не обязательно, где вы думаете. Это то, о чем вы беспокоитесь?

+0

Спасибо. Теперь я вижу более четко. Я заметил, что проблема с startPoint очень отзывчива. Я делю его. Я бы хотел, чтобы модель двигалась, как ваш палец. Если вы двигаетесь под углом, я бы хотел, чтобы он вращался вверх и назад. Мой выделенный код с использованием RotateX и RotateY, похоже, работает именно так. Я не могу понять, как заставить его перестать хватать пальцем. – Adam

 Смежные вопросы

  • Нет связанных вопросов^_^