Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Вращение 3D-объекта, Five3D (http://www.flasher.ru/forum/showthread.php?t=134285)

enepx 25.12.2009 15:20

Вращение 3D-объекта, Five3D
 
Привет всем, с наступающим 2010 годом. Желаю побольше интересных проектов и побольше отдыхать! :drinks:

Теперь, собственно, вопрос к 3D-математикам:
мне нужно сделать бесконечное вращение объекта, находящегося в позиции (0, 0, 0) вокруг себя в зависимости от положения курсора мыши. Примерно так:
http://flashformer.com/screenshots/2...5-q11-23kb.jpg
(картинка кликабельна, переходит на SWF-ку с примером)

Я использую движок Five3D. Проблема в вычислении значений углов (rotationX, rotationY и rotationZ) у вращаемого объекта (тут - куба). Делаю так:
Код AS3:

        private function onFrame(event:Event):void {
                _body.rotationX +=  _xOffset;
                _body.rotationY += -_yOffset;
        }

Но у меня объект как бы проворачивается и получается, что каждые вторые ПИ (180 градусов) у меня крутит корректно, остальные - нет.
Подскажите какие тут колдовства, матрицы и т.д. нужно применить?

Суммируя вышеизложенное:
Дано: угол в плоскости экрана, на который нужно повернуть;
Требуется: найти значения rotationX, rotationY и rotationZ для вращаемгого объекта.

Спасибо.

alatar 25.12.2009 21:00

Во флеше угол имеет значения от 0 до 180 и от 0 до -180 (это верно для rotation).
Попробуйте поставить условие на присвоение.
Код AS3:

_body.rotationX +=  (_xOffset < 180)?_xOffset:_xOffcet - 360;

Хотя если у вас программа под 10-й плеер должно работать и без этого, rotationX/Y/Z корректно воспринимает любые углы.

enepx 25.12.2009 21:25

углы сами считаются по основанию 360, т.е. 721 = 1.
Не думаю, что встроенное в FP10 3d решит мою проблему влет.

Dos87 26.12.2009 06:28

Может так?
Код AS3:

private function onFrame(event:Event):void {
                _body.rotationX += _yOffset;
                _body.rotationY += -_xOffset;
        }


enepx 26.12.2009 09:45

Цитата:

Сообщение от Dos87 (Сообщение 875371)
Может так?
Код AS3:

private function onFrame(event:Event):void {
                _body.rotationX += _yOffset;
                _body.rotationY += -_xOffset;
        }


Нет, не работает. Тут не так просто решается. Тут зависимость от угла, вычисляться вроде должно через sin/cos.

Dos87 26.12.2009 10:57

Значит так =)
Код AS3:

private function onFrame(event:Event):void
{
        _body.transform.matrix3D.appendRotation(_yOffset, Vector3D.YAXIS);
        _body.transform.matrix3D.appendRotation(_xOffset, Vector3D.XAXIS);
}


enepx 26.12.2009 12:35

Цитата:

Сообщение от Dos87 (Сообщение 875379)
Значит так =)
Код AS3:

private function onFrame(event:Event):void
{
        _body.transform.matrix3D.appendRotation(_yOffset, Vector3D.YAXIS);
        _body.transform.matrix3D.appendRotation(_xOffset, Vector3D.XAXIS);
}


у меня FP9, а не FP10, потому и юзаю Five3D.

Dos87 26.12.2009 20:35

Не пользовался Five3D, но думаю, он должен поддерживать матрицы. Если даже нет - можно создать класс матрицы самому.

Вот ссылка на матрицы поворота
http://ru.wikipedia.org/wiki/%D0%9C%...BE%D1%82%D0%B0

Суть в том, что куб у тебя крутится вокруг своей оси, а не вокруг глобальной оси. Следовательно при повороте вокруг одной оси, две другие оси увеличивают свой угол относительно начала координат, на угол поворота.


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

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