PDA

Просмотр полной версии : поворот вектора на заданный угол


ВАРАН
23.03.2009, 17:25
У меня есть такая функция для поворота точек вокруг оси Y:

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 у моего объекта.

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
Я пробовал вот так. Но явно чето не то в плане трегонометрии. И при обратном вращении артефактоф много:

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 минут
Поворот точек на заданный угол.
вот как получилось:

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);
}