Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 18.03.2013, 18:42
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 11  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Для двумерной проекции вам нужна матрица 3x3 (как раз такая используется в AS3).
GPU работает с трехмерным пространством (отсюда и трехмерные векторы), что однако не мешает вам имитировать двумерное (Starling, ND2D и прочие библиотеки).
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 18.03.2013, 18:51
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 12  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Но ведь stage3D поддерживает загрузку только 4x4 матриц (Matrix3D).

Чтобы сымитировать 3х3 матрицу, нужно передать 3 вектора в 3 разных константных регистра. В каком порядке должны идти данные в этих векторах, что-бы корректно были умножены m33 я не знаю.
__________________
Дети не должны знать о своих родителях

Старый 18.03.2013, 19:06
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 13  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
В документации прямым текстом написано:
Цитата:
Матрица назначается регистрам построчно.
3D преобразуется в 2D, если одна из координат имеет значение 0 (ну или любое константное) это касается и матриц и векторов.

Добавлено через 3 минуты
О матрицах можно почитать в документации (раз и два), там очень подробно описано.
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 18.03.2013, 19:31
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 14  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Ясно, большое спс, это многое проясняет для меня.
__________________
Дети не должны знать о своих родителях

Старый 19.03.2013, 01:51
Nooob вне форума Посмотреть профиль Отправить личное сообщение для Nooob Найти все сообщения от Nooob
  № 15  
Ответить с цитированием
Nooob
 
Аватар для Nooob

Регистрация: Mar 2007
Сообщений: 319
Цитата:
Сообщение от Tails Посмотреть сообщение
Но все-же, меня интересовало решение без использования методов сторонних классов, чистое решение.
Код AS3:
			var rotation:Number = 54;
			var x:Number        = 60;
			var y:Number        = 60;
			var width:Number    = 100;
			var height:Number   = 100;
			var scaleX:Number   = 0.9;
			var scaleY:Number   = 0.5;
 
			var sprite1:Sprite  = new Sprite();
			sprite1.graphics.beginFill(0xFF0000);
			sprite1.graphics.drawRect(-width * .5, -height * .5, width, height);
			sprite1.rotation = rotation;
			sprite1.scaleX = scaleX;
			sprite1.scaleY = scaleY;
			sprite1.x = x;
			sprite1.y = y;
			sprite1.alpha = 0.5;
			addChild(sprite1);
 
			var angle2Rad:Number           = rotation * Math.PI / 180;
			var sinT:Number                = Math.sin(angle2Rad);
			var cosT:Number                = Math.cos(angle2Rad);
			var scaledWidth:Number         = width * scaleX;
			var scaledHeight:Number        = height * scaleY;
			var centerX:Number             = scaledWidth * .5;
			var centerY:Number             = scaledHeight * .5;
			var wX:Number                  = scaledWidth - centerX;
			var hY:Number                  = scaledHeight - centerY;
			var cosX:Number                = cosT * centerX;
			var sinX:Number                = sinT * centerX;
			var cosWX:Number               = cosT * wX;
			var sinWX:Number               = sinT * wX;
			var cosY:Number                = cosT * centerY;
			var sinY:Number                = sinT * centerY;
			var cosWY:Number               = cosT * hY;
			var sinWY:Number               = sinT * hY;
 
			var vertexData:Vector.<Number> = new Vector.<Number>();
			vertexData[0] = x - cosX - sinWY;
			vertexData[1] = y - sinX + cosWY;
			vertexData[2] = x - cosX + sinY;
			vertexData[3] = y - sinX - cosY;
			vertexData[4] = x + cosWX + sinY;
			vertexData[5] = y + sinWX - cosY;
			vertexData[6] = x + cosWX - sinWY;
			vertexData[7] = y + sinWX + cosWY;
			var indexData:Vector.<int> = new <int>[0, 1, 2, 0, 2, 3];
 
			var sprite2:Sprite         = new Sprite();
			sprite2.graphics.beginFill(0x00FF00);
			sprite2.graphics.drawTriangles(vertexData, indexData);
			sprite2.alpha = 0.5;
			addChild(sprite2);

Старый 21.08.2013, 01:37
Vasya Pupkin вне форума Посмотреть профиль Отправить личное сообщение для Vasya Pupkin Найти все сообщения от Vasya Pupkin
  № 16  
Ответить с цитированием
Vasya Pupkin

Регистрация: Dec 2011
Сообщений: 17
По умолчанию У меня вопрос по 3D трансформациям.

Здравствуйте! Мне необходимо вращать и поступательно перемешать 3D контент в пространстве. Исходные данные: у меня есть мешЪ. Его размеры составляют по ширине 320, по высоте 240, а в глубину доходит до 4000. Все треугольники направлены в одну сторону (на экран). Выглядит меш как плоскость, только в отдельных местах, как бы обрывы из-за того, что в этих местах треугольники отдалены от остальных по оси Z (облако точек). Меш состоит из 320*240*2 = 153600 треугольников. Формат вектора вершин [x, y, z, r, g, b].
agal код как у всех для таких случаев:
Код AS3:
const VERTEX_SHADER:String = 
"m44 op, va0, vc0 \n" +
"mov v0, va1";
const FRAGMENT_SHADER:String = 
"mov oc, v0";
Я думал, что я возьму матрицу 4 на 4 (3D матрицу) и буду выполнять с ней все манипуляции касающиеся 3D ориентаций. Класс, который я использую для имитации перспективы com.adobe.utils.PerspectiveMatrix3D. Я не ожидал следующих подводных камней:
1. При вращении вокруг осей X и Y меш визуально обрезается (см. изображение).
2. При сдвиге по X и по Y происходит не поступательное перемещение, а какая-то деформация похожая на изменение угла обзора с одновременным поворотом.
3. Те треугольники, которые находятся на отдалении (z > 100) не видны вообще. То есть они конечно есть, но находятся на таком отдалении(до 4000), что превращаются в точку.

Должен отметить, что перемещение вдоль Z происходит правильно.

Привожу кусок кода (цикл рендера):
Код AS3:
public function render(e:Event):void
{
 
if(!contextChanged)return;
context3D.clear(0,0,0);
 
//Матрица для меша	
var matrix3D:Matrix3D = new Matrix3D();
matrix3D.appendRotation(rY, Vector3D.Y_AXIS);
matrix3D.appendRotation(rX, Vector3D.X_AXIS);
matrix3D.appendRotation(rZ, Vector3D.Z_AXIS);
matrix3D.appendTranslation(offsetX, offsetY, offsetZ);
 
 
var aspect:Number = 3/3;
var zNear:Number = -5000;
var zFar:Number = 5000;
var fov:Number = fov*Math.PI/180;
perspective.identity();
perspective.perspectiveFieldOfViewLH(fov, aspect, zNear, zFar);
 
 
//Добавляем перспективу	
matrix3D.append(perspective);
 
 
for(var i:uint=0;i<amountOfSprites;i++)
{				
    //Геометрия
    сontext3D.setVertexBufferAt(0,sprite3Ds[i].vertexBuffer3D,0,Context3DVertexBufferFormat.FLOAT_3);			
    context3D.setVertexBufferAt(1,sprite3Ds[i].vertexBuffer3D,3,Context3DVertexBufferFormat.FLOAT_3);
    context3D.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX,0,matrix3D);
 
    //Отрисовка
    context3D.drawTriangles(sprite3Ds[i].indexBuffer3D,0,sprite3Ds[i].numTriangles);
}
 
//Окончательный вывод изображения.
context3D.present();
 
contextChanged = false;
log("render OK");
}
Миниатюры
Нажмите на изображение для увеличения
Название: rxm20_ry20.png
Просмотров: 26
Размер:	256.7 Кб
ID:	29927  

Старый 21.08.2013, 11:32
Vasya Pupkin вне форума Посмотреть профиль Отправить личное сообщение для Vasya Pupkin Найти все сообщения от Vasya Pupkin
  № 17  
Ответить с цитированием
Vasya Pupkin

Регистрация: Dec 2011
Сообщений: 17
Цитата:
1. При вращении вокруг осей X и Y меш визуально обрезается (см. изображение).
2. При сдвиге по X и по Y происходит не поступательное перемещение, а какая-то деформация похожая на изменение угла обзора с одновременным поворотом.
3. Те треугольники, которые находятся на отдалении (z > 100) не видны вообще. То есть они конечно есть, но находятся на таком отдалении(до 4000), что превращаются в точку.
.
Опытные флешеры отзовитесь. Кто сталкивался с такими вещами. Подскажите в какую сторону копать чтобы обойти выше описанные подводные камни

Старый 21.08.2013, 13:34
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 18  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
Создайте новую тему и там задайте вопрос.
__________________
Отряд Котовскага

Создать новую тему Ответ Часовой пояс GMT +4, время: 01:50.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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