Поворот 3D-объекта с помощью сенсорного ввода в iOS - PullRequest
1 голос
/ 30 марта 2012

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

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;
        }}}

Это дает мне некоторое вращение трехмерного объекта, но это не такестественно, как и должно быть.Любая помощь будет высоко ценится.Благодарю.

Ответы [ 2 ]

0 голосов
/ 01 июня 2013

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

0 голосов
/ 30 марта 2012

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

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

вы получаете первое прикосновение с прикосновениями Bean (UITouchPhaseBegan)

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

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

чтобы переместить его по оси z, просто используйте UIPinchGestureRecognizer

очевидно, что вы не можете переместить трехмерный объект во всех трех измерениях с двухмерной поверхностью

для получения дополнительной информации см. Ссылка на класс UITouch

Возможно, я не очень хорошо объяснил ... но вы поняли основную идею

...