Seite 1 von 1

Einfache Demo mit Opengl , Fahrgestell mit 3 Kranauslegern

Verfasst: 12.12.2006 22:16
von wasser
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.

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

Verfasst: 12.12.2006 22:56
von Kaeru Gaman
> Habe festgestellt, das die Daten hier nicht reinpassen

wie meinst du "hier nicht reinpassen"?

Verfasst: 13.12.2006 00:25
von wasser
Wenn ich die Daten mit "

Code: Alles auswählen

 " reinsetze, fehlen unten die letzten 100 Zeilen

und in  der Klammer von "[code4errsasx]" befinden sich Buchstaben und Zahlen, an die 8 Stück.

Verfasst: 13.12.2006 01:36
von Kaeru Gaman
aber es ist klartext?
dann poste es notfalls in zwei getrennten code-tags,
und schreib dazu, das man es ins selbe file patchen soll...
die maximallänge von einem code-abschnitt ist begrenzt im forum...

noch besser wäre es allerdings, wenn du das file irgendwo hochlädst und per downloadlink anbietest.
eigentlich muss man es ja nicht im klartext lesen, also muss man es auch nicht unbedingt komplett posten... ;)

> "[code4errsasx]"
hum... wasn das fürn tag? den kenn ich ja garnich...

Verfasst: 13.12.2006 12:15
von wasser
> "[code4errsasx]"
Die Buchstaben kamen nach dem Hochladen von selber rein.

MFG

Verfasst: 14.12.2006 13:49
von xperience2003
mach mal ne exe bitte , wuerds gern anschauen
..hab hier auch nich ueberall pure drauf ^^

Verfasst: 14.12.2006 22:05
von wasser
Schick mir eine Nachricht mit deiner Mailadresse
, dann geht es besser?
Es gibt dann den Sourcecode und die Körperdaten.

Oder es sagt mal einer, wie ich hier eine zip reinstellen kann.

Verfasst: 14.12.2006 22:55
von 125
Lad doch den Code und die Exe gezippt bei Rapidshare.com hoch :)
Dann kannste die Zip hier verlinken.

mfg
125

Verfasst: 15.12.2006 00:28
von Kaeru Gaman
Kaeru Gaman hat geschrieben:noch besser wäre es allerdings, wenn du das file irgendwo hochlädst und per downloadlink anbietest.

Verfasst: 15.12.2006 01:14
von 125
Kaeru Gaman hat geschrieben:
Kaeru Gaman hat geschrieben:noch besser wäre es allerdings, wenn du das file irgendwo hochlädst und per downloadlink anbietest.
....
wasser hat geschrieben: Oder es sagt mal einer, wie ich hier eine zip reinstellen kann.
....

Kaeru take it easy ;)