iPad中的图像动画

iPad中的图像动画,ipad,animation,uigesturerecognizer,caanimation,Ipad,Animation,Uigesturerecognizer,Caanimation,嗨,我有一个像桌子圆形顶部的图像。 当用户从左向右滑动时,我想顺时针移动它;当用户从右向左滑动时,我想逆时针移动它 就像实时移动圆桌桌面一样。 如何在应用程序中执行此操作 我使用以下代码进行旋转。它来自轨迹球示例。 我遇到的问题是,当图像旋转时,它会改变位置 - (CATransform3D)rotationTransformForLocation:(CGPoint)location { CGFloat trackBallCurrentPoint[3] = {location.x

嗨,我有一个像桌子圆形顶部的图像。 当用户从左向右滑动时,我想顺时针移动它;当用户从右向左滑动时,我想逆时针移动它

就像实时移动圆桌桌面一样。 如何在应用程序中执行此操作

我使用以下代码进行旋转。它来自轨迹球示例。 我遇到的问题是,当图像旋转时,它会改变位置

- (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);
}
-(CATTransformM3D)旋转变换位置:(CGPoint)位置
{  
CGFloat trackBallCurrentPoint[3]={location.x-trackBallCenter.x,location.y-trackBallCenter.y,0.0f};
if(fabs(trackBallCurrentPoint[0]-trackBallStartPoint[0])轨迹球半径*轨迹球半径)
{
//在球体的中心之外,使其为零
轨迹球电流点[2]=0.0f;
} 
其他的
{
轨迹球电流点[2]=sqrt(轨迹球半径*轨迹球半径-距离);
}
//叉积产生旋转向量
CGFloat旋转向量[3];
旋转向量[0]=轨迹球起始点[1]*轨迹球电流点[2]-轨迹球起始点[2]*轨迹球电流点[1];
旋转向量[1]=-trackBallStartPoint[0]*trackBallCurrentPoint[2]+trackBallStartPoint[2]*trackBallCurrentPoint[0];
旋转向量[2]=轨迹球起始点[0]*轨迹球电流点[1]-轨迹球起始点[1]*轨迹球电流点[0];
//计算当前点向量和起点向量之间的角度
//使用arctan,我们得到所有八个象限,而不仅仅是正象限
//cos(a)=(start.current)/(start | | | | | | | current |)
//sin(a)=(| |开始X当前| |)/(| |开始| | | |当前|)
//a=atan2(sin(a),cos(a))
CGFloat STARTENGTH=sqrt(轨迹球起始点[0]*轨迹球起始点[0]+轨迹球起始点[1]*轨迹球起始点[1]+轨迹球起始点[2]*轨迹球起始点[2]);
CGFloat currentLength=sqrt(轨迹球电流点[0]*轨迹球电流点[0]+轨迹球电流点[1]*轨迹球电流点[1]+轨迹球电流点[2]*轨迹球电流点[2]);
CGFloat STARTODCURRENT=trackBallStartPoint[0]*trackBallCurrentPoint[0]+trackBallStartPoint[1]*trackBallCurrentPoint[1]+trackBallStartPoint[2]*trackBallCurrentPoint[2];/(start.current)
//我们已经在旋转矢量中计算了X电流
CGFloat rotationLength=sqrt(rotationVector[0]*rotationVector[0]+rotationVector[1]*rotationVector[1]+rotationVector[2]*rotationVector[2]);
CGFloat角度=atan2(旋转长度/(惊跳长度*电流长度),起始时间电流/(惊跳长度*电流长度));
//规范化旋转向量
旋转向量[0]=旋转向量[0]/旋转长度;
旋转向量[1]=旋转向量[1]/旋转长度;
旋转向量[2]=旋转向量[2]/旋转长度;
CATTransformM3D旋转变换=CATTransformM3D旋转(角度、旋转向量[0]、旋转向量[1]、旋转向量[2]);
返回CATTransferM3DCONCAT(基本变换、旋转变换);
}

提前谢谢

看看我提出的一个问题。。。您可能正在尝试做同样的事情(我不认为问题涵盖了它,但在旋转工作完成后,我实现了平移手势,允许用户向任意方向旋转光盘)


查看UIgestureRecognitor对象和动画(核心动画)!否则,如果有具体的代码问题,请张贴你已经!!!这是用于前端(web视图,javascript)还是用于本机应用程序?@Tom这是用于本机iPad应用程序。感谢添加代码。轨迹球示例希望在所有三维空间中移动对象。如果我理解你的目标,你只想绕一个轴旋转。因此,如果您不想将此方法简化为仅在一个维度上操作,则至少需要修改返回之前的最后一行,以排除变换中不必要的旋转。您认为位置是否可能由于设备方向的更改而改变?有关我所看到的内容的讨论,请参阅我的。如果您不介意,请您分享在任意方向旋转光盘的代码。@Shakti,我的代码相当广泛,因为设计要求盘片不断旋转,但允许用户在任意方向旋转得更快或更慢,因此,计时器和制动器可以将旋转恢复为“正常”超时。以下是帮助我的学习资源:非常感谢你的帮助。我会试着为我解决这个问题。要知道的关键是presentationLayer有当前的旋转角度,所以当你调整正在设置动画的旋转时,你需要根据presentationLayer的值进行操作。