2012-06-29 2 views
0

Привет, у меня есть изображение, похожее на круглую столешницу. Я хочу переместить его по часовой стрелке, когда пользователь пробирается слева направо и против часовой стрелки, когда пользователь щелкает справа налево.Анимация с изображением в iPad

Как перемещение круглого стола в реальном времени. Как это сделать в приложении?

Я использую следующий код для вращения. Его из примера TrackBall. Проблема, с которой я столкнулась, - это когда когда-либо изображение вращается, оно меняет свое положение.

- (CATransform3D)rotationTransformForLocation:(CGPoint)location 
{ 
    CGFloat trackBallCurrentPoint[3] = {location.x - trackBallCenter.x, location.y - trackBallCenter.y, 0.0f}; 

    if(fabs(trackBallCurrentPoint[0] - trackBallStartPoint[0]) < kTol && fabs(trackBallCurrentPoint[1] - trackBallStartPoint[1]) < kTol) 
    { 
     return CATransform3DIdentity; 
    } 

    CGFloat dist = trackBallCurrentPoint[0] * trackBallCurrentPoint[0] + trackBallCurrentPoint[1] * trackBallCurrentPoint[1]; 
    if(dist > trackBallRadius * trackBallRadius) 
    { 
     // outside the center of the sphere so make it zero 
     trackBallCurrentPoint[2] = 0.0f; 
    } 
    else 
    { 
     trackBallCurrentPoint[2] = sqrt(trackBallRadius * trackBallRadius - dist); 
    } 

    // cross product yields the rotation vector 
    CGFloat rotationVector[3]; 
    rotationVector[0] = trackBallStartPoint[1] * trackBallCurrentPoint[2] - trackBallStartPoint[2] * trackBallCurrentPoint[1]; 
    rotationVector[1] = -trackBallStartPoint[0] * trackBallCurrentPoint[2] + trackBallStartPoint[2] * trackBallCurrentPoint[0]; 
    rotationVector[2] = trackBallStartPoint[0] * trackBallCurrentPoint[1] - trackBallStartPoint[1] * trackBallCurrentPoint[0]; 

    // calc the angle between the current point vector and the starting point vector 
    // use arctan so we get all eight quadrants instead of just the positive ones 

    // cos(a) = (start . current)/(||start|| ||current||) 
    // sin(a) = (||start X current||)/(||start|| ||current||) 
    // a = atan2(sin(a), cos(a)) 
    CGFloat startLength = sqrt(trackBallStartPoint[0] * trackBallStartPoint[0] + trackBallStartPoint[1] * trackBallStartPoint[1] + trackBallStartPoint[2] * trackBallStartPoint[2]); 
    CGFloat currentLength = sqrt(trackBallCurrentPoint[0] * trackBallCurrentPoint[0] + trackBallCurrentPoint[1] * trackBallCurrentPoint[1] + trackBallCurrentPoint[2] * trackBallCurrentPoint[2]); 
    CGFloat startDotCurrent = trackBallStartPoint[0] * trackBallCurrentPoint[0] + trackBallStartPoint[1] * trackBallCurrentPoint[1] + trackBallStartPoint[2] * trackBallCurrentPoint[2]; // (start . current) 

    // start X current we have already calcualted in the rotation vector 
    CGFloat rotationLength = sqrt(rotationVector[0] * rotationVector[0] + rotationVector[1] * rotationVector[1] + rotationVector[2] * rotationVector[2]); 

    CGFloat angle = atan2(rotationLength/(startLength * currentLength), startDotCurrent/(startLength * currentLength)); 

    // normalize the rotation vector 
    rotationVector[0] = rotationVector[0]/rotationLength; 
    rotationVector[1] = rotationVector[1]/rotationLength; 
    rotationVector[2] = rotationVector[2]/rotationLength; 

    CATransform3D rotationTransform = CATransform3DMakeRotation(angle, rotationVector[0], rotationVector[1], rotationVector[2]); 
    return CATransform3DConcat(baseTransform, rotationTransform); 
} 

Заранее благодарен.

+0

Посмотрите на оба объекта UIGestureRecognizer и CAAnimation (Core Animation)! Если у вас есть конкретные вопросы по коду, напишите, что у вас уже есть! – trumpetlicks

+0

Это для интерфейса (веб-просмотр, javascript) или для собственного приложения? –

+1

@Tom Это приложение для родного iPad. – Shakti

ответ

2

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

How to rotate a flat object around its center in perspective view?

+0

Большое спасибо этому прекрасному коду. – Shakti

+0

Благодаря rob mayoff! – tobinjim

+0

Если вы не против, можете ли вы поделиться кодом, чтобы вращать диск в любом направлении. – Shakti

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