|
|
|||||
Для двумерной проекции вам нужна матрица 3x3 (как раз такая используется в AS3).
GPU работает с трехмерным пространством (отсюда и трехмерные векторы), что однако не мешает вам имитировать двумерное (Starling, ND2D и прочие библиотеки).
__________________
משיח לא בא משיח גם לא מטלפן |
|
|||||
Но ведь stage3D поддерживает загрузку только 4x4 матриц (Matrix3D).
Чтобы сымитировать 3х3 матрицу, нужно передать 3 вектора в 3 разных константных регистра. В каком порядке должны идти данные в этих векторах, что-бы корректно были умножены m33 я не знаю.
__________________
Дети не должны знать о своих родителях |
|
|||||
В документации прямым текстом написано:
Цитата:
Добавлено через 3 минуты О матрицах можно почитать в документации (раз и два), там очень подробно описано.
__________________
משיח לא בא משיח גם לא מטלפן |
|
|||||
Регистрация: Mar 2007
Сообщений: 319
|
Цитата:
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); |
|
|||||
Регистрация: Dec 2011
Сообщений: 17
|
У меня вопрос по 3D трансформациям.
Здравствуйте! Мне необходимо вращать и поступательно перемешать 3D контент в пространстве. Исходные данные: у меня есть мешЪ. Его размеры составляют по ширине 320, по высоте 240, а в глубину доходит до 4000. Все треугольники направлены в одну сторону (на экран). Выглядит меш как плоскость, только в отдельных местах, как бы обрывы из-за того, что в этих местах треугольники отдалены от остальных по оси Z (облако точек). Меш состоит из 320*240*2 = 153600 треугольников. Формат вектора вершин [x, y, z, r, g, b].
agal код как у всех для таких случаев: const VERTEX_SHADER:String = "m44 op, va0, vc0 \n" + "mov v0, va1"; const FRAGMENT_SHADER:String = "mov oc, v0"; 1. При вращении вокруг осей X и Y меш визуально обрезается (см. изображение). 2. При сдвиге по X и по Y происходит не поступательное перемещение, а какая-то деформация похожая на изменение угла обзора с одновременным поворотом. 3. Те треугольники, которые находятся на отдалении (z > 100) не видны вообще. То есть они конечно есть, но находятся на таком отдалении(до 4000), что превращаются в точку. Должен отметить, что перемещение вдоль Z происходит правильно. Привожу кусок кода (цикл рендера): 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"); } |
|
|||||
Регистрация: Dec 2011
Сообщений: 17
|
Цитата:
Опытные флешеры отзовитесь. Кто сталкивался с такими вещами. Подскажите в какую сторону копать чтобы обойти выше описанные подводные камни |
|
|||||
буду краток
модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
|
Создайте новую тему и там задайте вопрос.
__________________
Отряд Котовскага |
Часовой пояс GMT +4, время: 01:50. |
|
« Предыдущая тема | Следующая тема » |
|
|