Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   drawTriangles() и lineStyle() (http://www.flasher.ru/forum/showthread.php?t=195308)

Foristel 04.03.2013 13:04

drawTriangles() и lineStyle()
 
Есть грань-четырёхугольник, созданная методом drawTriangles(),
она состоит из двух треугольников.
Управляя lineStyle(), можно сделать все рёбра невидимыми или видимыми.
Как сделать видимыми только рёбра контура (а диагональные - невидимыми) - ?
Т.е. возможно ли выборочно прорисовывать рёбра методом drawTriangles() - ?
Если да, то как?
Возможно, для этого потребуется модифицировать сам метод drawTriangles(),
можно ли где-то увидеть исходный код этого метода?

silin 04.03.2013 18:57

с родным drawTriangles ничего этого нельзя - ни выборочно рисовать, ни посмотреть код, ни модифицировать
остается рисовать треугольники с пустым lineSyle(), а затем линии обычным lineTo
если данные для drawTriangles составляются по каким-то определенным правилам, то можно все это в какую-то утилиту завернуть
например, для варианта когда диагональ обязательно последняя в каждой тройке
Код AS3:

public function Main():void 
{
 
        var vertices:Vector.<Number> = Vector.<Number>([10, 10, 100, 10, 100, 100, 10, 100]);
        var indices:Vector.<int> = Vector.<int>([0, 1, 3, 2, 3, 1]);
        graphics.beginFill(0xC0C0C0);
        drawEdgedTriangles(graphics, vertices, indices, 0, 0xFF0000);
 
}
static public function drawEdgedTriangles(graphics:Graphics, vertices:Vector.<Number>, indices:Vector.<int>, thickness:Number=0,color:uint=0x0):void
{
 
        graphics.drawTriangles(vertices, indices);
        graphics.lineStyle(thickness, color);
 
        for (var i:int = 0; i < indices.length; i+=3)
        {
                graphics.moveTo(vertices[2 * indices[i]], vertices[2 * indices[i] + 1]);
                graphics.lineTo(vertices[2 * indices[i + 1]], vertices[2 * indices[i + 1] + 1]);
                graphics.moveTo(vertices[2 * indices[i]], vertices[2 * indices[i] + 1]);
                graphics.lineTo(vertices[2 * indices[i + 2]], vertices[2 * indices[i + 2] + 1]);
 
        }
 
}


Foristel 04.03.2013 20:39

ясно.
думаю, что отдельные ребра (и любые линии в этой плоскости)
можно делать самим drawTriangles (задавая очень малое расстояние между одной парой вершин),
тогда и с видимостью рёбер при вращении всего объекта всё должно быть в порядке,
только громоздко получится.
...а жаль, что нельзя залезть в drawTriangles:)

alatar 04.03.2013 20:58

Цитата:

Как сделать видимыми только рёбра контура (а диагональные - невидимыми) - ?
Наложить растровую текстуру с контуром квадрата.

Добавлено через 19 минут
Модифицированный пример от Adobe
Код AS3:

package
{
        import flash.display.BitmapData;
        import flash.display.Graphics;
        import flash.display.Sprite;
        import flash.display.StageAlign;
        import flash.display.StageScaleMode;
        import flash.events.Event;
        import flash.geom.Rectangle;
        import flash.utils.getTimer;
 
        public class Triangles extends Sprite
        {
                // plane vertex coordinates (and t values)
                private var x1:Number = -100,    y1:Number = -100,    z1:Number = 0,    t1:Number = 0;
                private var x2:Number = 100,    y2:Number = -100,    z2:Number = 0,    t2:Number = 0;
                private var x3:Number = 100,    y3:Number = 100,    z3:Number = 0,    t3:Number = 0;
                private var x4:Number = -100,    y4:Number = 100,    z4:Number = 0,    t4:Number = 0;
                private var focalLength:Number = 200;     
                // 2 triangles for 1 plane, indices will always be the same
                private var indices:Vector.<int>;
 
                private var container:Sprite;
 
                private var bitmapData:BitmapData;
 
                public function Triangles()
                {
                        stage.align = StageAlign.TOP_LEFT;
                        stage.scaleMode = StageScaleMode.NO_SCALE;
 
                        indices =  new Vector.<int>();
                        indices.push(0,1,3, 1,2,3);
 
                        bitmapData = new BitmapData(200, 200, false, 0x00000000);
                        bitmapData.fillRect(new Rectangle(2, 2, 196, 196), 0xFFFFFF);
 
                        container = new Sprite(); // container to draw triangles in
                        container.x = 200;
                        container.y = 200;
                        addChild(container);
 
                        addEventListener(Event.ENTER_FRAME, rotatePlane);
                }
 
                private function rotatePlane(event:Event):void {
                        // rotate vertices over time
                        var ticker:Number = getTimer()/400;
                        z2 = z3 = -(z1 = z4 = 100*Math.sin(ticker));
                        x2 = x3 = -(x1 = x4 = 100*Math.cos(ticker));
 
                        // calculate t values
                        t1 = focalLength/(focalLength + z1);
                        t2 = focalLength/(focalLength + z2);
                        t3 = focalLength/(focalLength + z3);
                        t4 = focalLength/(focalLength + z4);
 
                        // determine triangle vertices based on t values
                        var vertices:Vector.<Number> = new Vector.<Number>();
                        vertices.push(x1*t1,y1*t1, x2*t2,y2*t2, x3*t3,y3*t3, x4*t4,y4*t4);
                        // set T values allowing perspective to change
                        // as each vertex moves around in z space
                        var uvtData:Vector.<Number> = new Vector.<Number>();
                        uvtData.push(0,0,t1, 1,0,t2, 1,1,t3, 0,1,t4);
 
                        // draw
                        container.graphics.clear();
                        container.graphics.beginBitmapFill(bitmapData);
                        container.graphics.drawTriangles(vertices, indices, uvtData);
                }
        }
}



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

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