2

NSView をその中心を中心に回転させ、結果を確認しました。

[_cocoaView setFrameCenterRotation:-_rotationX];

ここに画像の説明を入力 ここに画像の説明を入力

フレームの原点を変更して NSView を配置し、ビューが (この場合は) Box2D 本体の中心に位置合わせされるようにします。繰り返しますが、結果は期待どおりです。

CGRect frame = _cocoaView.frame;
frame.origin = CGPointMake(_position.x - frame.size.width * 0.5f, 
                           _position.y - frame.size.height * 0.5f);
_cocoaView.frame = frame;

ここに画像の説明を入力

ただし、並進と回転の両方を組み合わせると、回転の中心はビューの中心ではなく、別のポイントになります。回転の結果、フレームのサイズと原点が変化し、それによってフレームの中心点が移動すると思います。その結果、回転角度が 0 でない限り、ビューと Box2D 本体が整列しなくなります。

ここに画像の説明を入力

何故ですか?また、ビューを特定の場所に移動し、ビューをその中心を中心に回転させるにはどうすればよいですか?

PS:既に機能している iOS バージョンのアフィン変換を、レイヤーでサポートされた NSView に適用しようとした以前の試みは失敗しました。だから私は変換を使わずにそれを試しましたが、悲しいかな、また行き詰まっています。レイヤーとトランスフォームでそれを機能させる方法を知っていれば、それも私を助けてくれます。

4

1 に答える 1

2

解決策は 2 つでした。間違った回転を修正するには、最初に回転を 0 に設定し、原点を移動してから、実際の回転を適用する必要があります。

ただし、これにより、ビューの回転および移動中に多くのちらつきが発生しました。ランダムに、そして非常に頻繁に、ビューが別の位置にジャンプしたり、誤って回転したり、途切れたりすることがありました。その問題の解決策は、移動と回転のコードを lockFocus と unlockFocus 呼び出し内に囲むことでした。

これが私のために働いた解決策です:

    [_cocoaView lockFocusIfCanDraw];
    [_cocoaView setFrameCenterRotation:0];

    CGSize frameSize = _cocoaView.frame.size;
    CGPoint origin = CGPointMake(_position.x - frameSize.width * 0.5f, _position.y - frameSize.height * 0.5f);
    [_cocoaView setFrameOrigin:origin];

    [_cocoaView setFrameCenterRotation:-_rotationX];
    [_cocoaView unlockFocus];

唯一の欠点: ビューは Box2D 本体よりも少し遅れているように見えることがあります。ほとんど目立たないので、完璧ではありませんが、今のところ十分です。

于 2013-04-18T05:40:21.723 に答える