2012-06-25 4 views
2

CATransform3D을 통해 달성되는 관점에 대해 질문하고 싶습니다. 난 당신이 320 × 480 인 전망을하고있는 경우 다음이 적용 것을 알고 :항상 화면에 상대적인 퍼스펙티브 적용

CATransform3D perspective = CATransform3DIdentity; 
    CGFloat zDistance = 1000; 
    perspective.m34 = 1.0/-zDistance; 
    view.layer.sublayerTransform = perspective; 

당신이 관찰자가 화면의 중앙에 똑바로보고 따라서 같은 변화의 모습처럼 보이게 관점을 만들 변형 된 하위 뷰가 화면에있는 위치에 따라 다릅니다.

그리고 그것은 왼쪽 아래에 있다면 그것은 다음과 같습니다 :

뷰가 화면의 중앙에있을 때 예를 들어,보기를 기울은 다음과 같습니다

자, 내 문제는 내가 변환하는보기가 320x480px 큰 다른보기의 하위보기 인 경우에만 화면에 상대적인 관점을 만드는 것이 작동한다는 것입니다. 그러나 변환하려는 뷰가 100x100px 뷰의 하위 뷰일 경우 어떻게해야합니까? 슈퍼 뷰가 화면의 크기가 아닌 경우 전체 화면과 관련된 퍼스펙티브를 만드는 방법이 있습니까? apple

따라 미리

답변

0

에 감사합니다 "가 anchorPoint 속성은 위치 좌표에 대응하는 층의 경계 내에 위치를 지정하는 CGPoint이다. 기준점은 경계가에 대해 위치되는 방식을 지정 위치 속성뿐만 아니라 변형이 주변에 적용되는 지점 역할을합니다. "

원근감이 화면 중앙이나 레이어 중심에서 벗어나서는 안됩니다. 앵커 포인트는 기본적으로 어디에 있습니까? 그것 이외에도, 당신이 묻고있는 것처럼 보이는 것은 당신의 관점을 다른 점에 비례하는 것처럼 보이게 만드는 방법입니다. 트릭은 원근감 매트릭스를 곱하여 원근감을 얻는 것입니다. m34를 작은 숫자로 설정하면 마술이 생기지 않습니다. 투영 행렬을 곱합니다.

YourProjection = {1,0,0    ,0, 
        0,1,0    ,0, 
        0,0,1    ,0, 
        0,0,-1.0/zdistance,1}; 

연속 된 변환을 함께 곱하여 조합 할 수 있습니다. 원하는 곳으로 레이어를 변형 한 다음 투영 행렬을 적용한 다음 다른 원점의 원근감을 다시 되돌려 변환하십시오.

float x = your coordinates relative to the screen center; 
float y = same thing 
TranslationMatrix = {1,0,0,0, 
        0,1,0,0, 
        0,0,1,0, 
        x,y,0,1}; 
ReverseTranslationMatrix = {1,0,0,0, 
          0,1,0,0, 
          0,0,1,0, 
          -x,-y,0,1}; 
//now just multiply them all together 
Final = ReverseTranslation*YourProjection*Translation; 

당신은하지 난 당신이 일을 제안하는 경우 잘하면 당신은 이미 당신을 위해 곱셈을 할 수있는 일반적인 4 × 4 열 주요 매트릭스 클래스가, 매트릭스 수학 자신을 수행해야합니다. 또한 관심이 있다면 독서를 고려해보십시오. This 현재 사용중인 행렬이 어떻게 작동하는지에 대한 설명은 This 다른 투영 행렬에 대한 설명을 참조하십시오.

관련 문제