PDA

Просмотр полной версии : Где посмотреть инфу о натяжении текстуры


ВАРАН
15.01.2009, 19:12
Я сделал 3d плашку которая вращается от движения мышки. Хочу теперь наложить на неё текстуру. Подскажите может знает кто где посмотреть примеры или что то в этом роде?

Fatality
15.01.2009, 19:14
3D говоришь, а ты разделом не ошибся может тебе в AS3 надо ? =/

gloomyBrain
15.01.2009, 21:21
Версия AS значения не имеет (хотя AS3 математику быстрее считает)
silin.fatal.ru (http://silin.fatal.ru)

Fatality
15.01.2009, 21:36
как так не имеет ?
для тех кто в танке - в AS3 в отличии от AS2 и AS1(не будем учитывать разные псевдо-3D плагины) мало-мальски реализована работа с 3D, по крайней мере есть возможность создать MovieClip с координатами x,y и z и натянуть на него текстуру.

P.S вот кусок из официального руководства по AS3:

Общие задачи работы в трех измерениях
В этой главе описываются следующие общие операции, связанные с работой в трех измерениях:
• создание трехмерного объекта;
• перемещение объекта в трехмерном пространстве;
• поворот объекта в трехмерном пространстве;
• представление глубины с использованием перспективной проекции;
• изменение порядка элементов в списке отображения в соответствии с относительными осями Z, чтобы
объекты правильно располагались друг перед другом;
• преобразование трехмерных объектов с помощью трехмерных матриц;
• использование векторов для манипуляции объектами в трехмерном пространстве;
• использование метода Graphics.drawTriangles() для создания перспективы;
• использование UV-наложения для добавления растровых текстур в трехмерный объект;
• настройка параметра отбора метода Graphics.drawTriangles() , чтобы ускорить визуализацию и скрыть
части трехмерного объекта, которые не видны с текущей точки зрения.

gloomyBrain
15.01.2009, 21:39
Для тех, кто сам в танке >> пройдите по ссылке (http://silin.fatal.ru/#AS2/model) и посмотрите
имитацию z можно создать и ручками, причем, вероятнее всего способ реализации вряд ли будет сильно отличаться от AS3

Fatality
15.01.2009, 21:47
=) я то как раз не в танке и в курсе что можно сделать псевдо-3D математическим просчетом, но что мы имеем глюковатую, судорожно-подергивающуюся анимацию ?
Это полумеры, хотя до появления AS3 являлось наилучшим выходом из ситуации.

gloomyBrain
15.01.2009, 21:56
Это полумеры, хотя до появления AS3 являлось наилучшим выходом из ситуациию
Что-то я Вас не совсем понимаю..
Спроецировать на экран трехмерное изображение можно:
- самодельными методами
- встроенными методами
Второе в большей части относится к AS3
Однако принципиальной разницы никакой нет
то, что у мувиклипа уже существует свойство z полностью равносильно созданию этого свойства самостоятельно

Если Вы имеете ввиду, что FlashPlayer 10 поддерживает работу с аппаратной частью - то это версия FP, а не AS. Есть разница

ВАРАН
15.01.2009, 22:07
Сенкс ту gloomyBrain.
Спаасибо за ссылку. AS3 это конечно хорошо, но у меня мозг пока под AS2 заточен.

Fatality
15.01.2009, 22:16
использование самодельных методов для меня и есть полумеры, хотя имея правильно растущие руки можно 3D хоть на коленке сделать =)

Mur4ik
16.01.2009, 01:48
самодельные методы могут зачастую оказаться лучше встроенных или пришитых adobовцами (пример mx классов - чет многие именно из "полумерок" делают чет безглючно рабочее)
А пооддержка 3d существует только для 10 плеера (AS3 соответсвенно), на который еще не скоро пересядет рядовой интернет-пользователь (не зря ведь до сих пор бОльшая часть заказов поступает с требованием as2 и не выше 8 плеера), т.ч остается именно использовать по Вашему "методы-полумеры" :)

терь по теме...
если плашка, то вот есть AS2 класс который может перспективно искажать изображения, его просто адаптировать для вращения чего нить плоского в трехмерном пространстве
http://www.flashsandy.org/blog/distortimage-20-the-fastest-way-to-freely-distort-image-with-flash-in-actionscript.html, причем там в примере искажается не просто изображение а потоковое видео с веб-камеры (и довольно таки шустро)...

Если все же хочется написАть что то свое, то общий принцип таков:
Все строится на матрицах трансформаций, про них читаем здесь http://www.senocular.com/flash/tutorials/transformmatrix/
чтоб добиться именно перспективных искажений примерный алгоритм на картинке ниже, чем больше треугольников - тем качественней результат.

Если нужна более сложная поверхность, то там и алгоритмы уже по-сложнее будут.

ВАРАН
16.01.2009, 10:47
Я вот знаю пример с методом split(). Один дядька переписал его для AS2 и он стал работать намного шустрее чем родной flashовый метод. Это ещё на MX было.

Добавлено через 1 час 37 минут
может мне кто нибудь помоч натянуть вот на это текстуру

Добавлено через 1 час 38 минут
import flash.display.BitmapData;
import flash.geom.Matrix;
import flash.filters.ColorMatrixFilter;

var focalLength = 400;
var lastMouseX = lastMouseY=kX=kY=0;
//-----------------------------------------------
function create(targed) {
this.createEmptyMovieClip(targed,2);
this[targed].param = {x:Stage.width/2, y:Stage.height/2, z:0};
this[targed].vertex = [{x:-100, y:-100, z:0}, {x:100, y:-100, z:0}, {x:100, y:100, z:0}, {x:-100, y:100, z:0}];
this[targed].onPress = function() {
MouseMove = true;
};
this[targed].onRelease = function() {
MouseMove = false;
};
this[targed].onReleaseOutside = function() {
MouseMove = false;
};

}
function render(targed) {
targed.clear();
targed.beginFill(0x0000FF,30);
for (i=0; i<targed.vertex.length; i++) {
var scale = focalLength/(focalLength-targed.vertex[i].z);
x = targed.vertex[i].x*scale;
y = targed.vertex[i].y*scale;
if (i == 0) {
targed.moveTo(x,y);
} else {
targed.lineTo(x,y);
}
}
//
targed._x = targed.param.x;
targed._y = targed.param.y;
}

rotateY = function (targed, degree) {
var sin = Math.sin(degree*Math.PI/180);
var cos = Math.cos(degree*Math.PI/180);
for (var i = 0; i<targed.vertex.length; i++) {
var x = cos*targed.vertex[i].x-sin*targed.vertex[i].z;
var z = cos*targed.vertex[i].z+sin*targed.vertex[i].x;
targed.vertex[i].z = z;
targed.vertex[i].x = x;
}
};
rotateX = function (targed, degree) {
var sin = Math.sin(degree*Math.PI/180);
var cos = Math.cos(degree*Math.PI/180);
for (var i = 0; i<targed.vertex.length; i++) {
var y = cos*targed.vertex[i].y-sin*targed.vertex[i].z;
var z = cos*targed.vertex[i].z+sin*targed.vertex[i].y;
targed.vertex[i].z = z;
targed.vertex[i].y = y;
}
};
create("rektangl1");

this.onEnterFrame = function() {
if (MouseMove) {
kX = this._xmouse-lastMouseX;
kY = this._ymouse-lastMouseY;
lastMouseX = this._xmouse;
lastMouseY = this._ymouse;
} else {
lastMouseX = this._xmouse;
lastMouseY = this._ymouse;
kX = kY=0;
}
rotateY(rektangl1,-kX/2);
rotateX(rektangl1,-kY);
render(rektangl1);

};

Mur4ik
16.01.2009, 15:36
Может ;)
В аттаче, собственно, Ваш же код но уже с текстуркой.
Непугайтесь, немного изменил и оптимизировал Ваш код (без обид), но сильно не вникал... думаю можно еще немного ускорить просчеты.

ВАРАН
16.01.2009, 19:07
О! Зур рахмет. Что по нашему означает дословно - большое спасибо. А что void реально ускоряет вычисление?

Mur4ik
17.01.2009, 00:47
Кто то тут говорил что строгая типизация ускоряет выполнение, но в данном случае это просто уже привычка )
Да и плюс есть некие правила хорошего тона в программировании.