2012-03-30 10 views
1

私は3Dオブジェクト(3Dオブジェクト)を指でスワイプするだけで回転させる必要があるiosアプリケーションで作業しています。回転に使用するメソッドは、iOSのタッチ入力を使用して3Dオブジェクトを回転する

setRotationMatrix(float angle、float x、float y、float z、float * matrix)です。

しかし、3D行列を正しく回転させるために、タッチのxとyの位置値を使用する方法がわかりません。ここで私は

を使用していたコードがある - (IBAction)handlePan:(UIPanGestureRecognizer *)、認識{

if(recognizer.state == UIGestureRecognizerStateBegan) 
    { 
     panStartPoint = [recognizer locationInView:self]; 
     previousPoint.x = 0; 
     previousPoint.y = 0; 
     currentPoint.x = panStartPoint.x; 
     currentPoint.y = panStartPoint.y; 
    } 
    else if(recognizer.state == UIGestureRecognizerStateEnded) 
    { 
     panEndPoint = [recognizer locationInView:self]; 
    } 
    else if (recognizer.state == UIGestureRecognizerStateChanged) 
    { 
     previousPoint.x = currentPoint.x; 
     previousPoint.y = currentPoint.y; 
     CGPoint instanteneousPoint = [recognizer locationInView:self]; 
     currentPoint.x = instanteneousPoint.x; 
     currentPoint.y = instanteneousPoint.y; 

     int xdifference = currentPoint.x - previousPoint.x; 
     int ydifference = currentPoint.y - previousPoint.y; 



     if((xdifference <= rotationThreshold *-1) || xdifference >= rotationThreshold) //rotationThreshold = 3; 
     { 
      if(xdifference <= rotationThreshold *-1) 
      { 
       rotationY = -1.0; 
      } 
      else 
      { 
       rotationY = 1.0; 
      } 

      if((ydifference >= rotationThreshold *-1) && ydifference <= rotationThreshold) 
      { 
       rotationX = 0.0; 
      } 
     } 

     if((ydifference <= rotationThreshold *-1) || ydifference >= rotationThreshold) 
     { 
      if((ydifference <= rotationThreshold *-1)) 
      { 
      rotationX = -1.0; 
      } 
      else 
      { 
       rotationX = 1.0; 
      } 
      if((xdifference >= rotationThreshold *-1) && xdifference <= rotationThreshold) 
      { 
       rotationY = 0.0; 
      } 

     } 
     if(rotationX != 0.0 || rotationY != 0.0) 
     { 
      rotationDegree += 5.0f; 
      if(rotationDegree >= 360.0f) 
      { 
       rotationDegree = 0.0f; 
      } 
      ShaderUtils::rotatePoseMatrix(rotationDegree, rotationX, rotationY, rotationZ, &modelViewMatrix.data[0]); //rotationZ = 0; 
     }}} 

これは、3Dオブジェクトのいくつかの回転で私を提供するが、それが必要として、そのような自然されていませんさあ。どんな助けでも大歓迎です。ありがとう。ここok..so

(私はそれはeasyerであることがわかりました)何をされて使用さUIPanGestureRecognizerを使用したことがないwell..i

答えて

0

ので、私はそれを動作doesntの方法と理由を知らないが、私は、3Dオブジェクトを移動するUITouchを使用しました私は(私は申し訳ありません...あなたにそれを与える傾けるように、もうコードを持っていけない)でした:

あなたはtouchesBegan(UITouchPhaseBegan

との最初の接触を取得し、touchesMoved場合は、Xの上にオブジェクトを回転させますY軸上でタッチを移動し、x軸上で回転させたときにy軸上で回転させると、2軸の任意の組み合わせ(自分で感度を設定する必要があります)

また、あなたがこのようなビューでオブジェクトを移動するためのオプションを持っている:あなたは二回タップして(ラップトップのトラックパッドのように)指を動かす

z軸上を移動するだけでUIPinchGestureRecognizer

を使用

そのあなたが、私は非常によく説明していないかもしれない...しかし、あなたは基本的なアイデアを得るUITouch class reference

で、より外観のための2D表面

で、すべての3次元での3Dオブジェクトを移動することはできません明らか

+0

ありがとうskytz。パンのジェスチャーは、UITOUCHとほぼ同じです。私のコードで説明したように、私はあなたが記述したのとまったく同じロジックに従っています。それも回転しますが、ローテーションはあまり自然ではないようです。無数の時間をネットで検索した後、私は2Dのジェスチャーで3dオブジェクトを回転させるには、まずその行列を元の位置に変換し、その四元数を見つけて乗算しなければなりません。一緒に。またはそのようなものです。 – Waqar

0

私はthisがあなたに役立つと思います。それは適切な方法でそれを行ういくつかの方法でチュートリアルです

関連する問題