Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   вращение в 3-мерном пространстве (http://www.flasher.ru/forum/showthread.php?t=138029)

sweetPepper 28.03.2010 19:44

вращение в 3-мерном пространстве
 
Вложений: 1
У меня проблемка с вращением куба. При rotationY кратному 90 rotationX начинает вести себя как rotationZ.

silin 28.03.2010 22:07

так и должно быть: rotationX/Y/Z это углы в собственной системе координат объекта, rotationX им же и остается для самого куба, но поскольку он сам повернут, то в родителе это выглядит иначе..
поворот относительно координат родителя можно реализовать за счет редактирования transform.matrix3D, типа такого
Код AS3:

public function rotateXY(angleX:Number, angleY:Number=0):void
{
        var mtrx:Matrix3D = transform.matrix3D ;
        var pos:Vector3D = mtrx.position;
 
        //двигаем в начало координат
        mtrx.appendTranslation( -pos.x, -pos.y, -pos.z);
        //вращаем
        mtrx.appendRotation(angleX, Vector3D.X_AXIS)
        mtrx.appendRotation(angleY, Vector3D.Y_AXIS)
        //двигаем назад
        mtrx.appendTranslation( pos.x, pos.y, pos.z);
 
}


sweetPepper 29.03.2010 03:45

Честно говоря, не совсем понял о чем речь.
Почему система координат изменяется только для rotationX и только при изменении rotationY? Все остальные вариациии ни к чему не приводят....
Как вышеописанную ф-ю применить для поворота куба?

silin 29.03.2010 19:12

>>Почему система координат изменяется только для rotationX и только при изменении rotationY?
связка только rotationX - только при изменении rotationY - это скорее всего твой частный случай: система координат по-любому вращается вместе с объектом, со всеми вытекающими.., присмотрись поплотнее - нет никакой исключительности в rotationX-rotationY

>>Как вышеописанную ф-ю применить для поворота куба?
применить те же самые манипуляции к transform.matrix3D этого куба
мой пример 'от первого лица', т.е. как бы метод самого куба

глянь http://silin.su/#AS3/zod , там есть примеров всякого вращения

sweetPepper 30.03.2010 02:50

transform.matrix3D==null

silin 30.03.2010 12:30

все правильно, transform.matrix3D не определена до тех пор пока не задашь хоть какое из '3D-шных' свойств,
z=0, например, достаточно

greegreeman 30.03.2010 14:54

раз уж тут обсуждается 3D вращение, то подскажите, плиз, похожий ли это пример: http://www.shimanoservicecentre.co.uk/
я имею ввиду на куб, который в теме обсуждался. и может есть разбор где-то у кого-то в блоге как делаются подобные штуки, а то с моим опытом не знаю как к ней подступиться

silin 30.03.2010 20:13

не, непохожий..
в этом примере 3Д ни причем вовсе
подступиться очень просто: позиция и масштаб иконок - функция некоторого угла, зависящего от положения мыши, все тривиально считается через sin-cos

sweetPepper 30.03.2010 23:23

spasibo, сiлiн))

gen4 09.06.2010 12:56

Silin, спасибо, смотрю примеры

Добавлено через 2 часа 7 минут
Не смог разобраться. Твой пример, silin, мне кажется о центре вращения, но не об ориентации осей, нет? Почему у тебя это работает ?))

вот, что делаю я:
Код AS3:

 
                function onLoop(evt:Event=null):void {
 
                        // беру положение мыши
                        dx += (mouseX - dx) / 4;
                        dy += (mouseY - dy) / 4;
 
                      // теперь от 0 до пи*2
                        var b =  dx / 550 * Math.PI * 2
                        var a =  dy / 400 * Math.PI * 2
 
                        // обнуляем заранее определенную матрицу
                        m.identity();
 
                      //крутим
 
                                m.appendRotation(dx, Vector3D.X_AXIS)
                                m.appendRotation(dy, Vector3D.Y_AXIS)
 
                        //каждому вектору (ранее объявленному) применяем вращение
                        for (var i = 0; i < points3D.length; i++ ) {
                                a = m.transformVector( points3D[i]);
 
                                parts[i].x = a.x*111+222;
                                parts[i].y = a.y*111+222;
                                parts[i].z0 = a.z * 100;
                                parts[i].fader.alpha = .7-a.z
                        }
 
                      //сортируем по зэду
                        parts.sort(sortOn);
                        for (i in parts) {
                                setChildIndex(parts[i], i);
                        }
                }

Так вот, оси всей конструкции смещаются вместе с ней же.
оок.

пробую recompose с объявлением вращения - те же яйца.

Вопрос - как быть, и что делать?
Все что описано до этого меня не уразумило, увы.

silin 09.06.2010 15:24

>>Так вот, оси всей конструкции смещаются вместе с ней же.
поэтому перед appendRotation двигаем объект (appendTranslation) в начало координат родителя и ставим на место после вращения (см. мой первый пост)

что делаешь ты я не понял

gen4 09.06.2010 16:38

у меня есть кучка векторов (читай 3д-точек), они, как бы, по умолчанию в начале координат. Я делаю матрицу преобразований и применяю последовательно к каждому вектору.

И потом, от того, что ты передвинешь объект, положение осей не должно же меняться?

такое впечатление, что твоя история про пивот, нет?

silin 09.06.2010 18:09

моя история про pivot, все верно
про что твоя, я так и не понял..
т.е. ты получил новые координаты каждой точки (m.transformVector( points3D[i]);),
а затем зачем-то взял их и развел в соответствии с какими-то еще соображениями (parts[i].x = a.x*111+222; ), все развалилось..

если задача только вращать весь массив, то не проще будет не обнулять матрицу, а добавлять (appendRotation) нужные углы и из текущей получать новые координаты точек (m.transformVector)

Добавлено через 6 минут
да, еще есть смысл пощупать разницу prependRotation vs appendRotation..
я не возьмусь сейчас ее объяснять, потому как сам не вполне въехал, сори

gen4 09.06.2010 18:15

моя история про то, что после одного вращения вместе с объектом поворачиваются его оси (не меняя позиции), а следовательно следущее вращение(которое предпологается сделать по мировым осям находящимся в той же точке) уже не будут ожидаемыми.

словом ты прав, задача - вращать массив векторов.
так как ведет куб в твоем примере в simple в 3D - то что нужно.

на эту часть не смотри
Код AS3:

parts[i].x = a.x*111+222;

это просто отображение векторов, и там все хорошо)

добавлять можно, но во-первых, это не удобно для меня (хочу чтобы массив "следил" за мышью - усложняется вычесления сильно), а во-вторых, это уже у меня с ними личное ))


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

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