Einfache Demo mit Opengl , Fahrgestell mit 3 Kranauslegern
Verfasst: 12.12.2006 22:16
Ein neues Opengl-Beispiel mit einem einfachen Fahrgestell und 3 Kranarmen hintereinander.
Fahrgestell und Kranarme können mit den Tasten bewegt werden :
Fahrgestell: Q,E,W,S
Kranarme :T,G,Z,H,U,J
Gitternetz : A,Y und die Pfeiltaten
Die 3d-Daten abspeichern als test1.x
Wurden mit dem Programm Blender als "test1.x" exportiert
Habe festgestellt, das die Daten hier nicht reinpassen, wie kann ich die Daten zugänglich machen ?
Wer die Musterdaten haben möchte ,kann mir hier im Forum eine Nachricht schicken.
Fahrgestell und Kranarme können mit den Tasten bewegt werden :
Fahrgestell: Q,E,W,S
Kranarme :T,G,Z,H,U,J
Gitternetz : A,Y und die Pfeiltaten
Die 3d-Daten abspeichern als test1.x
Wurden mit dem Programm Blender als "test1.x" exportiert
Habe festgestellt, das die Daten hier nicht reinpassen, wie kann ich die Daten zugänglich machen ?
Wer die Musterdaten haben möchte ,kann mir hier im Forum eine Nachricht schicken.
Code: Alles auswählen
XIncludeFile "glu.pbi"
; oder XIncludeFile "opengl.pbi"
Global x1.f,z1.f,dx.f,dz.f,anglezz.f
Global xrot.f
Global ausleger_1.f=0.0,ausleger_2.f=0.0,ausleger_3.f=0.0
Global AngleX.f = 25.0
Global AngleY.f = 3.0
Global AngleZ.f = 0.0
Global X.f = 2.0
Global Y.f = -8.0
Global Z.f = -15.0
Global Dim zahl_3d.f(12,2000,2)
Global Dim zahl_farbe.f(12,2)
Global durchlauf_3d.w,anzahl.w
Global i1.w,ii.w,zz1.w
Global text.s
Global q.l = gluNewQuadric_()
gluQuadricNormals_(q, #GL_SMOOTH)
gluQuadricTexture_(q, #GL_TRUE)
Global *LightAmb = AllocateMemory(4*4)
Global *LightDif = AllocateMemory(4*4)
Global *LightPos = AllocateMemory(4*4)
PokeF(*LightAmb,0.8):PokeF(*LightAmb+4,0.8):PokeF(*LightAmb+8,0.8):PokeF(*LightAmb+12,1.0)
PokeF(*LightDif,0.15):PokeF(*LightDif+4,0.15):PokeF(*LightDif+8,0.15):PokeF(*LightDif+12,1.0)
PokeF(*LightPos,-4.0):PokeF(*LightPos+4,4.0):PokeF(*LightPos+8,-4.0):PokeF(*LightPos+12,1.0)
Structure GLscreen
container.l
hWnd.l
hDC.l
EndStructure
Procedure FindNextExp(Val)
While a < Val
a = 1 << b
b + 1
Wend
ProcedureReturn a
EndProcedure
Procedure GLLoadAlphaTexture(Filename.s, TexFilter, TransparentColor)
img = LoadImage(#PB_Any, Filename.s)
Width.l = FindNextExp(ImageWidth(img))
Height.l = FindNextExp(ImageHeight(img))
ResizeImage(img, Width, Height)
Size.l = Width * Height * 4
Dim ImageData.b(Size)
hdc = StartDrawing(ImageOutput(img))
bmi.BITMAPINFO
bmi\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
bmi\bmiHeader\biWidth = Width
bmi\bmiHeader\biHeight = Height
bmi\bmiHeader\biPlanes = 1
bmi\bmiHeader\biBitCount = 32
bmi\bmiHeader\biCompression = #BI_RGB
bmi\bmiHeader\biSizeImage = (bmi\bmiHeader\biWidth * bmi\bmiHeader\biHeight * bmi\bmiHeader\biBitCount / 8)-1
GetDIBits_(hdc, ImageID(img), 0, bmi\bmiHeader\biHeight, @ImageData(0), bmi, #DIB_RGB_COLORS)
red = Red (TransparentColor)
green = Green(TransparentColor)
blue = Blue (TransparentColor)
For k=0 To Size-1 Step 4
b = ImageData(k ) & $FF
g = ImageData(k+1) & $FF
r = ImageData(k+2) & $FF
If r = red And g = green And b = blue
ImageData(k+3) = 0
Else
ImageData(k+3) = $FF
EndIf
ImageData(k+2) = b
ImageData(k ) = r
Next
StopDrawing()
glGenTextures_(1, @Tex) ;Textur speichern
If TexFilter = 0 ;versch. Textur-Filter
glBindTexture_(#GL_TEXTURE_2D, Tex)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_NEAREST)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_NEAREST)
glTexImage2D_(#GL_TEXTURE_2D, 0, #GL_RGBA, Width, Height, 0, #GL_RGBA, #GL_UNSIGNED_BYTE, @ImageData(0))
ElseIf TexFilter = 1
glBindTexture_(#GL_TEXTURE_2D, Tex)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR)
glTexImage2D_(#GL_TEXTURE_2D, 0, #GL_RGBA, Width, Height, 0, #GL_RGBA, #GL_UNSIGNED_BYTE, @ImageData(0))
ElseIf TexFilter = 2
glBindTexture_(#GL_TEXTURE_2D, Tex)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MAG_FILTER, #GL_LINEAR)
glTexParameteri_(#GL_TEXTURE_2D, #GL_TEXTURE_MIN_FILTER, #GL_LINEAR_MIPMAP_NEAREST)
gluBuild2DMipmaps_(#GL_TEXTURE_2D, 4, Width, Height, #GL_RGBA, #GL_UNSIGNED_BYTE, @ImageData(0))
EndIf
FreeImage(img)
ProcedureReturn Tex
EndProcedure
Procedure OpenGLScreen(*p.GLscreen,xx,yy,ww,hh)
If *p
container = ContainerGadget(#PB_Any,xx,yy,ww,hh)
If container
hwnd = GadgetID(container)
hdc = GetDC_(hwnd)
pfd.PIXELFORMATDESCRIPTOR
pfd\nSize = SizeOf(PIXELFORMATDESCRIPTOR)
pfd\nVersion = 1
pfd\dwFlags = #PFD_SUPPORT_OPENGL | #PFD_DOUBLEBUFFER | #PFD_DRAW_TO_WINDOW
pfd\iLayerType = #PFD_MAIN_PLANE
pfd\iPixelType = #PFD_TYPE_RGBA
pfd\cColorBits = 24
pfd\cDepthBits = 32
pixformat = ChoosePixelFormat_(hdc, pfd)
SetPixelFormat_(hdc, pixformat, pfd)
hrc = wglCreateContext_(hdc)
wglMakeCurrent_(hdc, hrc)
SwapBuffers_(hdc)
*p\container = container
*p\hWnd = GadgetID(container)
*p\hDC = hdc
glLightfv_(#GL_LIGHT0, #GL_AMBIENT, *LightAmb)
glLightfv_(#GL_LIGHT0, #GL_DIFFUSE, *LightDif)
glLightfv_(#GL_LIGHT0, #GL_POSITION, *LightPos)
glEnable_(#GL_LIGHT0)
glEnable_(#GL_LIGHTING)
glEnable_(#GL_DEPTH_TEST)
glClearColor_( 0.0, 0.0, 0.0, 0.0)
glEnable_ (#GL_COLOR_MATERIAL)
glEnable_(#GL_TEXTURE_2D)
glEnable_(#GL_ALPHA_TEST)
glAlphaFunc_(#GL_GREATER, 0.0)
ProcedureReturn 1
EndIf
EndIf
EndProcedure
Procedure SetCamera(X.f, Y.f, Z.f, AngleX.f, AngleY.f, AngleZ.f, Near.f = 0.1, Far.f = 100.0) ;Sets the cameraposition and the FOV
glMatrixMode_(#GL_PROJECTION)
glLoadIdentity_()
gluPerspective_(45, 1, Near.f, Far.f)
glRotatef_(AngleX, 1.0, 0.0, 0.0)
glRotatef_(AngleY, 0.0, 1.0, 0.0)
glRotatef_(AngleZ, 0.0, 0.0, 1.0)
glTranslatef_(X, Y, Z)
glMatrixMode_(#GL_MODELVIEW)
glDepthRange_(Near.f, Far.f)
EndProcedure
Procedure load_vertex_x(name.s)
If ReadFile(0, name.s)
For durchlauf_3d=1 To 12
text=LTrim(ReadString(0))
While Mid(text,0,6)<>"Mesh {"
text=LTrim(ReadString(0))
If text="} // End of the Root Frame"
Break 2
EndIf
Wend
text=LTrim(ReadString(0))
zz1=Val(StringField(text,1, " "))
zahl_3d(0,0,0)=durchlauf_3d
zahl_3d(durchlauf_3d,0,0)=zz1
For i1=1 To zz1
text=LTrim(ReadString(0))
zahl_3d(durchlauf_3d,i1,0)=ValF(StringField(text, 1, ";"))
zahl_3d(durchlauf_3d,i1,1)=ValF(StringField(text, 2, ";"))
zahl_3d(durchlauf_3d,i1,2)=ValF(StringField(text, 3, ";"))
Next
text=LTrim(ReadString(0))
While Mid(text,0,8)<> "Material"
text=LTrim(ReadString(0))
Wend
text=LTrim(ReadString(0))
zahl_farbe(durchlauf_3d,0)=ValF(StringField(text, 1, ";"))
zahl_farbe(durchlauf_3d,1)=ValF(StringField(text, 2, ";"))
zahl_farbe(durchlauf_3d,2)=ValF(StringField(text, 3, ";"))
Next
EndIf
EndProcedure
Procedure Draw_Cube(anfang.w,ende.w)
For anzahl=anfang To ende
glColor3f_(zahl_farbe(anzahl,0),zahl_farbe(anzahl,1),zahl_farbe(anzahl,2))
glBegin_(#GL_POLYGON)
For ii=1 To zahl_3d(anzahl,0,0)
glVertex3f_ (zahl_3d(anzahl,ii,0),zahl_3d(anzahl,ii,1),zahl_3d(anzahl,ii,2))
Next
glEnd_()
Next
EndProcedure
If OpenWindow(0, 0, 0, 800,600, "TEST",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0))
ButtonGadget(0,520,10,80,20, "links")
ButtonGadget(1,520,40,80,20, "rechts")
If OpenGLScreen(screen.GLscreen,10,10,500,500)
load_vertex_x("test1.x")
Repeat
glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT | #GL_STENCIL_BUFFER_BIT)
SetCamera( X, Y, Z, AngleX, AngleY, AngleZ)
glLoadIdentity_()
glPushMatrix_()
glTranslatef_(0.0,0.0,0.0)
glRotatef_(90.0,1,0,0)
glColor3f_(1.0,1.0,1.0)
glBegin_(#GL_LINES)
For n.w = -10 To 10
glVertex3f_( n, -10, 0)
glVertex3f_( n, 10, 0)
glVertex3f_( -10, n, 0)
glVertex3f_ (10, n, 0)
Next n
glEnd_()
glPopMatrix_()
glPushMatrix_()
glTranslatef_(dx,0,dz)
glRotatef_(anglezz,0,1,0)
draw_cube(2,6)
glPushMatrix_()
glTranslatef_(0,0.3,0)
glRotatef_(90,0,1,0)
glRotatef_(ausleger_1,0,0,1)
draw_cube(1,1)
glTranslatef_(0,0.75,0.07)
glRotatef_(ausleger_2,0,0,1)
draw_cube(1,1)
glTranslatef_(0,0.75,0.07)
glRotatef_(ausleger_3,0,0,1)
draw_cube(1,1)
glPopMatrix_()
glPopMatrix_()
glPopMatrix_()
SwapBuffers_(screen\hdc)
Event = WaitWindowEvent(0)
WindowID = EventWindow()
GadgetID = EventGadget()
EventType = EventType()
If Event = #PB_Event_Gadget
If GadgetID = 0
EndIf
If GadgetID = 1
EndIf
EndIf
If GetAsyncKeyState_(#VK_UP)
Z + Cos(AngleX/180*#PI)*Cos(AngleY/180*#PI)*0.01
Y + Sin(AngleX/180*#PI)*0.01
X - Sin(AngleY/180*#PI)*Cos(AngleX/180*#PI)*0.01
ElseIf GetAsyncKeyState_(#VK_DOWN)
Z - Cos(AngleX/180*#PI)*Cos(AngleY/180*#PI)*0.01
Y - Sin(AngleX/180*#PI)*0.01
X + Sin(AngleY/180*#PI)*Cos(AngleX/180*#PI)*0.01
EndIf
If GetAsyncKeyState_(#VK_LEFT)
AngleY -0.02
ElseIf GetAsyncKeyState_(#VK_RIGHT)
AngleY + 0.02
EndIf
If GetAsyncKeyState_(#VK_A)
AngleX + 0.02
ElseIf GetAsyncKeyState_(#VK_Y)
AngleX - 0.02
EndIf
If GetAsyncKeyState_(#VK_W)
x1=Sin(Anglezz/180*#PI)*0.001
z1=Cos(Anglezz/180*#PI)*0.001
dx+x1
dz+z1
ElseIf GetAsyncKeyState_(#VK_S)
x1=Sin(Anglezz/180*#PI)*0.001
z1=Cos(Anglezz/180*#PI)*0.001
dx-x1
dz-z1
EndIf
If GetAsyncKeyState_(#VK_Q)
Anglezz + 0.05
ElseIf GetAsyncKeyState_(#VK_E)
Anglezz - 0.05
EndIf
If GetAsyncKeyState_(#VK_G)
ausleger_1 + 0.05
ElseIf GetAsyncKeyState_(#VK_T)
ausleger_1 - 0.05
EndIf
If GetAsyncKeyState_(#VK_H)
ausleger_2 + 0.05
ElseIf GetAsyncKeyState_(#VK_Z)
ausleger_2 - 0.05
EndIf
If GetAsyncKeyState_(#VK_J)
ausleger_3 + 0.05
ElseIf GetAsyncKeyState_(#VK_U)
ausleger_3 - 0.05
EndIf
Until Event = #PB_Event_CloseWindow
ReleaseDC_(screen\hWnd,screen\hDC)
EndIf
EndIf