1

基礎となるlayerを持つビューがあり、 CATransformLayerをビューのレイヤーに追加します。

[view.layer addSublayer:transformLayer];

追加したレイヤーには、いくつかの 3 次元ブロックの個々の面を表すあらゆる種類のサブレイヤーが含まれています。レイヤーにアニメーションを適用してブロックを回転させたいと思います。

CATransform3D rotation = CATransform3DMakeRotation(deg * M_PI / 180, x, y, z);
[CATransaction begin];

    [(CATransformLayer *)[pView.layer.sublayers objectAtIndex:0] setSublayerTransform:rotation];
        or (both seem to produce the same result)
    [(CATransformLayer *)[pView.layer.sublayers objectAtIndex:0] setTransform:rotation];

[CATransaction commit];

問題は、レイヤーが立方体の中心ではなく、前面の角を中心に大まかに回転していることです (以下の例を参照)。

                    / \                  / \        
   / \            / \ / \              / \ / \      
 / \ / \         |\ / \ /|            |\ / \ /|     
|\ / \ /|        | |\ /| |            | |\ /| |     
| |\ /| |         \| | |/ \    OR    / \| | |/      
|\| | |/|  ==>      \|/ \ / \      / \ / \|/        
|1|\|/|B|            |\ / \ /|    |\ /   /|         
 \|2|A|/             |A|\ /| |    | |\ /|2|         
   \|/                \|B| |/      \| |1|/          
                        \|/          \|/            

回転方向に応じて、A/B ラベルが 1/2 の位置に移動するか、1/2 が A/B に移動する必要があります。代わりに、最初の図から変化し、手前の角を中心に大まかに回転し、他の図に近いものになります。上部のラベルのないブロックは別のビューにあり、静的であるため、回転の一部ではありません。下のラベルの付いたブロックは、アニメーション化しようとしているビュー/レイヤーにあります。

希望する結果を得るために回転の中心を変更するにはどうすればよいですか?

さまざまなレイヤーのanchorPointzPositionanchorPointZをいじりましたが、成功しませんでした。setSublayerTransformsetTransformも試しました。

私が求めているものを達成するために、ブロック側のサブレイヤー、変換レイヤー、ビューレイヤー、またはビュー自体の設定をいじる必要がありますか?

ガイダンスや指示をいただければ幸いです。

4

1 に答える 1

0

アップデート:

私はついに実現し、Core Animationを使用してこれを行うことができないという事実を受け入れました。

この問題を解決するためにOpenGLを使用する道をたどりました。


この問題は、私が少しずつ改善を重ねるにつれて徐々に進化してきましたが、最終的には、親レイヤーを3D 視点を保持するCATransformLayerにし、それを回転させる必要があります。

回転の中心まで、CATransform3DMakeTranslationを使用してレイヤーの位置を変更します。

于 2012-06-08T15:26:10.803 に答える