Просмотр полной версии : 3D куб, возможно ли?
Первоначально хотел создать следующим путём:
разбить куб на плоскости. Для простоты вращать думал только по горизонтали.
Каждая плоскость - мувик(p), внутри которого 2 слоя. В первом сама плоскость, во втором - маске первого, полоска посередине и два мувика - сверху(pmv) и снизу(pmn).
При нажатии влево или вправо должны были осуществлятся след действия:
1. смещение p по горизонтали.
2. изменение ширины p.
3. поворот pmv и pmn.
4. смещение pmv и pmn к центру p.
1 и 2 получилось, а вот 3 нет - в root без проблем вращается, а вот во вложенном мувике только один раз поворачивается, а дальше не хочет.
Может что посоветуете? Или можно сделать по другому?
Заранее благодарю.
Добавлено через 53 минуты
Обясните кто нибудь:
on (keyPress "<Right>") {
setProperty(_root.planen, _rotation, _rotation+1);
setProperty("_root.planen.pmvn", _rotation, _rotation+3);
}
planen и pmvn крутятся
а так:
on (keyPress "<Right>") {
setProperty("_root.planen.pmvn", _rotation, _rotation+3);
}
pmvn не крутится.
более того, если setProperty(_root.planen, _rotation, _rotation+1; последнее значение меньше 1, тож не крутится ни тот ни другой. В чом дело?
Macromedia mx
ищи в гуглах: pv3D, away3d, sandy3D, alternativa3D
MobyDick
08.03.2009, 10:46
Если говорить о более менее полноценном 3д, то делается это оченама гиморно а за сим сложно. Создай два клипа (графикс) - точку и линию. Точку можно какую хошь, а линия должна быть такой: она начинается в Центре клипа и тянется вправо и вниз ровно на 100 пикселей. В пропиртис установи толщину линии как hairline.
Вне рабочего поля размести клип (муви) actions с кодом:
onClipEvent(enterFrame) {
_root.reposition();
}
Затем в кадре основной временной шкалы:
// создание массива из 8 точек
function makePoints() {
points = new Array();
points[0] = {x: 30, y: 30, z: 30};
points[1] = {x: -30, y: 30, z: 30};
points[2] = {x: -30, y: -30, z: 30};
points[3] = {x: 30, y: -30, z: 30};
points[4] = {x: 30, y: -30, z: -30};
points[5] = {x: 30, y: 30, z: -30};
points[6] = {x: -30, y: 30, z: -30};
points[7] = {x: -30, y: -30, z: -30};
// создание 8 клипов для вершин куба
for(i=0;i<points.length;i++) {
attachMovie( "point", "point"+i, i )
}
}
// создание 12 клипов для ребер куба
function makeLines() {
lines = new Array();
lines[0] = {p1: 0, p2: 1};
lines[1] = {p1: 1, p2: 2};
lines[2] = {p1: 2, p2: 3};
lines[3] = {p1: 3, p2: 0};
lines[4] = {p1: 4, p2: 5};
lines[5] = {p1: 5, p2: 6};
lines[6] = {p1: 6, p2: 7};
lines[7] = {p1: 7, p2: 4};
lines[8] = {p1: 0, p2: 5};
lines[9] = {p1: 1, p2: 6};
lines[10] = {p1: 2, p2: 7};
lines[11] = {p1: 3, p2: 4};
for(i=0;i<lines.length;i++) {
attachMovie( "line", "line"+i, 50+i )
}
}
// преоброзование 3х мерных координат в 2у мерные
function plotPoint(object) {
// get coordinates from object
x = object.x;
y = object.y
z = object.z;
// расстояние от центра
radius = Math.sqrt (x*x+y*y);
// вычисление первого угла
if (x == 0) angle = Math.atan(1000000);
else angle = Math.atan(y/x);
if (x < 0) angle += Math.PI;
// добавление вращения
angle += rotation;
// вычисление новых координат
realx = radius*Math.cos(angle);
realz = radius*Math.sin(angle);
realy = z;
// установка нового центра
radius = Math.sqrt(realy*realy+realz*realz);
// вычисление второго угла
if (realz == 0) angle = Math.atan(1000000);
else angle = Math.atan(realy/realz);
if (realz < 0) angle += Math.PI;
// добавление угла плоскости
angle += plane;
// вычисление координат на экране
screenx = realx;
screeny = radius*Math.sin(angle);
screenz = radius*Math.cos(angle);
// центр на экране
screenx += 275;
screeny += 200;
// вернуть обьект
return({x:screenx,y:screeny,z:screenz});
}
// цикл через точки
function drawPoints() {
for(i=0;i<points.length;i++) {
loc = plotPoint(points[i]);
this["point"+i]._x = loc.x;
this["point"+i]._y = loc.y;
this["point"+i]._alpha = loc.z+100;
}
}
// цикл через линии
function drawLines() {
for(i=0;i<lines.length;i++) {
loc1 = plotPoint(points[lines[i].p1]);
loc2 = plotPoint(points[lines[i].p2]);
this["line"+i]._x = loc1.x;
this["line"+i]._y = loc1.y;
this["line"+i]._xscale = loc2.x-loc1.x;
this["line"+i]._yscale = loc2.y-loc1.y;
this["line"+i]._alpha = loc1.z+100;
}
}
//перемещение куба каждый кадр
function reposition() {
rotation += (275-_xmouse)/1000;
plane = -(200-_ymouse)/100;
drawPoints();
drawLines();
}
// вызов функций и остановка
rotation = 0;
makePoints();
makeLines();
stop();
Код весьма устаревший, но рабочий. А еще он не мой :)
Meseder, для оформления своего кода надо использовать теги
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.