achja ich hab das so hingezaubert
Delphi-Quellcode:
function transform3d(p: TPolygon):TPolygon;
var
f1, f2, f3 : single;
q: TPOlygoN;
const fov = 300;
begin
// rotation
q := p;
q.a.x := round( p.a.x * cos(vp_a) + p.a.z * sin(vp_a));
q.a.z := round( p.a.z * cos(vp_a) - p.a.x * sin(vp_a));
q.b.x := round( p.b.x * cos(vp_a) + p.b.z * sin(vp_a));
q.b.z := round( p.b.z * cos(vp_a) - p.b.x * sin(vp_a));
q.c.x := round( p.c.x * cos(vp_a) + p.c.z * sin(vp_a));
q.c.z := round( p.c.z * cos(vp_a) - p.c.x * sin(vp_a));
p :=q;
q.a.z := q.a.z+ vp_org.z;
q.b.z := q.b.z+ vp_org.z;
q.c.z := q.c.z+ vp_org.z;
q.a.x := round( p.a.x * cos(vp_b) + p.a.y * sin(vp_b));
q.a.y := round( p.a.y * cos(vp_b) - p.a.x * sin(vp_b));
q.b.x := round( p.b.x * cos(vp_b) + p.b.y * sin(vp_b));
q.b.y := round( p.b.y * cos(vp_b) - p.b.x * sin(vp_b));
q.c.x := round( p.c.x * cos(vp_b) + p.c.y * sin(vp_b));
q.c.y := round( p.c.y * cos(vp_b) - p.c.x * sin(vp_b));
// projektion
f1 := fov/(max(10,(fov+q.a.z))); // d/b
f2 := fov/(max(10,(fov+q.b.z)));
f3 := fov/(max(10,(fov+q.c.z)));
result.a.x := screenXC + round((q.a.x + vp_org.x)*f1);
result.b.x := screenXC + round((q.b.x + vp_org.x)*f2);
result.c.x := screenXC + round((q.c.x + vp_org.x)*f3);
result.a.y := screenYC - round((q.a.y + vp_org.y)*f1);
result.b.y := screenYC - round((q.b.y + vp_org.y)*f2);
result.c.y := screenYC - round((q.c.y + vp_org.y)*f3);
result.a.z := q.a.z+fov;
result.b.z := q.b.z+fov;
result.c.z := q.c.z+fov;
end;
sollte noch dazu sagen: result kriegt die tatsächlichen Bildschirmkoordinaten und als z-wert die berechneten z-werte zum interpolieren ( z-buffer)