4

좋아, 그래서 iOS에서 휠 모양을 가진 'Wheel of Fortune'유형을 만들려고 노력하고있어, 휠을 잡고 스핀 할 수 있습니다. 나는 현재 내 심장의 내용물로 바퀴를 끌고 돌릴 수 있지만, 손가락을 놓으면 죽은 채로 멈춘다. 바퀴가 자연스럽게 회전하는 것을 시뮬레이션하려면 약간의 운동량이나 관성을 적용해야합니다.모멘텀/관성 모멘트/UIRotationGestureController를 사용하여 관성 모으기 시도

저는 속도 계산을 제 위치에 잡았습니다. 손가락을 들어 올리면 속도가 최소 1에서 최대 100 사이가됩니다. 범위는 1에서 1800까지입니다. 내 가장 어려운 영화!) 이제는 그 속도를 객체에 적용하기 위해 실제 회전으로 변환하는 방법과 시간이 지남에 따라 느려지는 방법을 설정하려고합니다.

초기 생각은 다음과 같습니다. 주어진 속도와 동일한 속도로 루프에서 전체 원을 회전 한 다음 각 회전마다 속도를 약간 낮 춥니 다. 이렇게하면 스핀이 더 빨라지고 속도가 느려지는 효과가 있습니다.

저는 수학자가 아니기 때문에 접근 방법이 잘못되었을 수 있습니다. 그러나 누군가 적어도 내가 기본 상태에서 어떻게 작동 할 수 있는지에 대한 조언이 있다면 정말 감사 할 것입니다. 여기에 정말 도움이되는 대답이 있습니다 : iPhone add inertia/momentum physics to animate "wheel of fortune" like rotating control,하지만 좀 더 이론적인데 실제로 계산 된 속도를 대상에 정확하게 적용하는 방법에 대한 실용적인 정보가 부족합니다. 여기에도 애니메이션 도움말이 필요할 것입니다.

편집 : 휠을 시계 방향 또는 반 시계 방향으로 드래그하면 해결할 필요가 있습니다.

감사합니다.

답변

1
내 프로그램 비트에 대한 유사한 무언가를 작성한

, 그러나 나는 3D로 회전하기 때문에 내가 생각하는 내 경우는 좀 더 복잡하다 : https://itunes.apple.com/ua/app/bit/id366236469?mt=8

은 기본적으로 내가 정기적으로 몇 가지 방법을 호출하는 NSTimer를 설정 내가 뭘 . 저는 회전 매트릭스를 만들기 위해 방향과 속도를 취합니다 (3D는 약간 더 멋지다 : P). 속도를 1보다 작은 숫자로 곱하면 속도가 떨어집니다. 빼기 대신 곱하기를하는 이유는 사용자가 스핀을 두 번 올리면 객체가 두 번 회전하는 것을 원하지 않는다는 것입니다.

바퀴가 회전하는 방향을 파악하는 방법은 모든 정보가있는 touchesEnded : withEvent : 메소드에 저장하면됩니다. 사용자가 손가락을 내린 상태에서 이미 추적 기능을 사용한다고 가정 해 보니 잘하면 분명해야합니다. 나는 addRotationByDegree 기능을 왼쪽하지만이하는 일은는 전역 변수 rotationDeltaX 및 rotationDeltaY를 사용하고 이미에 회전 행렬을 적용한다는 것입니다했습니다

// MyView.h 
@interface MyView : UIView { 
    NSTimer *animationTimer; 
} 
- (void) startAnimation; 
@end 


// MyAppDelegate.h 
@implementation MyAppDelegate 

- (void) applicationDidFinishLaunching:(UIApplication *)application { 
    [myView startAnimation]; 
} 

@end 

// MyView.m 
GLfloat rotationMomentum = 0; 
GLfloat rotationDeltaX = 0.0f; 
GLfloat rotationDeltaY = 0.0f; 

@implementation MyView 
- (void)startAnimation { 
    animationTimer = [NSTimer scheduledTimerWithTimeInterval:(NSTimeInterval)((1.0/60.0) * animationFrameInterval) target:self selector:@selector(drawView:) userInfo:nil repeats:TRUE]; 
} 

- (void) drawView:(id)sender { 
    addRotationByDegree(rotationMomentum); 
    rotationMomentum /= 1.05; 
    if (rotationMomentum < 0.1) 
     rotationMomentum = 0.1; // never stop rotating completely 
    [renderer render]; 
} 

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event 
{ 
} 

- (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event 
{ 
    UITouch *aTouch = [touches anyObject]; 
    CGPoint loc = [aTouch locationInView:self]; 
    CGPoint prevloc = [aTouch previousLocationInView:self]; 

    rotationDeltaX = loc.x - prevloc.x; 
    rotationDeltaY = loc.y - prevloc.y; 

    GLfloat distance = sqrt(rotationDeltaX*rotationDeltaX+rotationDeltaY*rotationDeltaY)/4; 
    rotationMomentum = distance; 
    addRotationByDegree(distance); 

    self->moved = TRUE; 
} 

- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event 
{ 
} 

- (void)touchesCancelled:(NSSet*)touches withEvent:(UIEvent*)event 
{ 
} 

: 뭔가처럼

은 내가 3D에있는 ​​것은 저장된 행렬을 저장 한 다음 결과를 저장합니다. 귀하의 예제에서 당신은 아마 (내가 X 방향으로 만 운동이 바퀴를 회전 지금 있으리라 믿고있어) 같은 훨씬 더 간단 무언가를 원하는 : 내가 어떤을하지 않는 거친 대답이 될 것

- (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event 
{ 
    UITouch *aTouch = [touches anyObject]; 
    CGPoint loc = [aTouch locationInView:self]; 
    CGPoint prevloc = [aTouch previousLocationInView:self]; 

    GLfloat distance = loc.x - prevloc.x; 
    rotationMomentum = distance; 
    addRotationByDegree(distance); 

    self->moved = TRUE; 
} 

void addRotationByDegree(distance) { 
    angleOfWheel += distance; // probably need to divide the number with something reasonable here to have the spin be nicer 
} 
+0

재미있는 작은 응용 프로그램입니다! 나는 내가 목욕이나 샤워, 또는 무엇인가를 원하는지를 결정하는 시간을 상담해야 할 것이다. 이것은 정확히 내가 필요한 것처럼 보인다. 고통스럽게해서 죄송합니다. 좀 더 자세한 정보를 주시겠습니까? 회전 행렬이 무엇인지는 확실치 않으며 어떤 방법 으로든 대수학 전문가가 아닙니다. – Luke

+0

처음부터 객체에 어떤 회전을 적용 할 것인지 이해하는 데 어려움을 겪고 있습니다. 예를 들어, 특정 수의 라디안 /도를 회전 시키라고 말하고 싶지는 않지만, 무한대로 회전 시키길 원합니다. 그러면 내가 제안 할 때 할 수 있고 이후의 회전마다 느려지 게 할 수 있습니다. 어떻게 초기 스핀으로 그 과정을 시작합니까? 내가 가진 모든 것은 속도를 나타내는 단일 부동 값입니다. – Luke

+0

"무한대로 회전하고 싶습니다." – Vinzzz

1

손에 상세한 예제.

손가락을 들어 올렸을 때의 속도가 있다면 힘들지 않아야합니다. 속도는 초당 픽셀 수 또는 이와 비슷한 값입니다. 먼저 선형 속도를 각속도로 변환해야합니다. 이것은 원의 둘레를 알고 2*PI*radius을 수행 한 다음 2*PI/perimeter*velocity을 실행하여 각속도를 초당 라디안 단위로 구할 수 있습니다.

바퀴가 축에 어떤 마찰도주지 않으면 그 속도로 영원히 달릴 것입니다. 자,이 마찰에 대한 값을 중재 할 수 있습니다. 가속도는 각 가속도에 대해 초당 픽셀 수 또는 초당 라디안으로 표현할 수 있습니다. 그러면 각도 가속도로 각속도를 나누는 것만 큼 멈출 때까지 시간을 얻습니다.

애니메이션 시간을 사용하면 방정식 finalAngle = initialAngle + angularSpeed*animationTime - angularAcceleration/2*animationTime*animationTime을 사용하여 애니메이션이 끝날 때 휠의 최종 각도를 얻을 수 있습니다. 그런 다음 변환에 대한 애니메이션을 작성한 다음 해당 각도만큼 회전하여 애니메이션이 원활해질 것이라고 말하십시오.

충분히 현실적이어야합니다. 그렇지 않다면 위에 나온 수식의 일부 샘플을 기반으로 휠의 회전 속성에 대한 애니메이션 경로를 제공해야합니다.