|
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 |
Luke
Anmeldungsdatum: 14.01.2009 Beiträge: 92 Wohnort: Ostfriesland !
|
Verfasst am: 24.07.2011, 18:04 Titel: Vektoren um Vektor rotieren |
|
|
Moin Leute!
Ich beschäftige mich gerade mit dem Thema Vektoren und möchte jetzt
wie das Thema schon sagt wissen, wie ich 2 Vektoren um einen drehen kann.
Da ich das Thema in der Schule bis jetzt noch nicht hatte, kann es sein, dass mir einige Methoden/Begriffe etc. nicht ganz geläufig sind.....
Könnt ihr mir da helfen?
Eigene Erklärungen und Rechnungen wären mir lieb, denn aus diversen Internetseiten werde ich einfach nicht schlau! (Also keine Gidf's bitte)
Hier mein Programm (benötigt OpenGl):
Drei Vektoren beschreiben eine Art Koordinatensystem. VecX beeinhaltet die drei Werte (x, y, z) des X-Achsen Vektors, VecY die für die Y_Achse usw.
Das Programm soll jetzt bei folgenden Tastenkombinationen Folgendes tun:
X & UP -> VecY und VecZ positiv um VecX drehen
X & DOWN -> VecY und VecZ negativ um VecX drehen
Y & UP -> VecX und VecZ positiv um VecY drehen
....
Den Rest könnt ihr euch wohl denken...
(Einen vierten Vektor für Verschiebungen brauche ich vorerst nicht)
Das Prog' zeigt die Vektoren in Form von einfachen Linien als Koordinatensystem an.
Ich wäre euch unendlich dankbar, wenn ihr mir helfen könntet, denn ich bin mit meinem MATHE erstmal am Ende
Code: |
'-------------------------
'Includes
'-------------------------
#include once "GL/gl.bi" 'Benötigte Bibliotheken
#include once "GL/glu.bi" '/
#include "fbgfx.bi" 'nützliche Bibliothek (Bsp. Keyboard-Scancodes)
'-------------------------
' das Fenster öffnen
'-------------------------
Dim as integer brt, hh, tf
screeninfo brt, hh, tf
brt/=2
hh/=2
screenres brt,hh, tf, , 2
DIM SHARED AS DOUBLE Pi
Pi = 3.14159265358979323846
'-------------------------
' Open-GL Init
'-------------------------
glViewport 0, 0, brt, hh ' den Current Viewport auf eine Ausgangsposition setzen
glMatrixMode GL_PROJECTION ' Den Matrix-Modus Projection wählen
glLoadIdentity ' Diesen Modus auf Anfangswerte setzen
gluPerspective 45.0, brt/hh, 0.1, 1000.0 'Grundeinstellungen des Anezeigefensters festlegen
glMatrixMode GL_MODELVIEW ' Auf den Matrix-Modus Modelview schalten
glLoadIdentity ' und auch diesen auf Anfangswerte setzen
glClearColor 0.0, 0.0, 0.0, 0.0 ' Setze Farbe für löschen auf Mittelgrau
glClearDepth 1.0 ' Depth-Buffer Löschen erlauben
glEnable GL_DEPTH_TEST ' den Tiefentest GL_DEPTH_TEST einschalten
glClear GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT 'Tiefen- und Farbpufferbits löschen
Dim shared as single VecX(2)={1, 0, 0}, VecY(2)={0, 1, 0}, VecZ(2)={0, 0, 1}
Declare Sub RotateX_Vec(degree as single)
Declare Sub RotateY_Vec(degree as single)
Declare Sub RotateZ_Vec(degree as single)
Do Until Multikey(FB.SC_ESCAPE)
glClear GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT :'Alle Objekte löschen
glloadidentity 'Zurücksetzen der Modellmatrix
gltranslatef 0, 0, -10
glscalef 2, 2, 2
'Vektoren sichtbar machen:
'X-Achsen-Vektor
glbegin GL_LINES
glcolor3f 1, 0, 0
glvertex3f 0, 0, 0
glvertex3f VecX(0), VecX(1), VecX(2)
glend
'Y-Achsen-Vektor
glbegin GL_LINES
glcolor3f 0, 1, 0
glvertex3f 0, 0, 0
glvertex3f VecY(0), VecY(1), VecY(2)
glend
'Z-Achsen-Vektor
glbegin GL_LINES
glcolor3f 0, 0, 1
glvertex3f 0, 0, 0
glvertex3f VecZ(0), VecZ(1), VecZ(2)
glend
'Tastenabfrage
If Multikey(FB.SC_X) then
If Multikey(FB.SC_UP) then
RotateX_Vec(1)
end if
If Multikey(FB.SC_DOWN) then
RotateX_Vec(-1)
end if
elseif Multikey(FB.SC_Y) then
If Multikey(FB.SC_UP) then
RotateY_Vec(1)
end if
If Multikey(FB.SC_DOWN) then
RotateY_Vec(-1)
end if
elseif Multikey(FB.SC_Z) then
If Multikey(FB.SC_UP) then
RotateZ_Vec(1)
end if
If Multikey(FB.SC_DOWN) then
RotateZ_Vec(-1)
end if
end if
flip 'Ausgabe auf dem Bildschirm
loop
'____________________
'SUB's
'--------------------
Sub RotateX_Vec(degree as single)
'VecX(0), VecX(1) und VecX(2) müssten unverändert bleiben, aber wie
'rechne ich die jeweils drei Werte für VecY und VecZ aus?
end sub
Sub RotateY_Vec(degree as single)
'Hier das selbe Problem
end sub
Sub RotateZ_Vec(degree as single)
'Und hier erst recht....:-(
end sub
|
_________________ ICH war mal schizophren, aber jetzt sind WIR okay. |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4601 Wohnort: ~/
|
Verfasst am: 24.07.2011, 18:28 Titel: |
|
|
Das Problem an der ganzen Vektor-Manipulation ist, dass sich die Dinge mit den richtigen Matrixtransformationen sehr einfach bewerkstelligen lassen, das ganze Thema aber weit (und damit meine ich weit) über die Schulmathematik hinausgeht. Wir haben sowas zwar im Studium angesprochen, aber ich glaube nicht, dass ich in der Lage bin, das ganze einfacher zu erklären als es bei Wikipedia gemacht wurde. Für die Multiplikation von Matrizen bzw. Vektoren kannst du dir ja mal z. B. FBMath ansehen; das nimmt dir eine Menge Arbeit ab, es wird aber vermutlich trotzdem noch eine Menge zum Schrauben und Basteln für dich übrig bleiben.
Tut mir Leid, dass ich im Augenblick keine einfachere Lösung anbieten kann, aber vielleicht hilft es ja ein Stück weiter. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Luke
Anmeldungsdatum: 14.01.2009 Beiträge: 92 Wohnort: Ostfriesland !
|
Verfasst am: 24.07.2011, 18:45 Titel: |
|
|
Danke erstmal dafür. Ich guck mal, was man mit FBMath so machen kann.
Aus Wikipedi werde ich garnicht schlau, aber naja.
Falls du und ihr, liebe Community, noch was wisst, dann schreibt es bitte auch! ICh bin für alles offen! _________________ ICH war mal schizophren, aber jetzt sind WIR okay. |
|
Nach oben |
|
|
XOR
Anmeldungsdatum: 23.07.2010 Beiträge: 161
|
Verfasst am: 24.07.2011, 20:59 Titel: |
|
|
Mit einer Matrix wuerde das dann so aussehen:
Code: | '-------------------------
'Includes
'-------------------------
#include once "GL/gl.bi" 'Benötigte Bibliotheken
#include once "GL/glu.bi" '/
#include "fbgfx.bi" 'nützliche Bibliothek (Bsp. Keyboard-Scancodes)
#Define Pi 3.14159265358979323846
'-------------------------
' das Fenster öffnen
'-------------------------
Dim as integer brt, hh, tf
screeninfo brt, hh, tf
brt/=2
hh/=2
screenres brt,hh, tf, , 2
'-------------------------
' Open-GL Init
'-------------------------
glViewport 0, 0, brt, hh ' den Current Viewport auf eine Ausgangsposition setzen
glMatrixMode GL_PROJECTION ' Den Matrix-Modus Projection wählen
glLoadIdentity ' Diesen Modus auf Anfangswerte setzen
gluPerspective 45.0, brt/hh, 0.1, 1000.0 'Grundeinstellungen des Anezeigefensters festlegen
glMatrixMode GL_MODELVIEW ' Auf den Matrix-Modus Modelview schalten
glLoadIdentity ' und auch diesen auf Anfangswerte setzen
glClearColor 0.0, 0.0, 0.0, 0.0 ' Setze Farbe für löschen auf Mittelgrau
glClearDepth 1.0 ' Depth-Buffer Löschen erlauben
glEnable GL_DEPTH_TEST ' den Tiefentest GL_DEPTH_TEST einschalten
glClear GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT 'Tiefen- und Farbpufferbits löschen
Dim shared RotMat(15) As Single = {_ 'Matrix in der die Rotation Gespeichert wird
1,0,0,0,_
0,1,0,0,_
0,0,1,0,_
0,0,0,1}
Dim Vec(3) As single
Declare Sub MutlVecMat ( ByVal V As Single Ptr, ByVal M As Single Ptr )
Declare Sub RotateX_Vec(degree as single)
Declare Sub RotateY_Vec(degree as single)
Declare Sub RotateZ_Vec(degree as single)
Do Until Multikey(FB.SC_ESCAPE) Or InKey = Chr(255)+"k"
glClear GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT :'Alle Objekte löschen
glloadidentity 'Zurücksetzen der Modellmatrix
gltranslatef 0, 0, -10
glscalef 2, 2, 2
'Vektoren sichtbar machen:
'X-Achsen-Vektor
glbegin GL_LINES
For i As Long = 0 To 2
Vec(0) = 0 'Vector aus 0,0,0,1 setzen
Vec(1) = 0
Vec(2) = 0
Vec(3) = 1
Vec(i) = 1 'Und stalle i auf eins
glcolor3f Vec(0), Vec(1), Vec(2) 'Die richtige farbe setzen
MutlVecMat(@Vec(0),@RotMat(0)) 'Den vector mit der matrix Mutlipizieren
Vec(0) /= Vec(3) 'Und durch W teilen
Vec(1) /= Vec(3) 'Und durch W teilen
Vec(2) /= Vec(3) 'Und durch W teilen
glvertex3f 0, 0, 0
glvertex3f Vec(0), Vec(1), Vec(2) 'Und zeichnen
Next
glend
'Tastenabfrage
If Multikey(FB.SC_X) then
If Multikey(FB.SC_UP) then
RotateX_Vec(1)
end if
If Multikey(FB.SC_DOWN) then
RotateX_Vec(-1)
end if
elseif Multikey(FB.SC_Y) then
If Multikey(FB.SC_UP) then
RotateY_Vec(1)
end if
If Multikey(FB.SC_DOWN) then
RotateY_Vec(-1)
end if
elseif Multikey(FB.SC_Z) then
If Multikey(FB.SC_UP) then
RotateZ_Vec(1)
end if
If Multikey(FB.SC_DOWN) then
RotateZ_Vec(-1)
end if
end if
flip 'Ausgabe auf dem Bildschirm
loop
'____________________
'SUB's
'--------------------
'Vector mit Matrix multiplizieren
Sub MutlVecMat ( ByVal V As Single Ptr, ByVal M As Single Ptr )
Dim Vec(3) As Single
Vec(0) = M[0]*V[0]+M[4]*V[1]+M[8]*V[2]+M[12]*V[3]
Vec(1) = M[1]*V[0]+M[5]*V[1]+M[9]*V[2]+M[13]*V[3]
Vec(2) = M[2]*V[0]+M[6]*V[1]+M[10]*V[2]+M[14]*V[3]
Vec(3) = M[3]*V[0]+M[7]*V[1]+M[11]*V[2]+M[15]*V[3]
For i As Long = 0 To 3
v[i] = Vec(i)
Next
End Sub
'Matrix mit matrix multiplizieren
Sub MultMat ( ByVal In1 As Single Ptr, ByVal In2 As Single Ptr, ByVal LX As Long, ByVal LY As Long )
If LX = LY Then
Dim matrix(0 To LX*LY-1)As Single
For i As Integer = 0 To LX-1
For j As Integer = 0 To LX-1
For o As Integer = 0 To LX-1
matrix(i*LX+j) += In2[i*LX+o]*In1[o*LX+j]
Next
Next
Next
For i As Integer = 0 To LX*LY-1
In1[i] = matrix(i)
Next
EndIf
End Sub
'Matrix rotieren
Sub RotateMat ( ByVal Mat As Single Ptr, ByVal angel As Single, ByVal Inx As Single, ByVal Iny As Single, ByVal Inz As Single )
Dim As Single c, s, ent
c = Cos(angel*Pi/180)
s = Sin(angel*Pi/180)
ent = Sqr(Inx*Inx+Iny*Iny+Inz*Inz)
Inx /= ent
Iny /= ent
Inz /= ent
Dim RotateNewMat(15) As Single = {_
Inx*Inx*(1-c)+c, Inx*Iny*(1-c)-Inz*s, Inx*Inz*(1-c)+Iny*s, 0, _
Iny*Inx*(1-c)+Inz*s, Iny*Iny*(1-c)+c, Iny*Inz*(1-c)-Inx*s, 0, _
Inx*Inz*(1-c)-Iny*s, Iny*Inz*(1-c)+Inx*s, Inz*Inz*(1-c)+c, 0, _
0, 0, 0, 1}
MultMat(Mat,@RotateNewMat(0),4,4)
End Sub
Sub RotateX_Vec(degree as single)
RotateMat(@RotMat(0),degree,1,0,0)
End sub
Sub RotateY_Vec(degree as single)
RotateMat(@RotMat(0),degree,0,1,0)
End sub
Sub RotateZ_Vec(degree as single)
RotateMat(@RotMat(0),degree,0,0,1)
end sub
|
Getestet unter FB 0.22.0
ich hoffe ich konnte helfen |
|
Nach oben |
|
|
Luke
Anmeldungsdatum: 14.01.2009 Beiträge: 92 Wohnort: Ostfriesland !
|
Verfasst am: 25.07.2011, 13:51 Titel: |
|
|
Moin XOR!
Also funktionieren tut es, danke. In sofern hilft es mir sehr gut.
Nur Ich verstehe nicht ganz wie das jetzt funzt. Eine Matrix die 4*4 Werte enthält- Aber was für Werte? An welcher Stelle steht welcher, und warum kann man damit solche Drehungen machen?
Was mir aufgefallen ist: Du verwendest jetzt nur einen Vektor, den du immer anders dastellst, indem die Werte vertauscht werden, oder? Voll intelligent eigentlich
Kannst du mir erklären, wie das mit der Matrix funzt? (Wenn es möglich ist das einem 16 Jährigen zu erklären)
Ich hätte jetzt nämlich eigentlich an tausende wilde sinus cosinus Rechnungen gedacht. Hab bis jetzt immer Lösungen gefunden, aber hier komm ich ums verrecken nicht weiter....
Aber vielen tausend Dank erstmal _________________ ICH war mal schizophren, aber jetzt sind WIR okay. |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 25.07.2011, 14:17 Titel: |
|
|
http://de.wikipedia.org/wiki/Rotationsmatrix
Die Dinger sind immer gleich aufgebaut. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
XOR
Anmeldungsdatum: 23.07.2010 Beiträge: 161
|
Verfasst am: 25.07.2011, 14:40 Titel: |
|
|
Ich habs nicht so mit dinge erklaehren aber ich versuche es mal:
Code: | Dim shared RotMat(15) As Single = {_ 'Matrix in der die Rotation Gespeichert wird
1,0,0,0,_
0,1,0,0,_
0,0,1,0,_
0,0,0,1}
|
erstellt eine Matrix und setzt sie aus Identity.
Code: | Vec(0) = 0 'Vector aus 0,0,0,1 setzen
Vec(1) = 0
Vec(2) = 0
Vec(3) = 1
Vec(i) = 1 'Und stalle i auf eins
glcolor3f Vec(0), Vec(1), Vec(2) 'Die richtige farbe setzen
MutlVecMat(@Vec(0),@RotMat(0)) 'Den vector mit der matrix Mutlipizieren
Vec(0) /= Vec(3) 'Und durch W teilen
Vec(1) /= Vec(3) 'Und durch W teilen
Vec(2) /= Vec(3) 'Und durch W teilen
glvertex3f 0, 0, 0
glvertex3f Vec(0), Vec(1), Vec(2) 'Und zeichnen
|
hier wird in vec der punkt der gezeichnet werden soll gespeichert
X = 1,0,0,1
Y = 0,1,0,1
Z = 0,0,1,1
hierbei wird W benoetigt da die matrix 4X4 ist
mit MutlVecMat wird dieser punkt gedereht und verschobe, wie es in der matrix steht.
da W = 1 sein muss muss man nochmal durch W teilen.
und dann zeichnen.
Insgesammt ist das wie in OpenGL aufgebaut.
Zu der rotationsmatrix schau mal Hier
Zu den OpenGL matrixen Hier
Zitat: | Ich hätte jetzt nämlich eigentlich an tausende wilde sinus cosinus Rechnungen gedacht |
Das habe ich frueher auch immer gemacht. Aber in OpenGL3>= musst du die Matrixen selbst verwalten und dann kommt das auch.
In der Schule hatte ich auch nie matrixen, in dem wiki zu dem die beiden oberen links sind kann man auch viel ueber matrixen lehrnen, sehr gut beschrieben und besser verstaendlich als in Wikipedia |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4601 Wohnort: ~/
|
Verfasst am: 25.07.2011, 15:26 Titel: |
|
|
Mit Sinus/Kosinus kommt man mit einer Drehung im Zweidimensionalen noch sehr gut hin; im Dreidimensionalen läuft das letztendlich schon auch auf Sinus und Kosinus hinaus (vgl. Aufbau der Rotationsmatrix), "per Hand" ist das da aber schon relativ ungemütlich, mit Matrix geht das dann schon bequemer. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Luke
Anmeldungsdatum: 14.01.2009 Beiträge: 92 Wohnort: Ostfriesland !
|
Verfasst am: 25.07.2011, 15:30 Titel: |
|
|
Danke dafür. Ich werde mich mal damit auseinander setzen. _________________ ICH war mal schizophren, aber jetzt sind WIR okay. |
|
Nach oben |
|
|
Luke
Anmeldungsdatum: 14.01.2009 Beiträge: 92 Wohnort: Ostfriesland !
|
Verfasst am: 26.07.2011, 13:45 Titel: |
|
|
Hallo Zusammen!
Jetzt klappt alles so, wie ich es mir vorgestellt habe!
Ich kann auch jetzt Objekte innerhalb dieser Matrix aufspannen, drehen, und bewegen!
Dieser Befehl setzt einen Punkt in der Matrix
glvertex3f_RotMat x as single, y as single, z as single
------------------------------------------------------------------
Dieser Befehl verschiebt die Matrix entlang seiner Achsen
gltranslatef_RotMat x as single, y as single, z as single
------------------------------------------------------------------
RotMat_X, RotMat_Y und RotMat_Z beinhalten die Position der Matrix im Weltkoordinatensystem, die bei jedem Zeichendurchlauf anfangs mit gltranslatef gesetzt werden muss.
------------------------------------------------------------------
quad erklärt sich von selbst
Hier der Code: (Vielen Dank für die Hilfe mit der Matrix, XOR)
Code: | '-------------------------
'Includes
'-------------------------
#include once "GL/gl.bi" 'Benötigte Bibliotheken
#include once "GL/glu.bi" '/
#include "fbgfx.bi" 'nützliche Bibliothek (Bsp. Keyboard-Scancodes)
#Define Pi 3.14159265358979323846
'-------------------------
' das Fenster öffnen
'-------------------------
Dim as integer brt, hh, tf
screeninfo brt, hh, tf
brt/=2
hh/=2
screenres brt,hh, tf, , 2
'-------------------------
' Open-GL Init
'-------------------------
glViewport 0, 0, brt, hh ' den Current Viewport auf eine Ausgangsposition setzen
glMatrixMode GL_PROJECTION ' Den Matrix-Modus Projection wählen
glLoadIdentity ' Diesen Modus auf Anfangswerte setzen
gluPerspective 45.0, brt/hh, 0.1, 1000.0 'Grundeinstellungen des Anezeigefensters festlegen
glMatrixMode GL_MODELVIEW ' Auf den Matrix-Modus Modelview schalten
glLoadIdentity ' und auch diesen auf Anfangswerte setzen
glClearColor 0.0, 0.0, 0.0, 0.0 ' Setze Farbe für löschen auf Mittelgrau
glClearDepth 1.0 ' Depth-Buffer Löschen erlauben
glEnable GL_DEPTH_TEST ' den Tiefentest GL_DEPTH_TEST einschalten
glClear GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT 'Tiefen- und Farbpufferbits löschen
Dim shared RotMat(15) As Single = {_ 'Matrix in der die Rotation Gespeichert wird
1,0,0,0,_
0,1,0,0,_
0,0,1,0,_
0,0,0,1}
Dim shared as single RotMat_X = 0, RotMat_Y = 0, RotMat_z = 0
Declare Sub MutlVecMat ( ByVal V As Single Ptr, ByVal M As Single Ptr )
Declare Sub RotateX_Vec(degree as single)
Declare Sub RotateY_Vec(degree as single)
Declare Sub RotateZ_Vec(degree as single)
Declare Sub glvertex3f_RotMat (x as single, y as single, z as single)
Declare Sub gltranslatef_RotMat (x as single, y as single, z as single)
Declare Sub Quad (x as single, y as single, z as single, brt as single, hh as single, tf as single, c as uinteger)
Do Until Multikey(FB.SC_ESCAPE) Or InKey = Chr(255)+"k"
glClear GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT :'Alle Objekte löschen
glloadidentity 'Zurücksetzen der Modellmatrix
gltranslatef 0, 0, -10
glscalef 1, 1, 1
gltranslatef RotMat_X, RotMat_Y, RotMat_Z 'Matrix an die richtige Position schieben
' "Koordinatensystem"
glbegin GL_LINES
glcolor3f 1, 0, 0
glvertex3f_RotMat -2, 0, 0
glvertex3f_RotMat 2, 0, 0 'X-Achse
glcolor3f 0, 1, 0
glvertex3f_RotMat 0, -2, 0
glvertex3f_RotMat 0, 2, 0 'Y-Achse
glcolor3f 0, 0, 1
glvertex3f_RotMat 0, 0, -2 'Z-Achse
glvertex3f_RotMat 0, 0, 2
glend
'Objekt erstellen
quad(0, 0, 0, 1, 1, 1, rgb(255, 0, 0))
quad(-.75, 0, 0, .5, .5, .5, rgb(0, 100, 0))
'Tastenabfrage
If Multikey(FB.SC_X) then
If Multikey(FB.SC_UP) then
RotateX_Vec(1)
end if
If Multikey(FB.SC_DOWN) then
RotateX_Vec(-1)
end if
elseif Multikey(FB.SC_Y) then
If Multikey(FB.SC_UP) then
RotateY_Vec(1)
end if
If Multikey(FB.SC_DOWN) then
RotateY_Vec(-1)
end if
elseif Multikey(FB.SC_Z) then
If Multikey(FB.SC_UP) then
RotateZ_Vec(1)
end if
If Multikey(FB.SC_DOWN) then
RotateZ_Vec(-1)
end if
end if
flip 'Ausgabe auf dem Bildschirm
loop
'____________________
'SUB's
'--------------------
'Vector mit Matrix multiplizieren
Sub MutlVecMat ( ByVal V As Single Ptr, ByVal M As Single Ptr )
Dim Vec(3) As Single
Vec(0) = M[0]*V[0]+M[4]*V[1]+M[8]*V[2]+M[12]*V[3]
Vec(1) = M[1]*V[0]+M[5]*V[1]+M[9]*V[2]+M[13]*V[3]
Vec(2) = M[2]*V[0]+M[6]*V[1]+M[10]*V[2]+M[14]*V[3]
Vec(3) = M[3]*V[0]+M[7]*V[1]+M[11]*V[2]+M[15]*V[3]
For i As Long = 0 To 3
v[i] = Vec(i)
Next
End Sub
'Matrix mit matrix multiplizieren
Sub MultMat ( ByVal In1 As Single Ptr, ByVal In2 As Single Ptr, ByVal LX As Long, ByVal LY As Long )
If LX = LY Then
Dim matrix(0 To LX*LY-1)As Single
For i As Integer = 0 To LX-1
For j As Integer = 0 To LX-1
For o As Integer = 0 To LX-1
matrix(i*LX+j) += In2[i*LX+o]*In1[o*LX+j]
Next
Next
Next
For i As Integer = 0 To LX*LY-1
In1[i] = matrix(i)
Next
EndIf
End Sub
'Matrix rotieren
Sub RotateMat ( ByVal Mat As Single Ptr, ByVal angel As Single, ByVal Inx As Single, ByVal Iny As Single, ByVal Inz As Single )
Dim As Single c, s, ent
c = Cos(angel*Pi/180)
s = Sin(angel*Pi/180)
ent = Sqr(Inx*Inx+Iny*Iny+Inz*Inz)
Inx /= ent
Iny /= ent
Inz /= ent
Dim RotateNewMat(15) As Single = {_
Inx*Inx*(1-c)+c, Inx*Iny*(1-c)-Inz*s, Inx*Inz*(1-c)+Iny*s, 0, _
Iny*Inx*(1-c)+Inz*s, Iny*Iny*(1-c)+c, Iny*Inz*(1-c)-Inx*s, 0, _
Inx*Inz*(1-c)-Iny*s, Iny*Inz*(1-c)+Inx*s, Inz*Inz*(1-c)+c, 0, _
0, 0, 0, 1}
MultMat(Mat,@RotateNewMat(0),4,4)
End Sub
Sub RotateX_Vec(degree as single)
RotateMat(@RotMat(0),degree,1,0,0)
End sub
Sub RotateY_Vec(degree as single)
RotateMat(@RotMat(0),degree,0,1,0)
End sub
Sub RotateZ_Vec(degree as single)
RotateMat(@RotMat(0),degree,0,0,1)
end sub
Sub glvertex3f_RotMat (x as single, y as single, z as single)
Dim P(3) as single
P(0) = x
P(1) = y
P(2) = z
P(3) = 1
MutlVecMat(@P(0),@RotMat(0))
P(0) /= P(3)
P(1) /= P(3)
P(2) /= P(3)
glvertex3f P(0), P(1), P(2)
end sub
Sub gltranslatef_RotMat (x as single, y as single, z as single)
Dim P(3) as single
P(0) = x
P(1) = y
P(2) = z
P(3) = 1
MutlVecMat(@P(0),@RotMat(0))
P(0) /= P(3)
P(1) /= P(3)
P(2) /= P(3)
RotMat_x+=P(0)
RotMat_y+=P(1)
RotMat_z+=P(2)
end sub
Sub Quad (x as single, y as single, z as single, brt as single, hh as single, tf as single, c as uinteger)
Dim as single r, g, b
r = val("&H" & mid(hex(c), 3, 2))/255
g = val("&H" & mid(hex(c), 5, 2))/255
b = val("&H" & mid(hex(c), 7, 2))/255
brt/=2
hh/=2
tf/=2
glbegin GL_QUADS
glcolor3f r, g, b
glvertex3f_RotMat x-brt, y-hh, z-tf
glvertex3f_RotMat x+brt, y-hh, z-tf
glvertex3f_RotMat x+brt, y+hh, z-tf
glvertex3f_RotMat x-brt, y+hh, z-tf
glvertex3f_RotMat x-brt, y-hh, z+tf
glvertex3f_RotMat x+brt, y-hh, z+tf
glvertex3f_RotMat x+brt, y+hh, z+tf
glvertex3f_RotMat x-brt, y+hh, z+tf
glcolor3f r-.1, g-.1, b-.1
glvertex3f_RotMat x-brt, y-hh, z-tf
glvertex3f_RotMat x-brt, y-hh, z+tf
glvertex3f_RotMat x-brt, y+hh, z+tf
glvertex3f_RotMat x-brt, y+hh, z-tf
glvertex3f_RotMat x+brt, y-hh, z-tf
glvertex3f_RotMat x+brt, y-hh, z+tf
glvertex3f_RotMat x+brt, y+hh, z+tf
glvertex3f_RotMat x+brt, y+hh, z-tf
glcolor3f r-.2, g-.2, b-.2
glvertex3f_RotMat x-brt, y-hh, z-tf
glvertex3f_RotMat x-brt, y-hh, z+tf
glvertex3f_RotMat x+brt, y-hh, z+tf
glvertex3f_RotMat x+brt, y-hh, z-tf
glvertex3f_RotMat x-brt, y+hh, z-tf
glvertex3f_RotMat x-brt, y+hh, z+tf
glvertex3f_RotMat x+brt, y+hh, z+tf
glvertex3f_RotMat x+brt, y+hh, z-tf
glend
end Sub
|
_________________ ICH war mal schizophren, aber jetzt sind WIR okay. |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 26.07.2011, 14:09 Titel: |
|
|
Warum liegt das Thema eigentlich im QBasic-Bereich? _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
XOR
Anmeldungsdatum: 23.07.2010 Beiträge: 161
|
Verfasst am: 26.07.2011, 14:57 Titel: |
|
|
Zitat: | RotMat_X, RotMat_Y und RotMat_Z beinhalten die Position der Matrix im Weltkoordinatensystem, die bei jedem Zeichendurchlauf anfangs mit gltranslatef gesetzt werden muss. |
In der 4x4 Matrix kann man auch den verschub speichern.
Nochmal ein kleines beispiel:
Mir a,w,s,d,q,e verschiebt man die objekte, drehen wie vorher
Code: | '-------------------------
'Includes
'-------------------------
#include once "GL/gl.bi" 'Benötigte Bibliotheken
#include once "GL/glu.bi" '/
#include "fbgfx.bi" 'nützliche Bibliothek (Bsp. Keyboard-Scancodes)
#Define Pi 3.14159265358979323846
'-------------------------
' das Fenster öffnen
'-------------------------
Dim as integer brt, hh, tf
screeninfo brt, hh, tf
brt/=2
hh/=2
screenres brt,hh, tf, , 2
'-------------------------
' Open-GL Init
'-------------------------
glViewport 0, 0, brt, hh ' den Current Viewport auf eine Ausgangsposition setzen
glMatrixMode GL_PROJECTION ' Den Matrix-Modus Projection wählen
glLoadIdentity ' Diesen Modus auf Anfangswerte setzen
gluPerspective 45.0, brt/hh, 0.1, 1000.0 'Grundeinstellungen des Anezeigefensters festlegen
glMatrixMode GL_MODELVIEW ' Auf den Matrix-Modus Modelview schalten
glLoadIdentity ' und auch diesen auf Anfangswerte setzen
glClearColor 0.0, 0.0, 0.0, 0.0 ' Setze Farbe für löschen auf Mittelgrau
glClearDepth 1.0 ' Depth-Buffer Löschen erlauben
glEnable GL_DEPTH_TEST ' den Tiefentest GL_DEPTH_TEST einschalten
glClear GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT 'Tiefen- und Farbpufferbits löschen
Dim shared RotMat(15) As Single = {_ 'Matrix in der die Rotation Gespeichert wird
1,0,0,0,_
0,1,0,0,_
0,0,1,0,_
0,0,0,1}
Declare Sub MutlVecMat ( ByVal V As Single Ptr, ByVal M As Single Ptr )
Declare Sub RotateX_Vec(degree as single)
Declare Sub RotateY_Vec(degree as single)
Declare Sub RotateZ_Vec(degree as single)
Declare Sub glvertex3f_RotMat (x as single, y as single, z as single)
Declare Sub gltranslatef_RotMat (x as single, y as single, z as single)
Declare Sub Quad (x as single, y as single, z as single, brt as single, hh as single, tf as single, c as uinteger)
Do Until Multikey(FB.SC_ESCAPE) Or InKey = Chr(255)+"k"
glClear GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT :'Alle Objekte löschen
glloadidentity 'Zurücksetzen der Modellmatrix
gltranslatef 0, 0, -10
glscalef 1, 1, 1
' "Koordinatensystem"
glbegin GL_LINES
glcolor3f 1, 0, 0
glvertex3f_RotMat -2, 0, 0
glvertex3f_RotMat 2, 0, 0 'X-Achse
glcolor3f 0, 1, 0
glvertex3f_RotMat 0, -2, 0
glvertex3f_RotMat 0, 2, 0 'Y-Achse
glcolor3f 0, 0, 1
glvertex3f_RotMat 0, 0, -2 'Z-Achse
glvertex3f_RotMat 0, 0, 2
glend
'Objekt erstellen
quad(0, 0, 0, 1, 1, 1, rgb(255, 0, 0))
quad(-.75, 0, 0, .5, .5, .5, rgb(0, 100, 0))
'Tastenabfrage
If Multikey(FB.SC_X) then
If Multikey(FB.SC_UP) then
RotateX_Vec(1)
end if
If Multikey(FB.SC_DOWN) then
RotateX_Vec(-1)
end if
elseif Multikey(FB.SC_Y) then
If Multikey(FB.SC_UP) then
RotateY_Vec(1)
end if
If Multikey(FB.SC_DOWN) then
RotateY_Vec(-1)
end if
elseif Multikey(FB.SC_Z) then
If Multikey(FB.SC_UP) then
RotateZ_Vec(1)
end if
If Multikey(FB.SC_DOWN) then
RotateZ_Vec(-1)
end if
ElseIf MultiKey(FB.SC_A) Then
gltranslatef_RotMat ( 0.1, 0, 0 )
ElseIf MultiKey(FB.SC_D) Then
gltranslatef_RotMat ( -0.1, 0, 0 )
ElseIf MultiKey(FB.SC_S) Then
gltranslatef_RotMat ( 0, 0, 0.1 )
ElseIf MultiKey(FB.SC_W) Then
gltranslatef_RotMat ( 0, 0, -0.1 )
ElseIf MultiKey(FB.SC_Q) Then
gltranslatef_RotMat ( 0, 0.1, 0 )
ElseIf MultiKey(FB.SC_E) Then
gltranslatef_RotMat ( 0,-0.1, 0 )
end if
flip 'Ausgabe auf dem Bildschirm
loop
'____________________
'SUB's
'--------------------
'Vector mit Matrix multiplizieren
Sub MutlVecMat ( ByVal V As Single Ptr, ByVal M As Single Ptr )
Dim Vec(3) As Single
Vec(0) = M[0]*V[0]+M[4]*V[1]+M[8]*V[2]+M[12]*V[3]
Vec(1) = M[1]*V[0]+M[5]*V[1]+M[9]*V[2]+M[13]*V[3]
Vec(2) = M[2]*V[0]+M[6]*V[1]+M[10]*V[2]+M[14]*V[3]
Vec(3) = M[3]*V[0]+M[7]*V[1]+M[11]*V[2]+M[15]*V[3]
For i As Long = 0 To 3
v[i] = Vec(i)
Next
End Sub
'Matrix mit matrix multiplizieren
Sub MultMat ( ByVal In1 As Single Ptr, ByVal In2 As Single Ptr, ByVal LX As Long, ByVal LY As Long )
If LX = LY Then
Dim matrix(0 To LX*LY-1)As Single
For i As Integer = 0 To LX-1
For j As Integer = 0 To LX-1
For o As Integer = 0 To LX-1
matrix(i*LX+j) += In2[i*LX+o]*In1[o*LX+j]
Next
Next
Next
For i As Integer = 0 To LX*LY-1
In1[i] = matrix(i)
Next
EndIf
End Sub
'Matrix rotieren
Sub RotateMat ( ByVal Mat As Single Ptr, ByVal angel As Single, ByVal Inx As Single, ByVal Iny As Single, ByVal Inz As Single )
Dim As Single c, s, ent
c = Cos(angel*Pi/180)
s = Sin(angel*Pi/180)
ent = Sqr(Inx*Inx+Iny*Iny+Inz*Inz)
Inx /= ent
Iny /= ent
Inz /= ent
Dim RotateNewMat(15) As Single = {_
Inx*Inx*(1-c)+c, Inx*Iny*(1-c)-Inz*s, Inx*Inz*(1-c)+Iny*s, 0, _
Iny*Inx*(1-c)+Inz*s, Iny*Iny*(1-c)+c, Iny*Inz*(1-c)-Inx*s, 0, _
Inx*Inz*(1-c)-Iny*s, Iny*Inz*(1-c)+Inx*s, Inz*Inz*(1-c)+c, 0, _
0, 0, 0, 1}
MultMat(Mat,@RotateNewMat(0),4,4)
End Sub
Sub TranslateMat ( ByVal Mat As Single Ptr, ByVal X As Single, ByVal Y As Single, ByVal Z As Single )
Dim TranslateNewMat(15) As Single = {_
1, 0, 0, 0,_
0, 1, 0, 0,_
0, 0, 1, 0,_
X, Y, Z, 1}
MultMat(Mat,@TranslateNewMat(0),4,4)
End Sub
Sub RotateX_Vec(degree as single)
RotateMat(@RotMat(0),degree,1,0,0)
End sub
Sub RotateY_Vec(degree as single)
RotateMat(@RotMat(0),degree,0,1,0)
End sub
Sub RotateZ_Vec(degree as single)
RotateMat(@RotMat(0),degree,0,0,1)
end sub
Sub glvertex3f_RotMat (x as single, y as single, z as single)
Dim P(3) as single
P(0) = x
P(1) = y
P(2) = z
P(3) = 1
MutlVecMat(@P(0),@RotMat(0))
P(0) /= P(3)
P(1) /= P(3)
P(2) /= P(3)
glvertex3f P(0), P(1), P(2)
end sub
Sub gltranslatef_RotMat (x as single, y as single, z as single)
TranslateMat ( @RotMat(0), X, Y, Z )
end sub
Sub Quad (x as single, y as single, z as single, brt as single, hh as single, tf as single, c as uinteger)
Dim as single r, g, b
r = loByte(HiWord(c))/255
g = HiByte(LoWord(c))/255
b = LoByte(loWord(c))/255
brt/=2
hh/=2
tf/=2
glbegin GL_QUADS
glcolor3f r, g, b
glvertex3f_RotMat x-brt, y-hh, z-tf
glvertex3f_RotMat x+brt, y-hh, z-tf
glvertex3f_RotMat x+brt, y+hh, z-tf
glvertex3f_RotMat x-brt, y+hh, z-tf
glvertex3f_RotMat x-brt, y-hh, z+tf
glvertex3f_RotMat x+brt, y-hh, z+tf
glvertex3f_RotMat x+brt, y+hh, z+tf
glvertex3f_RotMat x-brt, y+hh, z+tf
glcolor3f r-.1, g-.1, b-.1
glvertex3f_RotMat x-brt, y-hh, z-tf
glvertex3f_RotMat x-brt, y-hh, z+tf
glvertex3f_RotMat x-brt, y+hh, z+tf
glvertex3f_RotMat x-brt, y+hh, z-tf
glvertex3f_RotMat x+brt, y-hh, z-tf
glvertex3f_RotMat x+brt, y-hh, z+tf
glvertex3f_RotMat x+brt, y+hh, z+tf
glvertex3f_RotMat x+brt, y+hh, z-tf
glcolor3f r-.2, g-.2, b-.2
glvertex3f_RotMat x-brt, y-hh, z-tf
glvertex3f_RotMat x-brt, y-hh, z+tf
glvertex3f_RotMat x+brt, y-hh, z+tf
glvertex3f_RotMat x+brt, y-hh, z-tf
glvertex3f_RotMat x-brt, y+hh, z-tf
glvertex3f_RotMat x-brt, y+hh, z+tf
glvertex3f_RotMat x+brt, y+hh, z+tf
glvertex3f_RotMat x+brt, y+hh, z-tf
glend
end Sub |
|
|
Nach oben |
|
|
Luke
Anmeldungsdatum: 14.01.2009 Beiträge: 92 Wohnort: Ostfriesland !
|
Verfasst am: 27.07.2011, 10:33 Titel: |
|
|
Achso! Dafür die 4*4 Matrix. Danke schön _________________ ICH war mal schizophren, aber jetzt sind WIR okay. |
|
Nach oben |
|
|
Luke
Anmeldungsdatum: 14.01.2009 Beiträge: 92 Wohnort: Ostfriesland !
|
Verfasst am: 30.07.2011, 12:17 Titel: |
|
|
sorry, das ich die Frage erst jetzt stelle, aber Ich war bis gestern zelten
1, 0, 0, 0
0, 1, 0, 0
0, 0, 1, 0
X, Y, Z, 1
die ersten drei Spalten sind mir klar. Aber wozu die 4-te?
0
0
0
1
kann man darin auch noch bestimmte Werten speichern? Zum Beispiel die skalierungen, oder so? Aber die bräuchten ja auch nur 3 Werte.....wozu dann die letzte 1? Für skalierungen müssten ja die ersten drei Werte eins sein, ansonsten würden die Achsen bei 0 ja nur ein Punkt sein.....
Oder sind die Werte für ganz was anderes?
EDIT: Im Code könnte das dann ja so aussehen:
Code: | Sub glscalef_RotMat (x as single, y as single, z as single)
ScaleMat ( @RotMat(0), X, Y, Z )
end sub
Sub ScaleMat ( ByVal Mat As Single Ptr, ByVal X As Single, ByVal Y As Single, ByVal Z As Single )
Dim ScaleNewMat(15) As Single = {_
1, 0, 0, X,_
0, 1, 0, Y,_
0, 0, 1, Z,_
0, 0, 0, 1}
MultMat(Mat,@ScaleNewMat(0),4,4)
End Sub |
EDIT 2: Okay, habe es mir fast selbst beantwortet: Aufbau einer Opengl Matrix
Nur so ganz verstanden, warum das 4*4 sein muss nicht. 3*4 würde doch reichen, oder nicht? _________________ ICH war mal schizophren, aber jetzt sind WIR okay. |
|
Nach oben |
|
|
XOR
Anmeldungsdatum: 23.07.2010 Beiträge: 161
|
Verfasst am: 30.07.2011, 13:23 Titel: |
|
|
Zitat: | Nur so ganz verstanden, warum das 4*4 sein muss nicht. 3*4 würde doch reichen, oder nicht? |
Man braucht eine 4*4 um sie richtig multiplizieren zu koennen.
Scaliren geht so:
Code: | Sub glscalef_RotMat (x as single, y as single, z as single)
ScaleMat ( @RotMat(0), X, Y, Z )
end sub
Sub ScaleMat ( ByVal Mat As Single Ptr, ByVal X As Single, ByVal Y As Single, ByVal Z As Single )
if X = 0 or Y = 0 or Z = 0 then exit sub
Dim ScaleNewMat(15) As Single = {_
X, 0, 0, 0,_
0, Y, 0, 0,_
0, 0, Z, 0,_
0, 0, 0, 1}
MultMat(Mat,@ScaleNewMat(0),4,4)
End Sub |
|
|
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.
|
|