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:

3D-Rotation

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



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 20.03.2005, 21:39    Titel: 3D-Rotation Antworten mit Zitat

Hallo! Ich bin bei meinen bisher recht wenigen Programmierversuchen
in 3D auf ein Problem gestoßen:
Ich habe mein 3D-Koordinatensxstem so aufgebaut:
Code:

                             
                               y    z
                               |   /
                               |  /
                               |/
                    x|---------/----------|
                             / |
                           /   |
                          /    |



Nun will ich einen Quader, von dem ich alle 8 3D-Eckpunkte im Array Quader3D()
und alle 2D-Eckpunkte im Array Quader2D() gespeichert habe, und dessen
Mittelpunkt in (0|0|0) liegt, um die y-Achse um w% Grad bewegen.

Die Formeln zum Bewegen zweidimensionaler Objekte haben mir dabei
nicht wirklich weitergeholfen.

Kennt jemand eine Formel?

Vielen Dank im Voraus,

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 20.03.2005, 21:52    Titel: Antworten mit Zitat

Hallo

Sieh dir doch mal den Thread zum Thema "Kugel" an: http://forum.qbasic.at/viewtopic.php?t=663 . Die Ecken eines Würfels liegen auch auf der Oberfläche einer Kugel, die eines Quaders auf einem Ellipsoid. Da sind dann nur die Radien unterschiedlich.

Gruss
Skilltronic
_________________
Elektronik und QB? www.skilltronics.de !
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 20.03.2005, 22:16    Titel: Antworten mit Zitat

Ja, schon klar, aber ich glaube, dass das dadurch nur noch komplizierter wird...
Kennt jemand nicht eine Formel (ich glaube das war mal was mit SIN, COS und PI)...

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 20.03.2005, 22:34    Titel: Antworten mit Zitat

Wenn du einfach nur einen Punkt (x,y,z) um die y-Achse rotieren lassen willst, dann zuerst mit

radius = SQR(x^2 + z^2)

den Abstand zur y-Achse ausrechnen und den neuen x-Wert (y ändert sich nicht und z sieht man auf dem Bildschirm nicht) mit

xneu = COS(winkel) * radius

berechnen.

zneu wäre dann

zneu = SIN(winkel) * radius

EDIT: winkelimbogenmass = winkelimgradmass * ATN(1) / 45

Gruss
Skilltronic
_________________
Elektronik und QB? www.skilltronics.de !
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 20.03.2005, 22:51    Titel: Antworten mit Zitat

Dankeschön, werde ich ausprobieren!

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 21.03.2005, 11:51    Titel: Antworten mit Zitat

Guten Morgen!

Also irgendwie will das nicht funzen. Habe in meinen Code jetzt Folgendes drin:
Code:

 IF rotate THEN
   winkel = 1
   FOR i = 1 TO 8
    radius = SQR(Feld3D(i).x ^ 2 + Feld3D(i).z ^ 2)
    WinkelImBogenmass = winkel * ATN(1) / 45
    Feld3D(i).x = COS(WinkelImBogenmass) * radius
    Feld3D(i).z = SIN(WinkelImBogenmass) * radius
   NEXT i
  END IF

Wie gesagt, in Feld3D() sind alle 8 (3D-)Eckpunkte gespeichert, und ich möchte,
dass sich der Quader bei jedem Schleifendurchlauf um 1° dreht.

Danach folgen nur noch SUBs zur Anzeige und Auswertung der Benutzereingaben.

Was mache ich falsch??

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

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

Hallo?

Wo wird winkel denn erhöht? Ich sehe nur, das es immer =1 gesetzt wird. Du musst ja zum Startwinkel in jedem Schritt ein Grad dazu zählen.

Gruss
Skilltronic
_________________
Elektronik und QB? www.skilltronics.de !
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mex



Anmeldungsdatum: 21.03.2005
Beiträge: 4

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

Lad dir doch das 3d tutorial von www.qbasic.de runter, da steht alles drinnen (rotation, translation, zerren), was man braucht
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 21.03.2005, 13:02    Titel: Antworten mit Zitat

Ich persönlich würde ja dazu raten, erst mal ein paar Seiten zum Thema in einem guten Mathebuch zu lesen - auch wenn jetzt Ferien sind. zwinkern

Gruss
Skilltronic
_________________
Elektronik und QB? www.skilltronics.de !
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 21.03.2005, 13:23    Titel: Antworten mit Zitat

Huuups, hast Recht peinlich , Skilltronic...
Skilltronic hat Folgendes geschrieben:

auch wenn jetzt Ferien sind.

Das will ich doch meinen.
Mex hat Folgendes geschrieben:

das 3d tutorial von www.qbasic.de, da steht alles drinnen

Schon klar, aber da braucht man schon ein bisschen, bis man da durch-
gestiegen ist...

Vielen Dank,

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 21.03.2005, 13:28    Titel: Antworten mit Zitat

weinen weinen
Das war aber auch nicht das Problem, fällt mit gerade so auf...
Irgendwie ist der Radius zu groß, denn der Mittelpunkt des Quaders
liegt ja in (0|0|0), und dadrum soll er sich ja auch drehen...

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
MisterD



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

BeitragVerfasst am: 21.03.2005, 17:06    Titel: Antworten mit Zitat

ich schau ma ob ich den Source von meiner 3D-Lib noch finde. da ist das drin und funktioniert. Moment -> suchen

QB-Source find ich ned, hab mal die entsprechende Stelle aus der Java-Version genommen.
http://phpfi.com/55065
einfach nach Basic als sub portieren. dreht dir einen Punkt.
drehung.punkt -> Punkt um den gedreht wird (.x, .y, .z)
drehung.b -> breitendrehung (links-rechts, primär)
drehung.h -> höhendrehung (hoch-runter, sekundär)
drehung.w -> kipp-drehung/banking (links/rechts kippen, tertiär)

x, y und z alleine sind die ausgangsdaten die du dann an die Sub übergeben musst.
zielvektor.x .y und .z sind dann die rückgabe.

Bei fragen meld dich irgendwie. MSN, ICQ, YIM, AIM, Skype, irgendwas..

/edit:
ach äh, die koordinaten gingen glaub ich x nach hinten, y nach rechts und z nach oben. Musste dementsprechend verändern.
_________________
"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
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 21.03.2005, 20:05    Titel: Antworten mit Zitat

MisterD hat Folgendes geschrieben:

hab mal die entsprechende Stelle aus der Java-Version genommen.

Merkt man irgendwie...
Aber wenn du so viel Ahnung von 3D hast, kannst du dir dann bitte mal
die Formeln da oben von Skilltronic angucken? Ist da vielleicht ein Fehler?
Oder in meinem Prog??

Wäre echt nett,

jb


Zuletzt bearbeitet von jb am 21.03.2005, 21:16, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
MisterD



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

BeitragVerfasst am: 21.03.2005, 20:34    Titel: Antworten mit Zitat

Bei ihm ist das problem, das er nicht dran gedacht hat, dass der Radius am anfang nicht 0 ist. du müsstest also erst irgendwie mit ATN(x/z) den basiswinkel rausholen und dann in dem Sinus dazuaddieren.. kA wie das genau geht. ich hab bei mir halt direkt gedreht.. Ich weiß auch ned, welche Variante schneller ist, aber Speed brauchst du ne menge sobald du nichtmehr nur Wireframe sondern mit ausgefüllten Flächen machst. ich hatte mal gebenchmarkt auf nem 750mhzler mit Nvidia Riva TNT2, 100 zufällige Dreiecke auf Screen 12 oder 13, weiß ned mehr, hatten alleine zum Zeichnen 2,5 Sekunden gedauert. Wenn du dann noch von jedem Dreieck die Eckpunkte mit rund 4 Sinusrechnungen por Punkt, sprich insgesamt ca. 1200 Sinusrechnungen durchführen musst, das schaffste ned mehr. Daher hab ich das Projekt in QB dann auch aufgegeben.

Die fertige Java-Version gibts auf meiner Homepage in der Codeing-Rubrik
_________________
"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
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 21.03.2005, 22:30    Titel: Antworten mit Zitat

Vielleicht dürfte

http://www.dreael.ch/Deutsch/Download/Pyramide3D.html

interessant sein; vor allem die C++-Version glänzt dort mit einer einfachen 3D-Bibliothek, die sich für eine QB-Portierung auch eignen sollte.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 21.03.2005, 22:40    Titel: Antworten mit Zitat

THX, aber ich glaube, auf Anhieb steige ich da nicht durch...

Kann jemand vielleicht einen Code posten, mit dem man zwei gegenüberliegende
Punkte mit einem gleichen Abstand von der y-Achse umeinander rotieren lassen kann?

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 21.03.2005, 23:50    Titel: Antworten mit Zitat

Hallo

MisterD hat Folgendes geschrieben:
Bei ihm (Skilltronic - Anm. d. Verfassers) ist das problem, das er nicht dran gedacht hat, dass der Radius am anfang nicht 0 ist.


Also ich nehme an du meinst den Anfangswinkel, nicht den Radius. Aber egal, ich hatte beides hier schon angesprochen. Wie man aus den Koordinaten mittels ATN den Winkel zu Beginn berechnet, darum ging es hier schonmal:

http://forum.qbasic.at/viewtopic.php?t=577&highlight=atn

Wo genau liegt denn die Schwierigkeit? So lange nur um eine Achse gedreht wird, ist es ja alles eigentlich nur 2D auch wenn ein 3D-Körper gedreht wird.

1. Winkel und Abstand des zu drehenden Punktes zur Drehachse mit ATN & Pythagoras berechnen..

2. Winkel ändern.

3. Mit SIN und COS aus dem neuen Winkel (der Radius bleibt gleich) die neuen Koordinaten berechnen - fertig.

Wenn du nur zwei gegenüberliegende Punkte rotieren lässt, kannst du dir sogar den Startwinkel sparen.

Gruss
Skilltronic
_________________
Elektronik und QB? www.skilltronics.de !
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic. 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