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:

Vektoren um Vektor rotieren

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



Anmeldungsdatum: 14.01.2009
Beiträge: 92
Wohnort: Ostfriesland !

BeitragVerfasst am: 24.07.2011, 17:04    Titel: Vektoren um Vektor rotieren Antworten mit Zitat

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! weinen (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... zwinkern

(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 missbilligen

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 24.07.2011, 17:28    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Luke



Anmeldungsdatum: 14.01.2009
Beiträge: 92
Wohnort: Ostfriesland !

BeitragVerfasst am: 24.07.2011, 17:45    Titel: Antworten mit Zitat

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! zwinkern
_________________
ICH war mal schizophren, aber jetzt sind WIR okay.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
XOR



Anmeldungsdatum: 23.07.2010
Beiträge: 161

BeitragVerfasst am: 24.07.2011, 19:59    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Luke



Anmeldungsdatum: 14.01.2009
Beiträge: 92
Wohnort: Ostfriesland !

BeitragVerfasst am: 25.07.2011, 12:51    Titel: Antworten mit Zitat

Moin XOR!
Also funktionieren tut es, danke. In sofern hilft es mir sehr gut. lächeln
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 mit dem Kopf durch die Mauer wollen

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 zwinkern
_________________
ICH war mal schizophren, aber jetzt sind WIR okay.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 25.07.2011, 13:17    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
XOR



Anmeldungsdatum: 23.07.2010
Beiträge: 161

BeitragVerfasst am: 25.07.2011, 13:40    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 25.07.2011, 14:26    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Luke



Anmeldungsdatum: 14.01.2009
Beiträge: 92
Wohnort: Ostfriesland !

BeitragVerfasst am: 25.07.2011, 14:30    Titel: Antworten mit Zitat

Danke dafür. Ich werde mich mal damit auseinander setzen.
_________________
ICH war mal schizophren, aber jetzt sind WIR okay.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Luke



Anmeldungsdatum: 14.01.2009
Beiträge: 92
Wohnort: Ostfriesland !

BeitragVerfasst am: 26.07.2011, 12:45    Titel: Antworten mit Zitat

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 zwinkern

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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 26.07.2011, 13:09    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
XOR



Anmeldungsdatum: 23.07.2010
Beiträge: 161

BeitragVerfasst am: 26.07.2011, 13:57    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Luke



Anmeldungsdatum: 14.01.2009
Beiträge: 92
Wohnort: Ostfriesland !

BeitragVerfasst am: 27.07.2011, 09:33    Titel: Antworten mit Zitat

Achso! Dafür die 4*4 Matrix. Danke schön lächeln
_________________
ICH war mal schizophren, aber jetzt sind WIR okay.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Luke



Anmeldungsdatum: 14.01.2009
Beiträge: 92
Wohnort: Ostfriesland !

BeitragVerfasst am: 30.07.2011, 11:17    Titel: Antworten mit Zitat

sorry, das ich die Frage erst jetzt stelle, aber Ich war bis gestern zelten grinsen

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
Benutzer-Profile anzeigen Private Nachricht senden
XOR



Anmeldungsdatum: 23.07.2010
Beiträge: 161

BeitragVerfasst am: 30.07.2011, 12:23    Titel: Antworten mit Zitat

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
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 -> Spezielle Fragen 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