2013-05-09 3 views
0

슬라이더를 사용하여 뷰 중심에서 이미지를 회전하려고합니다. 하나는 x, y 및 Z 평면에 사용됩니다. 이미지가 프레임 된 경계 (700X700) 안에서 회전하고 싶지만 프레임의 가장자리를 중심으로 어떤 이유로 회전합니다. 앵커 포인트를 다시 설정하려고했지만 아무 것도하지 않는 것 같습니다. Y 축 주위로 회전시키는 코드는 다음과 같습니다. 앵커 포인트 섹션이 주석 처리되었음을 알 수 있습니다. 전혀 영향을 미치지 않았습니다. 내가 뭘 잘못하고 있는지 알 겠어?왜 내 이미지 레이어가 이미지 가장자리가 아닌 중심을 중심으로 회전합니까?

 float angleYDeg = self.ySlider.value; 
    float angleYRad = (angleYDeg/180.0) * M_PI; 

    // Disable Animation 
    [CATransaction begin]; 
    [CATransaction setValue:[NSNumber numberWithBool:YES] 
        forKey:kCATransactionDisableActions]; 

// Get Layers 
    CALayer *containerLayer = [[self.imageView.layer sublayers] objectAtIndex:0]; 
    CALayer *holder = [containerLayer valueForKey:@"__holderLayer"]; 

    //CGPoint anchor = holder.anchorPoint; 
    //anchor.y = self.imageView.frame.size.height/2; 
    //holder.anchorPoint = anchor; 

    // Update xAngle Value 
    [containerLayer setValue:[NSNumber numberWithFloat:angleYRad] forKey:@"__angleY"]; 

    // Apply rotations 
    CGFloat angleX = [[containerLayer valueForKey:@"__angleX"]floatValue]; 
    CATransform3D holderTransform = CATransform3DMakeRotation(angleX, 1.0f, 0.0f, 0.0f); 
    holderTransform = CATransform3DRotate(holderTransform, angleYRad, 0.0f, 1.0f, 0.0f); 
    holder.transform = holderTransform; 

    [CATransaction commit]; 

    // Update Label 
    self.yValueLabel.text = [NSString stringWithFormat:@"%4.0fº", angleYDeg]; 

답변

0

코드에서 어디서 잘못 될지 알 수 없으므로 정확한 질문에 대한 답을 모르겠습니다. 기본적으로 사물은 중심을 중심으로 회전해야합니다. UISlider를 사용하여 모든 축에 대한 회전을 변경하는 방법을 보여주는 데모 응용 프로그램을 작성했습니다. 나는 그것을 github에 게시했습니다 : https://github.com/perlmunger/AllAxis.git. 여기하지만, 코드의 요지입니다 :

- (IBAction)sliderDidChange:(id)sender 
{ 
    [self setTransforms]; 
} 

- (void)setTransforms 
{ 
    CGFloat x = [_xSlider value]; 
    CGFloat y = [_ySlider value]; 
    CGFloat z = [_zSlider value]; 

    CATransform3D transform = CATransform3DIdentity; 
    transform.m34 = 1.0f/-800.0f; // perspective 

    CGFloat rotationValue = x * kRotationMaxInDegrees; 

    transform = CATransform3DRotate(transform, 
        degreesToRadians(rotationValue), 1.0f, 0.0f, 0.0f); 

    rotationValue = y * kRotationMaxInDegrees; 

    transform = CATransform3DRotate(transform, 
        degreesToRadians(rotationValue), 0.0f, 1.0f, 0.0f); 

    rotationValue = z * kRotationMaxInDegrees; 

    transform = CATransform3DRotate(transform, 
        degreesToRadians(rotationValue), 0.0f, 0.0f, 1.0f); 

    [[_rotationView layer] setTransform:transform]; 

} 

이 코드는 축적 집단은 어떤 슬라이더 각 변경에 뷰의 레이어에 적용하는 것이 변환.

+0

이것은 완벽합니다. 정확히 내가 찾고 있던 것이 었습니다! 매트 감사합니다! – marina

0

연속 변환을 수행하면 종종 오류가 발생할 수 있습니다. angleX를 변형하면 AngleY ​​변형이 새 좌표계를 기반으로 실행됩니다. 기본적으로 모든 변환은 "모델"또는 객체와 관련하여 수행됩니다.

일반적으로 대부분의 사람들은 카메라 시스템을 기준으로 또는 카메라를 기준으로 변환을 수행 할 것으로 예상합니다. 당신이 원하는 결과이 같은 변환의 순서 반전에 의해 얻을 수려고하고있다 그것의 가능성 : 당신이 LIFO 시스템으로 생각하면

// Apply rotations 
CGFloat angleX = [[containerLayer valueForKey:@"__angleX"]floatValue]; 
CATransform3D holderTransform = CATransform3DMakeRotation(angleYRad, 0.0f, 1.0f, 0.0f); 
holderTransform = CATransform3DRotate(holderTransform, angleX, 1.0f, 0.0f, 0.0f); 
holder.transform = holderTransform; 

[CATransaction commit]; 

그것은 도움이 될 수를 (비록이 아니!) 당신이있는 경우 모델의 좌표 대신 카메라 좌표를 기반으로 모든 움직임을 고려합니다.

+0

불행히도 다른 어떤 제안도하지 않았습니다 ... 다른 제안 사항이 있습니까? – marina

+0

사실, 전 완전히 잘못 생각하고 있는지 궁금합니다. 내 이미지가 제 위치에서 회전하고 회전에 의해 만들어진 cicrle의 직경이 이미지의 너비가되어야합니다. 여기서 일어나는 일은 가장자리 주위를 돌면서 원의 직경을 만들어 이미지의 너비를 두 배로 만드는 것입니다. 그냥 다른 위치에서 회전 시키려면 다른 종류의 애니메이션을 사용해야합니까? – marina

+0

질문을 자세히 살펴보면 (앵커 포인트가 3D 변환에 영향을주지 않습니다. 동작 중심은 항상 0,0,0입니다. 따라서 주위를 회전해야하는 지점을 중심으로 회전하지 않는 경우 변환 변환을 수행하여 회전하려는 점을 모델의 좌표계 가운데로 이동해야합니다. 그래서 번역하고 회전 한 다음 원하는 곳으로 번역하십시오. 그것들은 다른 지점을 중심으로 회전하게하는 단계입니다. – HalR