Я немного поиграюсь с новым 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;
}
}