CATransform3D変換を使用して、疑似3D遠近効果をビューに適用しています。
私はiPhone4のジャイロスコープを使用して、変換のパラメーターを制御しています。
私が変換しているビューには、いくつかのサブビューがあります。
結果は次のようになります。
次のタスクは、メインビューが変換されるときにサブビューが変換されないようにするか、サブビューが影響を受けないように逆変換を適用することです。
私の目的は、各サブビューをスーパービューに対して垂直にして、「立っている」という印象を与えることです。
変換に使用しているコード:
- (void)update:(NSTimer *)timer
{
roll = [[[_manager deviceMotion] attitude] roll];
pitch = [[[_manager deviceMotion] attitude] pitch];
yaw = [[[_manager deviceMotion] attitude] yaw];
CALayer *layer = [self.view layer];
CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity;
rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, -90 * M_PI / 180.0f, 0.0f, 0.0f, 1.0f); // make landscape again
rotationAndPerspectiveTransform.m34 = 1.0 / -500; // apply the perspective
rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, roll, 1.0f, 0.0f, 0.0f);
rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, yaw, 0.0f, 0.0f, 1.0f);
[layer setTransform:rotationAndPerspectiveTransform];
}
Y軸の周りのサブビューに90度の遠近法の回転を適用することにより、変換を反転させるために次のコードを試しました。
for (UIView *subview in [self.view subviews])
{
CALayer *sublayer = [subview layer];
//CATransform3D inverseTransformation = [sublayer transform];
CATransform3D inverseTransformation = CATransform3DIdentity;
rotationAndPerspectiveTransform.m34 = 1.0 / -500; // apply perspective
inverseTransformation = CATransform3DRotate(inverseTransformation, 90 * M_PI / 180.0f, 0.0f, 1.0f, 0.0f);
[sublayer setTransform:inverseTransformation];
}
しかし、これが成功するのは、サブビューを非表示にすることだけです。レイヤーからの既存の変換を使用し[sublayer transform]
て3D回転を適用しようとすると、サブビューがちらつきますが、回転しません。
行列の数学についての私の知識はあまりよくないので、これが正しいアプローチであるかどうかはわかりません。
サブビューをスーパービューに対して垂直に配置するにはどうすればよいですか?