3Dフレックス、コンテナのランダムポイントを中心に回転(部分的な解決策あり!)
-
06-07-2019 - |
質問
Flash 10 for flexのmatrix3D機能を使用して、コンテナ(またはそのことは何でも)を回転させる最適な方法を見つけようとしています。
登録ポイントではないポイントを中心にコンテナを回転させることができましたが、コンテナのクリッピングをオフにして、コンテンツを(0,0、 0)。これは機能しますが、非常に直感的ではなく、複数のアイテムを配置しようとしたり、回転ポイントを移動する必要がある場合でも面倒です。
matrix3Dクラスを使用するのが方法のようですが、正確にどのように動作するのかわかりません。
乾杯
追加情報- コンテナがステージ上の(0,0,0)にあり、コンテナの中央のX座標を中心に回転したい場合、container.width / 2によってXを平行移動し、回転して再び平行移動します。これは正常に機能します。 しかし、私のコンテナが(10、0、0)にある場合、上記と同じように翻訳し、10を追加すると動作しません。
Soloution(完全なゴミです-可能であれば説明してください)
提案されているように、翻訳、回転、そして-traslateが必要です。これは知っていましたが、うまくいきませんでした。
しかし、下のsoloutionを参照してください、私はそれを取得しません。 (パネルは回転しているオブジェクトで、関数both()を呼び出します)
private function rotateOnly() : void {
panel.transform.matrix3D.appendRotation(36, Vector3D.Y_AXIS);
}
private var valueToMove : Number = 300;
private var translateUpOrDown : Boolean = false;
private function translateOnly() : void {
if(translateUpOrDown){
panel.transform.matrix3D.appendTranslation(valueToMove, 0, 0);
translateUpOrDown = false;
} else {
panel.transform.matrix3D.appendTranslation(-valueToMove, -0,0);
translateUpOrDown = true;
}
}
//I do not run both chunks of code here at once, this is only to show what I've tried
private function both() : void {
//IF I call this function and call this chunk then the rotation works
translateOnly();
rotateOnly();
translateOnly();
//If I call this chunk which does the exact same as the above it does NOT work!!
panel.transform.matrix3D.appendTranslation(valueToMove, 0,0);
panel.transform.matrix3D.appendRotation(36, Vector3D.Y_AXIS);
panel.transform.matrix3D.appendTranslation(-valueToMove, 0,0);
}
解決 2
OK、解決策は-
1-元のX、Y、Zおよび幅と高さの変数を使用して独自のコンポーネントを作成します。これらは、余分な行列演算を節約するために便利に使用されます。 E.GはBoxクラスを拡張し、それらの変数を新しいクラスに追加するだけです。
2-次のようなアプリにコンポーネントを追加します。 (orig値は、回転中に実際のx、y、zなどが変化するためですが、正しい回転を計算するには値をorigする必要があります。
<local:RotationContainer
id="movingBox"
width="50"
origWidth="50"
height="60"
origHeight="60"
x="80"
origX="80"
y="70"
origY="70"
z="0"
origZ="0"
enterFrame="rotateObject(event)"
/>
3-回転するときに次のコードを使用し、上記のenterFrameイベントを呼び出します
private var translateUpOrDown : Boolean = false;
private function translateOnly(obj : Object, valueToMoveX : Number, valueToMoveY : Number) : void {
if(translateUpOrDown){
obj.transform.matrix3D.appendTranslation(valueToMoveX, valueToMoveY, 0);
translateUpOrDown = false;
} else {
obj.transform.matrix3D.appendTranslation(-valueToMoveX, -valueToMoveY, 0);
translateUpOrDown = true;
}
}
private function rotateOnly(obj : Object) : void {
obj.transform.matrix3D.appendRotation(rotationAmount, Vector3D.Y_AXIS);
}
private function rotateObject(event : Event) : void {
var offsetX : Number = (event.currentTarget.origWidth / 2) + event.currentTarget.origX;
var offsetY : Number = (event.currentTarget.origHeight / 2) + event.currentTarget.origY;
translateOnly(event.currentTarget, offsetX, offsetY);
rotateOnly(event.currentTarget);
translateOnly(event.currentTarget, offsetX, offsetY);
}
4-それだけです。これは、Y軸上の中心点を中心に回転します。さまざまな回転点のオフセット値を変更します。
更新 指摘したように、呼び出しを別の関数に移動する必要はありませんが、元の幅、高さ、x&amp;に到達できるように上記を使用する必要があります。 y(すべての値をハードコーディングしないでください)
他のヒント
回転行列は常に原点を中心に回転します。
任意のポイント P
の周りのオブジェクトの回転には、通常次が必要です。
-
-P
によるオブジェクトの翻訳
- 必要に応じたオブジェクトの回転
-
P
によるオブジェクトの翻訳
ピボットベクトルを単に移動することを検討しましたか?
var matrix:Matrix3d = new Matrix3d();
matrix.appendRotation(degrees, axis, new Vector3d(container.width/2,container.height/2,0));