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.