Flash Tutorials
How to Create Randomly Flying Away Movie
How to Place Flat Subject in Space
How to Place Flat Subject in Space (Russian)
How to Use loadMovie Function
How to Skew the Object
How to Load XML File
English Russian

Как разместить плоский предмет в пространстве...
Урок расчитан на тех, кто знаком с геометрией и Flash. В уроке How to skew... мы рассказали, как надо изгибать мувик. В этом уроке мы будем использовать такой же приём изгибания.
Для простоты понимания будем располагать предмет на сфере. Изменяя радиус сферы и положение мувика на ней, мы охватим все точки пространства и все положения плоского предмета.
Начнём с геометрии.
Предположим, что нам надо расположить на сфере квадрат. С квадратом вычисления проще, чем с другой фигурой, а любую плоскую фигуру можно сколь угодно плотно покрыть квадратиками.
Рассмотрим рис.1.

Рис.1
Система координат в пространстве (Xv, Yv, Zv) изображена так, что ось Xv направлена на нас. Система координат на плоскости (X, Y) выбрана так, что ось X совпадает с осью Yv, а Y - с осью Zv. Обозначим координаты точки M в пространстве (xv, yv, zv), а на плоскости (x, y). Тогда:
x = yv(1)
y = zv
Допустим, мы хотим перемещать жёлтый квадратик размером 1*1 по сфере с центром в точке (0, 0, 0) и радиусом R, он выглядит на рисунке как параллелограмм. Будем придерживаться следующих правил изображения квадрата в пространстве: нижняя и верхняя сторона будут всегда горизонтальными (хотя это противоречит законам перспективы) (это пока, потом мы научимся легко его крутить вокруг центра в его собственной плоскости), а боковые стороны будут наклонены по закону, который мы сейчас придумаем. Алгоритм довольно простой: надо изменить горизонтальный и вертикальный размеры квадрата, повернуть его, сжать сверху вниз и повернуть обратно.
Сначала вычислим, как надо уменишить квадратик по горизонтали и по вертикали.

Рис.2
Рис.3
Из рис.2:
l = cos α,
потому что размер стороны квадрата равен 1, а cos α находим следующим образом:
x
cos α = ------,
Rxy
где:
            
Rxy = x2 + y2
Из рис.3:
h = cos β,
x
cos β = ------,
Rxz
где:
            
Rxz = x2 + z2


Рис.4
На рис.4 изображён параллелограмм в какой-то из точек сферы. Размеры квадратов на каждом из рисунков никаким образом не совпадают с его размерами на других рисунках, но это неважно для наших рассуждений. Обозначим левый нижний угол параллелограмма γ. Тогда:
h
cos β = ------,
sin γ
а γ можно найти из того, что tg γ есть производная красного эллипса на рис.1 в точке M. Формула этого эллипса:
x2y2
------ + ------ = 1,
a2R2
где R - радиус сферы. Чтобы найти a, подставим в эту формулу координаты точки M на плоскости (пусть это будет (xm, ym), они нам известны из (1)). Имеем:
xm2ym2
------ + ------ = 1,
a2R2
отсюда:
xm2R2
a2 = ------------,
R2 - ym2
Считая a известным (на самом деле нам достаточно знать a2):
            
/x2
y = R√1 -  ----,
a2
R x
tg γ = y' = -  ---------------------.
            
/x2
y = a21 -  ----
a2
Теперь последнее, что нам надо сделать. Рассмотрим рис.5.

Рис.5
Жёлтый параллелограмм - это наш искомый параллелограмм. Чтобы получить его, надо уменьшить горизонтальный и вертикальный размеры исходного квадрата до p и q соответственно (нам их
m
предстоит найти), повернуть на угол φ, сжать в ------ раз (φ, m и n тоже надо найти) и повернуть
n
обратно на угол σ (он обозначен на рис.5 точечной дугой, его тоже будем искать).
Сейчас найдём p и q. Из подобия треугольников ACD и CDK ([DK] - перпендикуляр из точки D на диагональ d):
dq
------ = ------,
qg
где g - длина отрезка [KC]. Следовательно:
        
q = d g
а g можно найти из треугольника ACD1:
g = cos τ.
Имеет место формула:
d2 = l2 + w2 - 2 l w cos γ,
где d - большая диагональ параллелограмма, l и w - длины его сторон, а cos γ - угол между w и l. Найдём меньшую диагональ параллелограмма f:
f2 = l2 + w2 - 2 l w cos (180° - γ) = l2 + w2 + 2 l w cos γ,
а теперь из треугольника-четвертушки параллелограмма:
a2d2
------ = ------ + w2 - d w cos τ,
44
а отсюда:
d2w2
------ + w2 - ------
44
cos τ = ---------------------------.
d w
Таким образом, τ мы тоже нашли. Находим угол φ:
g
sin φ = ------,
q
коэффициент сжатия δ:
m
δ = ------,
k
            
k = q2 - g2,
            
m = m2 - g2.
Угол поворота "обратно" равен:
σ = 180° - γ - τ.
Все вычисления произведены, геометрия на этом закончилась. Теперь непосредственно Flash.
Создадим Symbol с именем FlatT, в нём создадим Symbol с именем FlatT_, в FlatT_ - Symbol с именем FlatT__, а уже в нём нарисуем вот такой щербатый квадрат:
. Дадим объектам имена. FlatT__ внутри FlatT_ назовём mvFlatT__, FlatT_ внутри FlatT назовём mvFlatT_, а FlatT на сцене назовём mvFlatT. FlatT и FlatT_ мы будем использовать для деформации объекта, а FlatT__ - для поворота объекта в своей плоскости вокруг своего центра. ActionScript будет только внутри FlatT. Имитация положения в пространстве объекта mvFlatT будет производиться функцией placeOnSphere(xc,yc,vn,amn,nclF,nclB,vl), где xc, yc - координаты центра сферы, vn - объект с тремя полями vn.x_, vn.y_ и vn.z_ - координаты центра объекта, который мы собираемся псевдоперемещать в пространстве, amn - угол поворота объекта в своей плоскости вокруг своего центра, nclF - цвет передней стороны объекта, nclB - цвет задней стороны объекта, а vl - объект с координатами источника света с полями такими же как у vn. Имена переменным даны в близком соответствии с теми, которые применялись в геометрической части данного урока. Можно оптимизировать код, но он тогда будет не похож на геометрические рассуждения. Вот код этой функции:
4	 function  placeOnSphere(xc,yc,vn,amn,nclF,nclB,vl)
5	 {
6	   var rad;
7	   var l_,h_,w_;
8	   var vf;
9	   var tan_gamma;
10	   var q_;var  oe;
11	
12	   if(Math.abs(vn.x_)<0.001)
13	     vn.x_=0;
14	   if(Math.abs(vn.y_)<0.001)
15	     vn.y_=0;
16	   if(Math.abs(vn.z_)<0.001)
17	     vn.z_=0;
18	   XM=vn.x_;YM=vn.y_;ZM=vn.z_;
19	   rad=Math.sqrt(vn.x_*vn.x_+vn.y_*vn.y_+vn.z_*vn.z_);
20	
21	   vf=new Object();
22	   vf.x_=vn.y_;vf.y_=vn.z_;
23	
24	   placeXYZ(xc,yc,vf);
25	
26	   mirrorM(vn);
27	
28	   tan_gamma=def_tan_gamma(rad,vf);
29	   l_=defL_(vn);
30	   h_=defH_(rad,vn);
31	   if(tan_gamma!='i')
32	   {
33	     if(vn.y_>=0)
34	       gamma=Math.PI+Math.atan(tan_gamma);
35	     else
36	       gamma=Math.PI-Math.atan(tan_gamma);
37	   }
38	   else
39	     gamma=Math.PI/2;
40	   w_=h_/Math.sin(gamma);
41	
42	   oe=new Object();
43	   q_=defQ_(l_,w_,gamma,oe);
44	   mvFlatT_._xscale=oe.p_*100;
45	   mvFlatT_._yscale=q_*100;
46	   mvFlatT_._rotation=oe.fi/Math.PI*180;
47	   if(vn.y_*vn.z_<0)
48	     mvFlatT_._rotation=-mvFlatT_._rotation;
49	   _yscale=oe.delta*100;
50	   _rotation=oe.sigma/Math.PI*180;
51	   if(vn.y_*vn.z_<0)
52	     _rotation=-_rotation;
53	
54	   rotateN(vn,amn);
55	
56	   if(vl!=null)
57	     lightM(vn,nclF,nclB,vl);
58	 }
Внутренние переменные этой функции:
rad - радиус сферы.
l_,h_,w_ - l, h, w из изложенных выше геометрических рассуждений.
vf - объект с координатами vf.x_ и vf.y_ на плоскости (x и y).
tan_gamma - tg γ.
q_ - что-то близкое к q - доля от изначальной длины стороны объекта.
oe - объект с полями p_, g_, delta, fi, sigma - p, g, δ, φ и σ соответственно. Поле p_, также как и q_ - это доля от изначальной длины стороны объекта.
Сначала проверяем (строки 12 - 17) координаты на то, чтобы они не были слишком маленькими, это для того чтобы избежать неточных вычислений. Если они по абсолютной величине меньше 0.001, то лучше присвоить им 0. Строка 18 присваивает глобальные переменные дл определения извне изменённых в строках 12 - 17.
В строке 19 определяем радиус сферы, на которую мы собираемся садить mvFlat.
В строках 21 и 22 формируем объект vf (координаты на плоскости).
В строке 24 вызываем функцию placeXYZ(xc,yc,vf), которая помещает mvFlat в нужную точку на экране.
В строке 26 функция mirrorM(vn) преобразовывает mvFlat, если он находится на обратной стороне сферы.
В строке 28 функция def_tan_gamma возвращает tg γ, если он существует, или 'i' в противном случае. Строки 29 и 30 вычисляют l_ и h_, строки 31 - 42, мы думаем, в комментариях не нуждаются.
В строке 43 функция defQ_(l_,w_,gamma,oe) ворзвращает значение q_, а также присваивает все поля объекта oe.
Далее (строки 44 - 48) мы изменяем длину и ширину mvFlatT_, а также вращаем его. В строке 49 мы сжимаем mvFlatT сверху вниз, а в строках 50 - 52 поворачиваем обратно. Обратите внимание, первый поворот относился к mvFlatT_, а назад мы вращаем mvFlatT.
В строке 54 поворачиваем объект вокруг своей оси на угол amn, а в 57-й - освещаем, если задан vl.
Ещё один метод FlatT:
function  attachSymbol(ssn)
{
mvFlatT_.mvFlatT__._visible=0;
mvFlatT_.attachMovie(ssn,'mvFlatTAt__',1);
}
Он позволяет заменить объект mvFlatT__ на любой, который мы захотим.
Вспомогательные функции мы описывать не будем, можете посмотреть их в исходнике. Если у вас есть вопросы, пожалуйста задавайте их нам, мы с удовольствием ответим.
Как это использовать?..
Пример: Изменение положения плоского предмета на сфере
Скачать исходник

Ещё пример: Октаэдр
Скачать исходник

Ещё пример:

Download(here is the old previous algorithm but it is very close to above-stated)
Remarks
advance
2017-05-04 18:27:56
http://nofaxpaydaynpz.com/
SPECIAL OFFER : For Women Herbal on SALE , Buy Viagra For Women Herbal shop online .
with
2017-03-28 03:31:15
http://buyvia2.com/
Tablets For Sale Uk in Sherman .
cheap
2017-03-03 04:11:09
http://pills1cia.com/
Men who have both ED and signs of BPH might take for that treatment of both conditions.
cheap_cialis
2017-02-09 04:54:32
http://c4generic.com/
FDA issued an alert for men about possible loss of vision after taking .
viagra_online
2017-01-17 06:50:10
http://buycheap1v.com/
Peel for my cheap pills dry knife.
cialis
2017-01-17 03:09:54
http://www.cheapills1c.com/
Salthouse likely in strongly probiotics death decipher for generique posologie.
cialis
2016-12-19 03:28:15
http://cia5purchase.com/
Will daily use replace flomax for bph?
cialis_pills
2016-11-17 04:47:18
http://pills6via.com/
Molecules find it firmer and achieve more uncomfortable when suppressing best dose for daily .
cialis
2016-10-18 01:12:45
http://price6conline.com/
Getting a prescription for &n .
online_cialis
2016-09-14 04:36:16
http://c5sale.com/

Георгий
2009-11-05 05:57:27
А можете сделать меню-шар, кат тут: www.vbsupport.org/forum/
Add Your Remark:
Your Name*:
Email:
Hide Email    Subscribe to Site News
Web Site:
Message*:
Other tutorials:
JavaScript Tutorials