2012-01-05 19 views
1

タッチでiOSのOpenGLオブジェクトを回転しようとしていますが、何か問題があります。私はここで、ユーザのタッチをつかんでいます:私は回転を実行するために私の更新機能でそれを使用していGLKitでOpenGL ESオブジェクトを回転する

- (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

あなたは、xとyの両方に回転するようにそれを言っているので:)

ことは、これを試してみてください:

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

これはXの周りstartPoint.xラジアン回転します-軸。

最後の3つのパラメータを変更することで、任意の軸について回転することができます(つまり、0,1,0はy軸を中心に回転し、1,1,0はx軸とy軸の間で45度回転します)。明確化のため。)

NBおかげ@Marceloカントス:)

+0

答えをありがとう。私はあなたの推論を理解し、それは理にかなっています。私はそのショットを与えたが、今は全く動かない。 – Adam

+0

私はそれを理解しました。あなたは正しい軌道に乗っていました。私が持っていたものがまだ動作していないのは確かではありませんが、動作するものが見つかりました。 GLKMatrix4Rotate()を使って両方の動きを同時に行うのではなく、GLKMatrix4RotateX()とGLKMatrix4RotateY()を使用しています。 – Adam

+0

申し訳ありませんが、私はメソッドシグネチャを誤読し、軸/ラジアンが混ざってしまっています - ごめんなさい!より良い答えが私の編集を参照してください! – deanWombourne

1

deanWombourne 1として、あなたは間違って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

関連する問題