3D فليكس ، تدور حول نقطة عشوائية على حاوية (مع جزئية الحل!)

StackOverflow https://stackoverflow.com/questions/627087

سؤال

أنا أحاول العثور على أفضل طريقة لتدوير حاوية (أو أي شيء في هذا الشأن) باستخدام matrix3D الميزات في فلاش 10 المرن.

لقد تمكنت من الحصول على حاوية تدور حول النقطة التي ليس لها نقطة تسجيل لقد تمكنت فقط هذا عن طريق إيقاف لقطة في وعاء ثم وضع محتويات مكان آخر غير (0,0,0).هذا لا العمل ، ولكنها ليست بديهية جدا و مقرف عندما تحاول أن تضع عدة بنود أو حتى إذا كنت بحاجة إلى التحرك دوران نقطة.

باستخدام matrix3D الطبقة يبدو أن يكون وسيلة للذهاب, ولكن لست متأكدا بالضبط كيف.

هتافات

معلومات إضافية - إذا الحاوية على (0,0,0) على المسرح وأتمنى أن تدور حول منتصف X coord الحاوية ثم ترجمة من خلال الحاوية.عرض/2 X ثم تدوير ترجمة مرة أخرى.هذا يعمل بشكل جيد.ولكن إذا الحاوية يقول في (10, 0, 0) ثم إن ترجمة نفسه على النحو الوارد أعلاه وإضافة إضافية 10 ثم لا يعمل.

Soloution (الذي هو الكامل من القمامة - يرجى توضيح ما إذا كان يمكنك) كما اقترحت تحتاج إلى ترجمة ، تدوير ، ثم -traslate.كنت أعرف هذا لكن ذلك لم يفلح.
ولكن انظر soloution أدناه ، أنا لا تحصل عليه.(الفريق هو كائن أنا الدورية ، أدعو وظيفة على حد سواء() )

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

حسنا, سيكون الحل -

1 - إنشاء الخاصة بك مع عنصر فار الأصلي X ، Y ، Z و عرض و ارتفاع.هذه سوف تستخدم convenence لإنقاذ إضافية مصفوفة العمليات.E. G تمديد فئة مربع فقط إضافة تلك فار إلى فئة جديدة.

2 - إضافة عنصر إلى التطبيق ، شيء مثل أدناه.(إن الاصليه القيم لأن الفعلية x,y,z على تغيير أثناء دوران ولكن تحتاج إلى الاصليه القيم لحساب دوران الصحيح.

<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 & y (تقديم الخاص بك ليس من الصعب ترميز جميع القيم)

نصائح أخرى

دوران المصفوفات دائما تدور حول الأصل.

دوران جسم حول نقطة التعسفي P وعادة ما يتطلب:

  1. ترجمة الكائن -P
  2. دوران الكائن كما هو مطلوب
  3. ترجمة الكائن P

هل تعتبر ببساطة تحريك محور ناقل ?

var matrix:Matrix3d = new Matrix3d();
matrix.appendRotation(degrees, axis, new Vector3d(container.width/2,container.height/2,0));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top