![]() |
|
||||||||||
|
|||||
|
Есть грань-четырёхугольник, созданная методом drawTriangles(),
она состоит из двух треугольников. Управляя lineStyle(), можно сделать все рёбра невидимыми или видимыми. Как сделать видимыми только рёбра контура (а диагональные - невидимыми) - ? Т.е. возможно ли выборочно прорисовывать рёбра методом drawTriangles() - ? Если да, то как? Возможно, для этого потребуется модифицировать сам метод drawTriangles(), можно ли где-то увидеть исходный код этого метода? |
|
|||||
|
с родным drawTriangles ничего этого нельзя - ни выборочно рисовать, ни посмотреть код, ни модифицировать
остается рисовать треугольники с пустым lineSyle(), а затем линии обычным lineTo если данные для drawTriangles составляются по каким-то определенным правилам, то можно все это в какую-то утилиту завернуть например, для варианта когда диагональ обязательно последняя в каждой тройке 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]); } } |
|
|||||
|
ясно.
думаю, что отдельные ребра (и любые линии в этой плоскости) можно делать самим drawTriangles (задавая очень малое расстояние между одной парой вершин), тогда и с видимостью рёбер при вращении всего объекта всё должно быть в порядке, только громоздко получится. ...а жаль, что нельзя залезть в drawTriangles ![]() |
|
|||||
|
Цитата:
Добавлено через 19 минут Модифицированный пример от Adobe 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, время: 22:58. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|