Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 20.03.2005, 21:39 Titel: 3D-Rotation |
|
|
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 |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 20.03.2005, 21:52 Titel: |
|
|
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 |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 20.03.2005, 22:16 Titel: |
|
|
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 |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 20.03.2005, 22:34 Titel: |
|
|
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 |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 20.03.2005, 22:51 Titel: |
|
|
Dankeschön, werde ich ausprobieren!
jb |
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 21.03.2005, 11:51 Titel: |
|
|
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 |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 21.03.2005, 12:23 Titel: |
|
|
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 |
|
 |
Mex
Anmeldungsdatum: 21.03.2005 Beiträge: 4
|
Verfasst am: 21.03.2005, 12:51 Titel: |
|
|
Lad dir doch das 3d tutorial von www.qbasic.de runter, da steht alles drinnen (rotation, translation, zerren), was man braucht |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 21.03.2005, 13:02 Titel: |
|
|
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.
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 21.03.2005, 13:23 Titel: |
|
|
Huuups, hast Recht , 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 |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 21.03.2005, 13:28 Titel: |
|
|
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 |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 21.03.2005, 17:06 Titel: |
|
|
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 |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 21.03.2005, 20:05 Titel: |
|
|
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 |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 21.03.2005, 20:34 Titel: |
|
|
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 |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 21.03.2005, 22:40 Titel: |
|
|
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 |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 21.03.2005, 23:50 Titel: |
|
|
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 |
|
 |
|