2012-03-30 1 views
1

Я работаю над приложением ios, где мне нужно повернуть 3D-матрицу (3D-объект), просто проведите пальцем по ней. метод i используется для вращенияПоворот 3D-объекта с помощью сенсорных входов в iOS

setRotationMatrix (поплавок, поплавок x, поплавок y, поплавок z, поплавок * матрица);

Однако я не уверен, как использовать значения местоположения x и y для касания, чтобы правильно повернуть 3D-матрицу. Вот код, который я использую

- (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-объекта, но его не так естественно, как это должно быть. Любая помощь будет высоко ценится. Благодарю.

ответ

0

well..i никогда не использовали используемый UIPanGestureRecognizer, так что я не знаю, как и почему не делает его работу, но я использовал UITouch переместить 3d объект (я нахожу, что это easyer)

ok..so здесь что я сделал (я не имею код больше, так что я не могу дать вам это ... извините):

вы получите первый контакт с touchesBegan (UITouchPhaseBegan)

затем, если touchesMoved вращать объект по х ось, если касание перемещено по y и повернет его по оси y, если касание перемещено по х .. и любая комбинация из 2 (вы сами должны установить чувствительность)

также у вас есть возможность перемещать объект в виде, как это: вы нажимаете дважды, а затем переместите палец (как трек блокнот ноутбука)

, чтобы переместить его на оси г просто использовать UIPinchGestureRecognizer

ее очевидно, что вы не можете переместить 3D-объект во всех 3-х измерениях с 2d поверхности

для более взгляда в UITouch class reference

я не объяснил очень хорошо ... но вы получите основную идею

+0

Спасибо skytz. Жест жеста более или менее такой же, как UITOUCH. Как описано в моем коде, я следую точно такой же логике, которую вы описали. И он вращается, но вращение не кажется таким естественным. После поиска в сети в течение бесчисленных часов у меня появилась идея, что для того, чтобы повернуть 3D-объект с 2D-жестом, сначала нужно преобразовать эту матрицу в ее исходное положение, затем найти ее кватернион (что бы это ни было) и умножить их вместе. или что-то типа того. – Waqar

0

Я думаю, this должен вам помочь. Это учебник с несколькими способами, чтобы сделать его в правильном направлении