Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Matrix3D как использовать в appendRotation параметр pivotPoint (http://www.flasher.ru/forum/showthread.php?t=121531)

Alex Lexcuk 17.02.2009 21:47

Matrix3D как использовать в appendRotation параметр pivotPoint
 
Нужно кое-что крутануть, но не относительно 0, а относительно pivotPoint в Хелпе сказано
Код:

appendRotation(degrees:Number, axis:Vector3D, pivotPoint:Vector3D = null):void
Appends an incremental rotation to a Matrix3D object.

Думал как его вообще использовать, но как-то так
Код:

package {
        import flash.geom.*;
        import __AS3__.vec.*;
        import flash.display.*;
        import flash.events.*;
       
        public class Main extends MovieClip {
                private var pointS:Vector.<Vector3D>,
                        mat3D:Matrix3D,
                        myPivotPoint:Vector3D,
                        i:int;
                public function Main() {
                        x = 200;
                        y = 200;
                        pointS = new Vector.<Vector3D>();
                        pointS[0] = new Vector3D( 0,  0,  0);
                        pointS[1] = new Vector3D( 100, 0,  0);
                        pointS[2] = new Vector3D( 100, 100, 0);
                        pointS[3] = new Vector3D( 0,  100, 0);
                        mat3D = new Matrix3D();
                        myPivotPoint = new Vector3D( 50, 50, 50);
                        mat3D.appendRotation(1, Vector3D.Z_AXIS,myPivotPoint);
                        addEventListener(Event.ENTER_FRAME, enterFrameFunc);
                }
                private function enterFrameFunc(evt:Event):void {
                        setGr();
                        for (i = 0; i < 4; i++) {
                                pointS[i]=mat3D.deltaTransformVector(pointS[i]);
                                showPoint(pointS[i]);
                        }
                }
                private function showPoint(_v:Vector3D):void {
                        graphics.drawCircle(_v.x, _v.y, 5);
                }
                private function setGr():void {
                        graphics.clear();
                        graphics.beginFill(0);
                }
        }
}

Однако точки вертятся относительно 0, а надо относительно myPivotPoint, как же заюзать myPivotPoint?

flash33 17.02.2009 23:19

А вы перспективную проекцию задействовали для объекта трансформации?

Alex Lexcuk 18.02.2009 00:04

>>А вы перспективную проекцию задействовали для объекта трансформации?

Собственно проекция тут меня не очень интерисует

http://murmadillo.tut.su/m/Car3Doc.swf

четвертый кубик должен вращаться относительно своего центра, я локализовал проблему и которая находится в pivotPoint
Я так понял pivotPoint к векторам на самом деле отношения не имеет, а имеет только к sprite и пр. дисплей объектам, там она работет, но метод deltaTransformVector возвращает никуда не применимый Vector3D.
Прийдется опять юзать синусы, косинусы, и Пи, без Пи никуда даже в 10 плеере.

TERRORist 18.02.2009 00:44

странно, у меня все работало с Pivot Point. В моем случае.

Alex Lexcuk 18.02.2009 01:02

Код:

package {
        import flash.geom.*;
        import __AS3__.vec.*;
        import flash.display.*;
        import flash.events.*;
       
        public class Main extends MovieClip {
                private var pointS:Vector.<Vector3D>,
                        mat3D:Matrix3D,
                        myPivotPoint:Vector3D,
                        i:int;
                public function Main() {
                        x = 200;
                        y = 200;
                        pointS = new Vector.<Vector3D>();
                        pointS[0] = new Vector3D( 0,  0,  0);
                        pointS[1] = new Vector3D( 100, 0,  0);
                        pointS[2] = new Vector3D( 100, 100, 0);
                        pointS[3] = new Vector3D( 0,  100, 0);
                        mat3D = new Matrix3D();
                        myPivotPoint = new Vector3D( 50, -50, 0);
                        mat3D.appendRotation(1, new Vector3D(0,0,3),myPivotPoint);
                        addEventListener(Event.ENTER_FRAME, enterFrameFunc);
                }
                private function enterFrameFunc(evt:Event):void {
                        setGr();
                        for (i = 0; i < 4; i++) {
                                pointS[i]=mat3D.transformVector(pointS[i]);
                                showPoint(pointS[i]);
                        }
                }
                private function showPoint(_v:Vector3D):void {
                        graphics.drawCircle(_v.x, _v.y, 5);
                }
                private function setGr():void {
                        graphics.clear();
                        graphics.beginFill(0);
                }
        }
}

После немногочисленных экспериментов pivotPoint заработала, но как-то странно, точки начинают медленно приближаться и квадрат увеличивается в размерах спустя некотрое время.
если поствавить
Код:

mat3D.appendRotation(1, new Vector3D(0,0,2),myPivotPoint);//работает когда 3
myPivotPoint становится до фонаря, улетает в непонятном направлении.

RandomUser 18.02.2009 14:46

Насклько я понял, этот второй параметр - ось, вокруг которой мы будем вращать. И этот вектор должен быть нормализированным.

Alex Lexcuk 19.02.2009 00:59

>>Насклько я понял, этот второй параметр - ось, вокруг которой мы будем вращать. И этот вектор должен быть нормализированным.

Спасибо, что разъяснили, попробую как-то нормализовать.

TERRORist 19.02.2009 02:01

normalize() 8]

или (0,0,1) вместо (0,0,2)

Alex Lexcuk 19.02.2009 10:55

>>normalize() 8]
Делает из вектора вида ( 12, 100, 128) наподобие такого (0,0.32,0.324234)
Тоесть приравнивает один параметр к 0, и вектор 0,0,3 в нормализации не нуждается, т.к. он и так нормальный.
>>или (0,0,1) вместо (0,0,2)
Пришли к тому с чего начинали т.к. в первом посте Vector3D.Z_AXIS и есть то-же самое что и (0,0,1) - не работает, но раз уж не получается с pivotPoint, то можно сделать коррекцю и все будет работать.
Код:

package {
        import flash.geom.*;
        import __AS3__.vec.*;
        import flash.display.*;
        import flash.events.*;
       
        public class Main extends MovieClip {
                private var pointS:Vector.<Vector3D>,
                        mat3D:Matrix3D,
                        myPivotPoint:Vector3D,
                        xyMoveVec:Vector3D,
                        i:int;
                public function Main() {
                        pointS = new Vector.<Vector3D>();
                        pointS[0] = new Vector3D( 0,  0,  0);
                        pointS[1] = new Vector3D( 100, 0,  0);
                        pointS[2] = new Vector3D( 100, 100, 0);
                        pointS[3] = new Vector3D( 0,  100, 0);

                        mat3D = new Matrix3D();
                        myPivotPoint = new Vector3D( 50, 50, 0);
                        xyMoveVec = new Vector3D( 200, 200, 0);
                        for (i=0;i<4;i++) pointS[i].incrementBy(xyMoveVec);//передвинуть точки объекта
                        myPivotPoint.incrementBy(xyMoveVec);//передвинуть точку ротации
                        mat3D.appendRotation(1, new Vector3D( 0, 0, 1));
                        addEventListener(Event.ENTER_FRAME, enterFrameFunc);
                }
                private function enterFrameFunc(evt:Event):void {
                        setGr();
                        for (i = 0; i < 4; i++) {

                                pointS[i].decrementBy(myPivotPoint);//вычитание векторов

                                pointS[i]=mat3D.transformVector(pointS[i]);

                                pointS[i].incrementBy(myPivotPoint);//сложение векторов
                                showPoint(pointS[i]);
                        }
                }
                private function showPoint(_v:Vector3D):void {
                        graphics.drawCircle(_v.x, _v.y, 5);
                }
                private function setGr():void {
                        graphics.clear();
                        graphics.beginFill(0);
                }
        }
}

Т.е. сначала вычесть нужный myPivotPoint из вращаемой точки, покрутить относительно нуля координат, а затем прибавить опять myPivotPoint.
И точки квадратика вращаются относительно myPivotPoint как было задумано.

PS. может как-то я неправильно понимаю понятие вектор и от этого получаются неправильные результаты вращения, т.к. точки которые я таким образом вращаю, возможно не есть вектора.

RandomUser 19.02.2009 12:19

Пример из хелпа:
"Одним из способов вращения экранного объекта вокруг определенной точки относительно его расположения является настройка перемещения объекта в заданную точку, вращение объекта с использованием метода appendRotation() и обратное перемещение объекта а исходное положение. В следующем примере трехмерный экранный объект myObject осуществляет вращение по оси y вокруг точки с координатами (10,10,0)."
Код AS3:

myObject.z = 1; 
myObject.transform.matrix3D.appendTranslation(10,10,0);
myObject.transform.matrix3D.appendRotation(1, Vector3D.YAXIS);
myObject.transform.matrix3D.appendTranslation(-10,-10,0);



Часовой пояс GMT +4, время: 07:03.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.