AS3 fp10 drawtriangles и uvmapping, когда нет z-val - PullRequest
2 голосов
/ 01 ноября 2009

Я немного поиграюсь с новым API рисования fp10 и drawtriangles. Я создал кое-что, что я думаю, круто, хотя я не могу заставить работать ультрафиолетовое отображение так, как хочу. Так как я просто перемещаю точки в направлении z / y, у меня на самом деле нет значения z, чтобы вычислить ультрафиолетовое излучение. хотя растровая текстура искажается. я пытался вычислить «поддельное» z-значение с помощью x и y, но так как мои математические навыки ужасны, я не могу заставить его работать.

Я собрал небольшой пример здесь (код, очевидно, нуждается в очистке, но я буду беспокоиться об этом, когда у меня все заработает, как я хочу).

в этом примере z-val всегда будет 1, и никакое исправление перспективы не будет выполнено. поэтому мне очень нужна ваша помощь, чтобы выяснить, как я могу взять мои вычисленные точки x и y и превратить их в «фальшивые» точки z и использовать их, чтобы избежать искажений на карте / текстуре.

спасибо!

  package {

  import flash.display.BitmapData;
  import flash.display.Sprite;
  import flash.events.Event;
  import flash.geom.Point;

  public class Debug extends Sprite{

   private var bitmapData:BitmapData;

   private var plane:Plane;
   private var container:Sprite;

   public function Debug(){
    bitmapData = new slask(0, 0);

    container = new Sprite();
    container.x = 200;
    container.y = 200;
    this.addChild(container);

    plane = new Plane(bitmapData);
    container.addChild(plane);

    this.addEventListener(Event.ENTER_FRAME, render);
   }

   function render(e:Event):void{
    var mp:Point = new Point(container.mouseX, container.mouseY);
    plane.render(mp);
   }
  }

 }

 import flash.display.Sprite;
 import flash.geom.Point;
 import flash.geom.Vector3D;
 import flash.display.BitmapData;

 class Plane extends Sprite {

  private var indices:Vector.<int> = new Vector.<int>();  
  private var vertices:Vector.<Number>;
  private var uvtData:Vector.<Number>;

  private var focalLength:Number = 200;
  private var bitmapData:BitmapData;
  private var verts:Array;

  public function Plane(bmp:BitmapData){   
   bitmapData = bmp;

   verts = new Array();
   var sizes:Array = [
         {x: 0, y: 0, z:0},
         {x: 200, y: 0, z:0},
         {x: 0, y: 200, z:0},         
         {x: 200, y: 200, z:0}
        ];

   for(var i:int = 0; i < 4; i++){
    verts[i] = new Vert(sizes[i].x, sizes[i].y, sizes[i].z);
   }

   indices.push(0,1,2, 1,2,3);
  }

  public function render( mousePoint:Point ):void {
   for(var i:int = 0; i < 4; i++){
    verts[i].update(mousePoint);
   }
   drawMe();
  }

  private function drawMe():void {
   vertices = Vector.<Number>([]);
   uvtData = Vector.<Number>([]);

   var t1:Number = focalLength/(focalLength + verts[0].z);
   var t2:Number = focalLength/(focalLength + verts[1].z);
   var t3:Number = focalLength/(focalLength + verts[2].z);
   var t4:Number = focalLength/(focalLength + verts[3].z);

   vertices.push( verts[0].x*t1, verts[0].y*t1,
       verts[1].x*t2, verts[1].y*t2, 
       verts[2].x*t3, verts[2].y*t3, 
       verts[3].x*t4, verts[3].y*t4);

   uvtData.push(0,0,t1, 1,0,t2, 0,1,t3, 1,1,t4);

   this.graphics.clear();
   this.graphics.lineStyle(1, 0xFF0000);
   this.graphics.beginBitmapFill(bitmapData, null, false, true);
   this.graphics.drawTriangles(vertices, indices, uvtData);
  }

 }

 class Vert extends Vector3D {

  private var vx:Number = 0;
  private var vy:Number = 0; 

  private var orgX:Number;
  private var orgY:Number;  

  public function Vert(xx:int, yy:int, zz:int){
   x = orgX = xx;
   y = orgY = yy;
   z = zz;
  }

  public function update( mousePoint:Point ):void {
   var vertPoint:Point = new Point(x, y);
   var distance:Number = Point.distance(mousePoint, vertPoint);

   var dx:Number;
   var dy:Number;

   if (distance < 225) {
    var diff:Number = -distance * (225 - distance) / 225;
    var radian:Number = Math.atan2(mousePoint.y - orgY, mousePoint.x - orgX);
    var diffPoint:Point = Point.polar(diff*2, radian);
    dx = orgX + diffPoint.x;
    dy= orgY + diffPoint.y;
   } else {
    dx = orgX;
    dy = orgY;
   }

   vx += (dx - x) * 0.02;
   vy += (dy - y) * 0.02;
   vx *= 0.9;
   vy *= 0.9;

   x += vx;
   y += vy;
  }

 }

1 Ответ

1 голос
/ 31 июля 2011

Flash имеет изящную служебную функцию Utils3D.projectVectors (). Вы передаете все свои данные, и он вычисляет недостающие значения для координат Uvt. Вот что говорят доктора:

Вектор чисел, где каждые три числа представляют u, v и t элементы данных uvt. U и V - координата текстуры для каждая спроецированная точка. Значение t является значением глубины проецирования, расстояние от глаза до объекта Vector3D в поле зрения или в пространстве глаза. Вы должны предварительно выделить Вектор и указать значения u и v. The Метод projectVectors заполняет значение t для каждой спроецированной точки.

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/geom/Utils3D.html#projectVectors()

...