Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Opengl bewegt einfachen ms3d-Körper mit 3 Gelenken

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
hundert



Anmeldungsdatum: 06.11.2006
Beiträge: 2

BeitragVerfasst am: 08.11.2006, 10:53    Titel: Opengl bewegt einfachen ms3d-Körper mit 3 Gelenken Antworten mit Zitat

Guten Tag.
Habe mit Opengl einpaar Experimente gemacht.

Habe ein ms3d-Körper mit Milkshape erstellt (Würfel, 2 Räder, 3 Gelenkarme hintereinander und einen Propeller).

Habe die milkshapemodel.bi so geändert, das ich aus der einen ms3d-datei jeden Mesh-körper (Würfel,Räder,Gelenke) mit Nummer herauslese und ihn dann einfärbe wie ich es möchte und dann darstelle.

Die milkshapemodel.bi kann nur Texturen einlesen und keine Farbwerte die ich mit Milkshape auf den Weg gebe. Eine Textur für einen komplexen Körper ist sehr schwer zu erstellen. Das einfärben ist viel einfacher und man kann es jederzeit schell ändern.

0=Würfel
1=Rad
2=Rad
3-5=Gelenkarme
6=Propeller

Das besondere ist :

Ich kann den Körper mit Räder und 3 Gelenken komplex bewegen , vor , zurück, rechts ,links , hoch , runter und zusätzliche alle 3 Gelenkarme unabhängig Heben und Senken (habe 90 Grad festgelegt für jede Richtung) und den Propeller am ersten Gelenkstab drehen.

Wichtig ist dabei, das die Gelenke im Nullpunkt von milkshape erstellt werden und dann dementsprechend in dem Opengl-programm an der Y-Achse so verschoben werden, das sie dann übereinander liegen und sich dann auch im Nullpunkt drehen.

Die 3d-Darstellung habe ich hier aus dem Forum und ein bisschen umgemodelt, Es lässt sich alles nur über Tasten bewegen und nicht über die Maus, ich wollte es so.

Schaut euch den Code mal an.

Hier sieht man wieder, wie einfach sich mit Opengl z.b. ein Kran mit Gelenkarmen bauen lässt.

glPushMatrix und glPopMatrix ist das Wichtige, darin befinden sich die Gelenkarme veschachtelt, damit jedes Teil unabhängig ist , aber trotzdem wieder mit dem Fahrgestell (Würfel,Räder) mitgenommen wird.

Es ist schon sehr Spannend mit Opengl, wer sich dafür interessiert.

Den ms3d-Code und die geänderte milkshapemodel.bi kann ich auf Wunsch zusenden.

Code:


 
    #Include "\gl\gl.bi"
    #Include "\gl\glu.bi"
    #Include "fbgfx.bi"   
    #Include Once "milkshapemodel1.bi"
   
    Dim Shared MilkShapeModel As MODEL   

    Type typcam
        x               as single
        y               as single
        z               as single
        b               as single
        h               as single
    end type

    type infotyp
        fovy    as double   'bildschirmöffnungswinkel
        znear   as double
        zfar    as double
    end type

    const degrad    = atn(1) / 45
    const fensterc  = 32
    const fensterx  = 800
    const fenstery  = 600
    const fensterv  = 0

    declare sub INIT_GL ()
    declare sub draw_scene()
    declare sub INIT_cam ()
    declare sub INIT_info ()
    declare sub eingabe ()
   
    dim shared as typcam cam
    dim shared as infotyp info
    Dim Shared As Single x,y,z ,d ,r ,dreh   
    Dim Shared As Single dx, dy,x1,y1,v_cam,v_ent,v_lr,k,k1,k2

    v_cam=0.05
    v_ent=0.002
    v_lr=0.1
    z=0.6
    x = 5
    y = 3
   
    INIT_info
    INIT_GL
    INIT_cam
   
    do
        eingabe
        draw_scene
    loop until multikey(SC_ESCAPE)

Sub INIT_GL () 
    Model_Init Varptr(MilkShapeModel)
   Model_LoadModelData (Varptr(MilkShapeModel), ExePath + "/data/test.ms3d")
   
    screenres fensterx, fenstery, fensterc,, 2 or fensterv
    windowtitle "Mein Titel"

    GLviewport 0, 0, fensterx, fenstery
    GLmatrixmode gl_projection
    GLloadidentity

    GLUperspective info.fovy, fensterx / fenstery, info.znear, info.zfar
    GLmatrixmode GL_modelview
    GLloadidentity   
   
    glEnable GL_TEXTURE_2D
    glShadeModel GL_SMOOTH
   glClearColor 0.0, 0.0, 0.0, 0.0
   glClearDepth 1.0
   glEnable GL_DEPTH_TEST
   glDepthFunc GL_LEQUAL
   glEnable GL_COLOR_MATERIAL
   glHint GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST   
   
   glEnable GL_LIGHT1                                 
              
End Sub

sub eingabe()

    dim as integer vx, vy
    dim as single difx, dify, difz
   
    If MultiKey(SC_y) Then
        dreh+=0.005
        if dreh>2.0 then dreh=2.0
    End if
   
    If MultiKey(SC_x) Then
       dreh-=0.005
       if dreh<0 then dreh=0
    End If 
   
    If MultiKey(SC_o) Then
       k2+=0.1
       if k2>90 then k2=90
    End if
   
    If MultiKey(SC_l) Then
       k2-=0.1
       if k2< -90 then k2=-90
    End if
   
    If MultiKey(SC_i) Then
       k1+=0.1
       if k1>90 then k1=90
    End if
   
    If MultiKey(SC_k) Then
       k1-=0.1
       if k1< -90 then k1=-90
    End if
    If MultiKey(SC_f) Then
       k+=0.1
       if k>90 then k=90
    End if
   
    If MultiKey(SC_v) Then
       k-=0.1
       if k< -90 then k=-90
    End if
   
    If MultiKey(SC_a) Then
       vx=vx+1
    End if
   
    If MultiKey(SC_d) Then
       vx=vx-1
    End if
   
    If MultiKey(SC_w) Then
       vy=vy+1
    End if
   
    If MultiKey(SC_s) Then
       vy=vy-1
    End if
   
    If MultiKey(SC_g) Then
        cam.b = cam.b + v_cam
    End if
   
    If MultiKey(SC_j) Then
        cam.b = cam.b - v_cam
    End if
   
    If MultiKey(SC_h) Then
        cam.h = cam.h + v_cam
    End if
   
    If MultiKey(SC_n) Then
        cam.h = cam.h - v_cam
    End if
   
    difx = vx/80
    dify = vy/80
   
    if cam.x < -20 then cam.x = -20
    if cam.x >  20 then cam.x =  20
    if cam.y < -20 then cam.y = -20
    if cam.y >  20 then cam.y =  20
    If cam.z < 0.5 Then cam.z = 0.5
    if cam.z >  20 then cam.z =  20
   
    if cam.b >  180 then cam.b = cam.b - 360
    if cam.b < -180 then cam.b = cam.b + 360
    if cam.h >   90 then cam.h =  90
    if cam.h <  -90 then cam.h = -90

    cam.x += difx * cos(degrad * cam.b) + dify * sin(degrad * cam.b) + _
             difz * sin(degrad * cam.h) * sin(degrad * cam.b)
    cam.y += dify * cos(degrad * cam.b) * cos(degrad * cam.h) - _
             difx * sin(degrad * cam.b) + _
             difz * sin(degrad * cam.h) * cos(degrad * cam.b)
    cam.z += difz * Cos(degrad * cam.h) - dify * Sin(degrad * cam.h)     
   
    If MultiKey(SC_r) Then
        z+=0.01
        If z>5 Then z=5.0
    End if
   
    If MultiKey(SC_t) Then
        z-=0.01 
        If z<0.6 Then z=0.6
    End If   
   
    If MultiKey(SC_right) Then
            d+=v_lr
            If d>360 Then d=0
        End If 
       
    If MultiKey(SC_left) Then
        d-=v_lr
        If d<0 Then d=360
    End If   
       
    IF MULTIKEY(SC_up) THEN
        x1=Sin(d*degrad)*v_ent   
        y1=Cos(d*degrad)*v_ent
        dx+=x1
        dy+=y1
    End If
   
    IF MULTIKEY(SC_down) THEN
        x1=Sin(d*degrad)*v_ent 
        y1=Cos(d*degrad)*v_ent
        dx-=x1
        dy-=y1
    End If
   
    r=r+dreh
    if r > 360 then r=0
end sub

Sub draw_scene()   
   
    glClear  GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT   
                 
    glLoadIdentity
    glRotatef cam.h-90, 1, 0, 0
   glRotatef cam.b   , 0, 0, 1
   glTranslatef -cam.x, -cam.y, -cam.z
     
    glBegin GL_LINES           
        glColor3f 1.0,1.0,1.0
        Dim n As Integer
        For n = -10 To 10
            glVertex3f n, -10, 0
            glVertex3f n, 10, 0
            glVertex3f -10, n, 0
            glVertex3f 10, n, 0
        Next n
    glEnd      
   
    glPushMatrix
        glTranslatef dx, dy, z 
        glRotatef -d,0, 0, 1
   
        glPushMatrix
            glColor3f 1.0,0.0,0.0
            Model_Draw (@MilkShapeModel,0) 
        glPOPMatrix
   
        glPushMatrix
            glColor3f 0.0,1.0,0.0
            Model_Draw (@MilkShapeModel,1) 
        glPOPMatrix
   
        glPushMatrix
            glColor3f 0.0,0.0,1.0
            Model_Draw (@MilkShapeModel,2) 
        glPOPMatrix
   
        glPushMatrix
            glTranslatef 0, 0, 0.3
            glColor3f 1.0,0.0,1.0
            glRotatef 90.0+k,1, 0, 0
            Model_Draw (@MilkShapeModel,3)
            glPushMatrix
                glTranslatef 0, 1.3, 0
                glRotatef r,0, 1, 0
                glRotatef 90,0, 1, 0
                glColor3f 0.0,0.0,1.0
                Model_Draw (@MilkShapeModel,6) 
            glPOPMatrix
            glPushMatrix
                glColor3f 1.0,1.0,0.0
                glTranslatef 0, 1.6, 0
                glRotatef k1,1, 0, 0
                Model_Draw (@MilkShapeModel,4)
                glPushMatrix
                    glColor3f 0.5,1.7,1.0
                    glTranslatef 0, 1.6, 0
                    glRotatef k2,1, 0, 0
                    Model_Draw (@MilkShapeModel,5)
                glPOPMatrix
            glPOPMatrix
        glPOPMatrix
    glPOPMatrix
 
    glFlush
    flip
   
end sub

sub INIT_cam ()
    cam.x = 0
    cam.y = -10
    cam.z = 5
    cam.h = 30
    cam.b = 0
end sub

sub INIT_info ()
    info.fovy = 45
    info.znear = .1
    info.zfar = 100
end sub
           
         
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 09.11.2006, 00:27    Titel: Antworten mit Zitat

sorry dass ich so blöd frag aber warum gibts du für jede multikey-taste die einzeiligen aktionen als dreizeiler an? durchgeknallt du weißt hoffentlich schon, dass man auch einfach nur "if bedingung then aktion" schreiben kann ohne endif dann? oO
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Lutz Ifer
Grillmeister


Anmeldungsdatum: 23.09.2005
Beiträge: 555

BeitragVerfasst am: 10.11.2006, 19:24    Titel: Re: Opengl bewegt einfachen ms3d-Körper mit 3 Gelenken Antworten mit Zitat

gehts noch?

ALLE LUTZ IFER PROGRAMME SIND SOWEIT NICHT ANDERS GEKENNTZEICHNET UNTER DER LGPL VERÖFFENTLICHT!

typcam, infotyp, const fensterbla das kommt mir doch alles sehr bekannt vor!
Wobei ich zugeben muss, EINE änderung hat "hundert" dann doch gemacht. in MEINEM ORIGINAL steht vor "cam.x += difx * cos(degrad * cam.b) + dify * sin(degrad * cam.b) + difz * sin(degrad * cam.h) * sin(degrad * cam.b)" nämlich noch ein "'Bewegerei von MisterD"!

Dürfte ich jetzt also fragen, worin deine eigene leistung besteht, vom str+c,str+v abgesehen?
die "anbauteile" an dem körper, hardgecodet zu drehen? welche leistung...

Lutz böse Ifer
_________________
Wahnsinn ist nur die Antwort einer gesunden Psyche auf eine kranke Gesellschaft.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 12.11.2006, 04:05    Titel: Antworten mit Zitat

oh ich werde in deinen sources erwähnt dafür, dass ich dir ne 2D rotationsmatrix mehr oder weniger geqouted hab? lächeln das ja schön happy
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz