OpenGl w delphim import figury z blendera

0

Witam, piszę program który importuje figurę z blendera z plików *.x ale jak uzupełniam macierze i próbuje w pętli je łączyć to obiekt nie wygląda jak bym chciał podobno ma być z tego samochód.

Tutaj chyba jest błąd:

glBegin(GL_QUAD_STRIP);
  for i:=0 to 5 do
  begin
    for j:=0 to 3 do
    begin
     k1 := random(255);
     k2 := random(255);
     k3 := random(255);
     glColor3ub(k1,k2,k3);
     glNormal3f(tab_mashnormals_wspu[tab_meshnormals_punkty[i][j]][0],
                tab_mashnormals_wspu[tab_meshnormals_punkty[i][j]][1],
                tab_mashnormals_wspu[tab_meshnormals_punkty[i][j]][2]
                );

     glVertex4f(
                tab_mash_wspu[tab_mash_punkty[i][j]][0],
                tab_mash_wspu[tab_mash_punkty[i][j]][1],
                tab_mash_wspu[tab_mash_punkty[i][j]][2],
                tab_mash_wspu[tab_mash_punkty[i][j]][1]);//tutaj moim zdaniem powinno by 3 ale nie wchodzi czemus
    end;
  end;

A całość kodu wygląda tak:

 
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OpenGL, ExtCtrls, StdCtrls, ComCtrls, Math;

type
  TForm1 = class(TForm)

    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormMouseWheel(Sender: TObject; Shift: TShiftState;
      WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);

  private
    k1, k2, k3: integer;
     RuchKamery :Boolean;
    KameraX, KameraY, KameraZ :Single;
    procedure Draw; // rysuje scene na zadanie jako OpenGL
  public
    { Public declarations }

  end;



var
  Form1: TForm1;

   tab_mash_punkty : array[0..5,0..3] of integer=
   (
(0, 3, 2, 1),
(4, 7, 6, 5),
(8, 11, 10, 9),
(12, 15, 14, 13),
(16, 19, 18, 17),
(20, 23, 22, 21)

 ); //Łaczenia z Mash

  tab_meshnormals_punkty : array[0..5,0..3] of integer=
  (
(0, 3, 2, 1),
(4, 7, 6, 5),
(8, 11, 10, 9),
(12, 15, 14, 13),
(16, 19, 18, 17),
(20, 23, 22, 21)

  ); //Łączenia z MeshNormals
  tab_mashnormals_wspu : array[0..23,0..2] of real =
  (
    (0.577349,0.577349,0.577349),
(0.577349,0.577349,-0.577349),
(-0.577349,0.577349,-0.577349),
(-0.577349,0.577349,0.577349),
(0.577349,-0.577349,0.577349),
(-0.577349,-0.577349,0.577349),
(-0.577349,-0.577349,-0.577349),
(0.577349,-0.577349,-0.577349),
(0.577349,0.577349,0.577349),
(0.577349,-0.577349,0.577349),
(0.577349,-0.577349,-0.577349),
(0.577349,0.577349,-0.577349),
(0.577349,0.577349,-0.577349),
(0.577349,-0.577349,-0.577349),
(-0.577349,-0.577349,-0.577349),
(-0.577349,0.577349,-0.577349),
(-0.577349,0.577349,-0.577349),
(-0.577349,-0.577349,-0.577349),
(-0.577349,-0.577349,0.577349),
(-0.577349,0.577349,0.577349),
(0.577349,-0.577349,0.577349),
(0.577349,0.577349,0.577349),
(-0.577349,0.577349,0.577349),
(-0.577349,-0.577349,0.577349)
  );
  //parametry z MeshNormals
  tab_mash_wspu : array[0..23,0..2] of real=
  (
    (1.491800,1.000000,1.000000),
(1.491800,1.000000,-1.000000),
(-1.491800,1.000000,-1.000000),
(-1.491800,1.000000,1.000000),
(1.491800,-1.000000,1.000000),
(-1.491800,-1.000000,1.000000),
(-1.491800,-1.000000,-1.000000),
(1.491800,-1.000000,-1.000000),
(1.491800,1.000000,1.000000),
(1.491800,-1.000000,1.000000),
(1.491800,-1.000000,-1.000000),
(1.491800,1.000000,-1.000000),
(1.491800,1.000000,-1.000000),
(1.491800,-1.000000,-1.000000),
(-1.491800,-1.000000,-1.000000),
(-1.491800,1.000000,-1.000000),
(-1.491800,1.000000,-1.000000),
(-1.491800,-1.000000,-1.000000),
(-1.491800,-1.000000,1.000000),
(-1.491800,1.000000,1.000000),
(1.491800,-1.000000,1.000000),
(1.491800,1.000000,1.000000),
(-1.491800,1.000000,1.000000),
(-1.491800,-1.000000,1.000000)
  ); //z mash współrzędne


implementation

{$R *.dfm}


procedure setupPixelFormat(DC:HDC);
const    // przygotowanie struktury opisujacej zadania do formatu wyswietlania
   pfd:TPIXELFORMATDESCRIPTOR = (
        nSize:sizeof(TPIXELFORMATDESCRIPTOR);
// wielkosc
        nVersion:1;
// wersja
        dwFlags:PFD_SUPPORT_OPENGL or PFD_DRAW_TO_WINDOW or
                PFD_DOUBLEBUFFER;
// udostepnienie podwojnego buforowania
        iPixelType:PFD_TYPE_RGBA;
// typ koloru
        cColorBits:24;
// zadana rozdzielczosc koloru
        cRedBits:0; cRedShift:0;
// bity koloru(ignorowane)
        cGreenBits:0;  cGreenShift:0;
        cBlueBits:0; cBlueShift:0;
        cAlphaBits:0;  cAlphaShift:0;   // wylaczenie buforu alfa
        cAccumBits: 0;
        cAccumRedBits: 0;  
// wylaczenie akumulacji bufora
        cAccumGreenBits: 0;     
// akumulowanie bitow (ignorowane)
        cAccumBlueBits: 0;
        cAccumAlphaBits: 0;
        cDepthBits:16;
// wielkosc bufora
        cStencilBits:0;
// bez buforu szablonu
        cAuxBuffers:0;
// bez buforu pomocniczego
        iLayerType:PFD_MAIN_PLANE;  
// glowna powloka
   bReserved: 0;
   dwLayerMask: 0;
   dwVisibleMask: 0;
   dwDamageMask: 0;         // brak widocznosci powloki, zniszczenie maski
   );
var pixelFormat:integer;
begin
   pixelFormat := ChoosePixelFormat(DC, @pfd);
   if (pixelFormat = 0) then
        exit;
   if (SetPixelFormat(DC, pixelFormat, @pfd) <> TRUE) then
        exit;
end;
procedure GLInit;
begin
   // ustawienie punktu projekcji
   glMatrixMode(GL_PROJECTION);
   glFrustum(-0.1, 0.1, -0.1, 0.1, 0.3, 2000.0); // definicja ostroslupa widzenia
   // punkt obserwacji
   glMatrixMode(GL_MODELVIEW);
   glEnable(GL_DEPTH_TEST);    // wlaczenie testowania glebokosci

end;



procedure TForm1.FormCreate(Sender: TObject);
var DC:HDC;
    RC:HGLRC;
     polozenieMyszy :TPoint;
begin
   DC:=GetDC(Handle);        // tutaj mozna stosowac dowolna kontrole okna
   SetupPixelFormat(DC);
   RC:=wglCreateContext(DC); // tworzy OpenGL okno na zewnatrz DC
   wglMakeCurrent(DC, RC);   // wlaczenie OpenGL okna jako aktywnego
   GLInit;
                     // inicjalizacja OpenGL
   KameraZ:=10; 
RuchKamery:=True; 
polozenieMyszy.X:=ClientWidth div 2; 
polozenieMyszy.Y:=ClientHeight div 2; 
if RuchKamery then Mouse.CursorPos:=ClientToScreen(polozenieMyszy);
end;

procedure TForm1.Draw;
var
i,j : integer;
begin
   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);  // czyszczenie buforow
   glLoadIdentity;
 // ustawienie kamery
  gluLookAt(KameraX,KameraY,KameraZ,
          0,0,0,
          0,1,0); 
  Randomize;
  glBegin(GL_QUAD_STRIP);
  for i:=0 to 5 do
  begin
    for j:=0 to 3 do
    begin
     k1 := random(255);
     k2 := random(255);
     k3 := random(255);
     glColor3ub(k1,k2,k3);
     glNormal3f(tab_mashnormals_wspu[tab_meshnormals_punkty[i][j]][0],
                tab_mashnormals_wspu[tab_meshnormals_punkty[i][j]][1],
                tab_mashnormals_wspu[tab_meshnormals_punkty[i][j]][2]
                );

     glVertex4f(
                tab_mash_wspu[tab_mash_punkty[i][j]][0],
                tab_mash_wspu[tab_mash_punkty[i][j]][1],
                tab_mash_wspu[tab_mash_punkty[i][j]][2],
                tab_mash_wspu[tab_mash_punkty[i][j]][1]);//tutaj moim zdaniem powinno by 3 ale nie wchodzi czemus
    end;
  end;




glEnd();

 SwapBuffers(wglGetCurrentDC);    // podmiana buforow
end;


procedure TForm1.FormPaint(Sender: TObject);
begin
Draw;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
const PI_2=PI/2.0;
var 
  srodek :TPoint; 
  dX,dY :Double; 
  R,_Phi,_Theta :Double; 
begin 
srodek.X:=ClientWidth div 2; 
srodek.Y:=ClientHeight div 2; 
R:=Sqrt(KameraX*KameraX+KameraY*KameraY+KameraZ*KameraZ); 
dX:=PI_2*(X-srodek.X)/srodek.X; 
dY:=-PI_2*(Y-srodek.Y)/srodek.Y;
_Theta:=Sqrt(dX*dX+dY*dY); //To jest przeksztalcenie z 2D kart. do 3D sferyczne (model) 
_Phi:=ArcTan2(dY,dX); 
KameraX:=R*cos(_Phi)*sin(_Theta);  
KameraY:=R*sin(_Phi)*sin(_Theta); 
KameraZ:=R*cos(_Theta);
Form1.Caption:='OpenGL '+glGetString(GL_VERSION)+':  Kamera  odl='+FloatToStr(R)+',Phi='+IntToStr(Round(180*_Phi/PI))+', Theta='+IntToStr(Round(180*_Theta/PI));
//Caption:='OpenGL '+glGetString(GL_VERSION)+':  Kamera (X,Y,Z)=('+FloatToStr(KameraX)+', '+FloatToStr(KameraY)+', '+FloatToStr(KameraZ)+')';
Draw;

end;

procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
const wsp=0.1;
begin 
//proporcjonalna zmiana pozycji wszystkich wsp. kamery 
KameraX:=KameraX*(1+Sign(WheelDelta)*wsp); 
KameraY:=KameraY*(1+Sign(WheelDelta)*wsp);
KameraZ:=KameraZ*(1+Sign(WheelDelta)*wsp); 
Draw;
end;

end.

0

Mała uwaga:

tab_mash_wspu[tab_mash_punkty[i][j]][1]);//tutaj moim zdaniem powinno by 3 ale nie wchodzi czemus
tab_mash_wspu : array[0..23,0..2] of real
0
  glBegin(GL_QUAD_STRIP);
  for i:=0 to 5 do
  begin
    for j:=0 to 3 do
    begin

zamiast pętli, zainteresuj się funkcjami które pobierają całe tablice współrzędnych: glNormal3fv, glVertex4fv itp.

0

no dobra ale jak nie wykorzystując pętli to zrobić inaczej?

0

przygotowujesz tablicę i odpalasz funkcję z v na końcu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1