Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   поворот вектора на заданный угол (http://www.flasher.ru/forum/showthread.php?t=123035)

ВАРАН 23.03.2009 17:25

поворот вектора на заданный угол
 
У меня есть такая функция для поворота точек вокруг оси Y:

Код AS1/AS2:

rotateY = function (targed, degree):Void {
        var newAngle:Number = degree*rad;
        var sin = Math.sin(newAngle);
        var cos = Math.cos(newAngle);
        for (var i = 0; i<4; i++) {
                var x = cos*targed.vertex[i].x-sin*targed.vertex[i].z;
                var z = cos*targed.vertex[i].z+sin*targed.vertex[i].x;
                targed.vertex[i].z = z;
                targed.vertex[i].x = x;
        }
};

У меня есть функция которая плавно меняет параметр Angle у моего объекта.

Код AS1/AS2:

var myTween:Tween = new Tween(rektangl, "Angle", Strong.easeOut, 90, 0, 3, true);
        myTween.onMotionChanged = function() {
                rotateY(rektangl,rektangl.Angle);
                render(rektangl);
        };

Но эффект получается не тот. Объект начинает вращаться как сумашедший пока Angle не будет равным 0. Получается что параметр degree работает скорее как скорость вращения чем как угол. Что нужно изменить в функции rotateY чтобы параметр degree менял угол не относительно а абсолютно?

silin 23.03.2009 20:10

такая функция поворота не годится для твина угла, она никак не связана с абсолютным углом, а только поворачивает на заданный угол

зная на сколько надо повернуть можно в цикле (onEnterFrame|setInterval) вызвать ее нужное количество раз с постоянным значением поворота

ВАРАН 26.03.2009 22:46

Я пробовал вот так. Но явно чето не то в плане трегонометрии. И при обратном вращении артефактоф много:

Код AS1/AS2:

function rotateYto(targed, a) {
 
        var newAngle:Number = a*rad;
        var sin = Math.sin(newAngle);
        var cos = Math.cos(newAngle);
        var x = targed.vertex[0].x;
        var z = targed.vertex[0].z;
        var R = Math.sqrt(x*x+z*z);
        var _b = a*rad;
        for (var i = 0; i<4; i++) {
                x = Math.cos(_b)*R;
                z = Math.sqrt(R*R-x*x);
                if (targed.vertex[i].x<0) {
                        x = 0-x;
                        z = 0-z;
                }
                targed.vertex[i].z = z;
                targed.vertex[i].x = x;
        }
 
        render(rektangl);
}

:confused:

Добавлено через 65 часов 58 минут
Поворот точек на заданный угол.
вот как получилось:

Код AS1/AS2:

function rotateYto(targed, a) {
        var R = targed.Width/2;
        var _b = a*rad;
 
        for (var i = 0; i<4; i++) {
                x = Math.cos(_b)*R;
                z = Math.sin(_b)*R;
                if (targed.vertex[i].x<0) {
                        x = 0-x;
                        z = 0-z;
                }
                targed.vertex[i].z = z;
                targed.vertex[i].x = x;
        }
        render(rektangl);
}



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

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