Форум 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=150669)

in4core 16.02.2011 03:23

Вращение 3д экранного объекта из точки регистрации в центре
 
Собственно создаю 3д объект типа шейп допустим куб ( из линий только ) . Добавляю на сцену, естственно он имеет координаты 0,0,0 .
Следующим шагом как показывает хелп нужно доабвить z координату. Делаем. Ну и с помощью 3дматрицы пробуем вставить точку в центр и крутить вокруг нее, как описано в хелпе

Из хелпа
Код 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);

Но у меня происходят странные метаморфозы, объект начинает хаотично менять направление и вести себя странно ))

Код AS3:

cont.z = 1   ( допустим 100*100*100 размеры )
 
cont.addEventListener ( Event.ENTER_FRAME , onFrame);
 
private function onFrame(e:Event):void
                {
 
                        cont.transform.matrix3D.appendTranslation(100,100,100);
                        cont.transform.matrix3D.appendRotation(0.05, Vector3D.Y_AXIS);
                        cont.transform.matrix3D.appendTranslation(-100,-100, -100);
                }

Что я делаю не так ?

Wolsh 16.02.2011 11:33

Дайте весь код. Иначе непонятно, что Вы подразумеваете под "точка регистрации в центре", почему смещаете на 100, каков размер сцены и, главное, где начало координат Вашего кубика, вокруг которого он крутится. Я так понимаю что он не в центре куба, а в левой верхней передней (или задней?) вершине.

in4core 16.02.2011 13:43

@Wolsh ну я же написал. точка регистрации после создания находится в 0-0-0. А мне нужно поместить в центр фигуры, представьте сферу точка пересечения окружностей ( диаметров ) в цеентре вообщем. ВОт туда и надо поместить точку и крутить вокруг нее. Размер сцены тут не причем, размер шейпа 100*100*100 например, это я тоже сказал.

Цитата:

Я так понимаю что он не в центре куба, а в левой верхней передней (или задней?) вершине.
Левый верхний да, логично. А нужно в центр по 3м осям

Wolsh 16.02.2011 16:04

Размер сцены причем. В ее центре находится глаз наблюдателя.
Размер куба 100х100х100. Смещаясь на 100 для поворота - чего Вы хотели добиться? Центра?

in4core 16.02.2011 16:12

Извиняюсь не корректно написал ошибочка. Исправил ( но неверно я написал лишь на форуме, а не у себя, поэтому вопрос висит ). Размер сцены скажем 800*600 пускай раз причем

Код AS3:

cont.transform.matrix3D.appendTranslation(100/2,100/2,100/2);
                        cont.transform.matrix3D.appendRotation(0.05, Vector3D.Y_AXIS);
                        cont.transform.matrix3D.appendTranslation(-100/2,-100/2, -100/2);


gr_crd 16.02.2011 16:19

Вложений: 1
добавляем в контейнер стороны куба
Код AS3:

cube = new Sprite;
 
addChild(cube);
for (i = 0; i < stc; i++) {
    cube.addChild(stors[i]);
}

размещаем их таким образом
Код AS3:

stors[0].x = 0; stors[0].y = 0; stors[0].z = -50; stors[0].rotationZ = 0;
stors[1].x = 0; stors[1].y = 0; stors[1].z = 50; stors[1].rotationZ = 0;
stors[2].x = 50; stors[2].y = 0; stors[2].z = 0; stors[2].rotationY = 90;
stors[3].x = -50; stors[3].y = 0; stors[3].z = 0; stors[3].rotationY = 90;
stors[4].x = 0; stors[4].y = 50; stors[4].z = 0; stors[4].rotationX = 90;
stors[5].x = 0; stors[5].y = -50; stors[5].z = 0; stors[5].rotationX = 90;

смещаем в начало координат, поворачиваем, возвращаем
Код AS3:

matrixCube.appendTranslation(-pos.x, -pos.y, -pos.z);
matrixCube.appendRotation(0.7, vect2);
matrixCube.appendTranslation(pos.x, pos.y, pos.z);

вращение происходит вокруг цента куба.

выглядит так: во вложении.

in4core 16.02.2011 16:49

gr_crd а почему так сложно то? Разве нет варианта более рационального с использованием матриц ?

Да и тем более не понятно начало :

cube это наша фигура. ок

stc количество углов-вершин, как я понимаю. ок

Код AS3:

 cube.addChild(stors[i]); // а вот тут ваще не понятно, че за stors и где он объявлен

И почему их 6 всего а не 8 ))

Как то все странно.
Попробую рассказать предисторию создания.
Я создаю шейп из линий ( сетка ) горизонтальные и вертикальные линии, обычный mash как в любом 3д редакторе.
Затем в цикле
1. Создаю дубликаты сетки и смещаю их по z ( на желаемое расстояние друг от друга )
2. Создаю дубликаты сетки, поворачиваю на 90 градусов (RotationX вроде) и смещаю по y ( тут уже по z смещать не надо, при повороте он сам преобретает z координату)
В итоге получается псевдо-куб с эффектом x-Ray , так сказать.

Добавляю его на сцену ( ширина и высота = размерам сцены ) , а по z = высоте сцены.

Все теперь мы видим куб из линий который закрывает всю область сцены, фронтальной смотрит на нас. При добавлении он добавляется на координату 0-0-0 соотв, я так думаю.

Затем я ему даю z = 1 ; И пробую работать с матрицами как я описал ( соотв вместо 100 там другие размеры от сцены )

gr_crd 16.02.2011 17:04

Цитата:

gr_crd а почему так сложно то
ну, это самое простое, по-моему.

stors - массив шейпов (сторон куба)

Цитата:

И почему их 6 всего а не 8 ))
потомучто у куба 6 сторон.

Цитата:

Как то все странно.
ну незнаю, куб крутится вокруг своего центра, как и нужно было.

ps. а вообще, удобнее отображать 3d-объекты с помощью drawTriangles() || lineTo(). правда придется немного почитать.

proxiServer 16.02.2011 17:17

gr_crd, а можно исходник?) оч круто)

in4core 16.02.2011 17:27

Цитата:

потомучто у куба 6 сторон.
Я думал разговор идет о вершинах.

proxiServer - если тебе такое надо используй обычный away3d или alternativa3d напимер. Там это делается за считанные секунды с любой графикой

gr_crd 16.02.2011 17:28

Вложений: 1
proxiServer, вот исходник, только .as ; fla уже давно удалил.
код древний, сортировку такую как там лучше не делать)

proxiServer 16.02.2011 17:35

gr_crd, спасибо, помучаем)


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

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