 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
hundert
Anmeldungsdatum: 06.11.2006 Beiträge: 2
|
Verfasst am: 08.11.2006, 10:53 Titel: Opengl bewegt einfachen ms3d-Körper mit 3 Gelenken |
|
|
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 |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 09.11.2006, 00:27 Titel: |
|
|
sorry dass ich so blöd frag aber warum gibts du für jede multikey-taste die einzeiligen aktionen als dreizeiler an? 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 |
|
 |
Lutz Ifer Grillmeister

Anmeldungsdatum: 23.09.2005 Beiträge: 555
|
Verfasst am: 10.11.2006, 19:24 Titel: Re: Opengl bewegt einfachen ms3d-Körper mit 3 Gelenken |
|
|
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 Ifer _________________ Wahnsinn ist nur die Antwort einer gesunden Psyche auf eine kranke Gesellschaft. |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 12.11.2006, 04:05 Titel: |
|
|
oh ich werde in deinen sources erwähnt dafür, dass ich dir ne 2D rotationsmatrix mehr oder weniger geqouted hab? das ja schön  _________________ "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 |
|
 |
|
|
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.
|
|