Thema: Delphi Eigene 3D-Engine

Einzelnen Beitrag anzeigen

hboy

Registriert seit: 16. Jan 2004
364 Beiträge
 
#13

Re: Eigene 3D-Engine

  Alt 25. Jan 2005, 20:16
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)
Miniaturansicht angehängter Grafiken
3de_191.jpg  
Power is nothing without TControl
  Mit Zitat antworten Zitat