 |
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 |
Tron
Anmeldungsdatum: 08.08.2005 Beiträge: 3
|
Verfasst am: 10.08.2005, 14:02 Titel: Drehung in 3-D |
|
|
Holla,
ich hab ein Problem das ich mit meinem noch beschränkten QB-Wissen noch nicht lösen konnte und hoffe das ihr mir helfen könnt.
Ich möchte einen punkt in einem 3-Dimensionalen Koordinatensystem drehen, jedoch glaube ich das er sich nicht korrekt verhält. Warum??
Zusätzlich wäre ein Achsensystem mit den exakten achsverläufen nicht schlecht.
im folgenden zwei Codes der 1. beinhaltet das problem, der 2. die um ein paar funktionen erweiterten Formeln. Kann mir irgendjemand helfen.
1.:
Code: |
SCREEN 12'640*480
CLS
X0 = 0: Y0 = 0
XH = 320: YH = 240
XC = 640: YC = 480
PI = 3.1415
WINDOW (0, 0)-(640, 640)
XK = 50
YK = 50
ZK = 50
KX = 1
KY = 1
KZ = 1
WA = (30 / 180) * PI
WB = (30 / 180) * PI
PSET (PX + XH, PY + YH), 10
LOCATE 1, 1: COLOR 1: PRINT "Drehung auf der XZ-Ebene"
FOR GRA = 0 TO 360 STEP .01
RAD = (GRA / 180) * PI
XN = COS(RAD) * XK - SIN(RAD) * YK + 0 * ZK
YN = SIN(RAD) * XK + COS(RAD) * YK + 0 * ZK
ZN = 0 * XK + 0 * YK + 1 * ZK
XK = XN
YK = YN
ZK = ZN
PX = (XK * KX * COS(WA) - YK * KY * COS(WB)) + XH
PY = (XK * KX * SIN(WA) + Y * KY * SIN(WB) + Z * KZ) + YH
PSET (PX, PY), 1
' PSET (PX, PY), 0
NEXT GRA
XK = 50
YK = 50
ZK = 50
LOCATE 2, 1: COLOR 10: PRINT "Drehung auf der XY-Ebene"
FOR GRA = 0 TO 360 STEP .01
RAD = (GRA / 180) * PI
XN = COS(RAD) * XK + 0 * YK - SIN(RAD) * ZK
YN = 0 * XK + 1 * YK + 0 * ZK
ZN = SIN(RAD) * XK + 0 * YK + COS(RAD) * ZK
XK = XN
YK = YN
ZK = ZN
PX = (XK * KX * COS(WA) - YK * KY * COS(WB)) + XH
PY = (XK * KX * SIN(WA) + Y * KY * SIN(WB) + Z * KZ) + YH
PSET (PX, PY), 10
' PSET (PX, PY), 0
NEXT GRA
XK = 50
YK = 50
ZK = 50
LOCATE 3, 1: COLOR 15: PRINT "Drehung auf der YZ-Ebene"
FOR GRA = 0 TO 360 STEP .01
RAD = (GRA / 180) * PI
XN = 1 * XK + 0 * YK + 0 * ZK
YN = 0 * XK + COS(RAD) * YK - SIN(RAD) * ZK
ZN = 0 * XK + SIN(RAD) * YK + COS(RAD) * ZK
XK = XN
YK = YN
ZK = ZN
PX = (XK * KX * COS(WA) - YK * KY * COS(WB)) + XH
PY = (XK * KX * SIN(WA) + Y * KY * SIN(WB) + Z * KZ) + YH
PSET (PX, PY), 15
' PSET (PX, PY), 0
NEXT GRA
|
2.:
Code: |
' Translation
' Faktor der Translation : DX, DY, DZ
' Ursprungskoordinaten : PX, PY, PZ
' Resultierende Koordinaten : XT, YT, ZT
XT = PX + DX
YT = PY + DY
ZT = PZ + DZ
' Rotation um eine X-, Y- und Z-Achse
' Rotationswinkel in Grad : WXGra, WYGra, WZGra
' Rotationswinkel in Rad : WXRad, WYRad, WZRad
' Koordinaten der Paralellachse zu X-Achse : X0X , Y0X , Z0X
' Koordinaten der Paralellachse zu Y-Achse : X0Y , Y0Y , Z0Y
' Koordinaten der Paralellachse zu Z-Achse : X0Z , Y0Z , Z0Z
' Ursprungskoordinaten : XT , YT , ZT
' Resutierende Koordinaten : XRZ , YRZ , ZRZ
XRX = X0X
YRX = (YT - Y0X) * COS(WXRad) - (ZT - Z0X) * SIN(WXRad) + Y0X
ZRX = (YT - Y0X) * SIN(WXRad) + (ZT - Z0X) * SIN(WXRad) + Z0X
XRY = (XRX - X0Y) * COS(WYRad) + (ZRX - Z0Y) * SIN(WYRad) + X0Y
YRY = Y0Y
ZRY = (ZRX - Z0Y) * COS(WYRad) - (XRX - X0Y) * SIN(WYRad) + Z0Y
XRZ = (XRY - X0Z) * COS(WZRad) - (YRY - Y0Z) * SIN(WZRad) + X0Z
YRZ = (XRY - X0Z) * SIN(WZRad) + (YRY - Y0Z) * COS(WZRad) + Y0Z
ZRZ = Z0Z
' Skalierung
' Skalierungsfaktor : MX , MY , MZ
' Achsenschnittpunkt : X0 , Y0 , Z0
' Ursprungskoordinaten : XRZ, YRZ, ZRZ
' Resultierende Koordinaten : XSk, YSk, ZSk
XSk = (XRZ - X0) * MX + X0
YSk = (YRZ - Y0) * MY + X0
ZSk = (ZRZ - Z0) * MZ + Z0
' Spiegelung
' Schalterstellungen : 1 , -1
' Spiegelungsschalter : FX , FY , FZ
' Achsenschnittpunkt : X0 , Y0 , Z0
' Ursprungskoordinaten : XSk, YSk, ZSk
' Resultierende Koordinaten : XSp, YSp, ZSp
XSp = (XSk - X0) * FX + X0
YSp = (YSk - Y0) * FY + Y0
ZSp = (ZSk - Z0) * FZ + Z0
' Schiefwinklige Parallelprojektion
' Konstanten : KX , KY , KZ
' Projektionswinkel : WA , WB
' Ursprungskoordinaten : XSp, YSp, ZSp
' Resultierende Koordinaten : PXS, PYS
' Liste der Perspektiven :
' KX KY KZ WA WB
' Isometrie : 1.0 1.0 1.0 30 30
' Dimetrie : 1.0 0.5 1.0 - 7 139
' Kavalierperspektive : 1.0 0.5 1.0 0 135
PXS = X * KX * COS(WA) - Y * KY * COS(WB)
PYS = X * KX * SIN(WA) + Y * KY * SIN(WB) + Z * KZ
' Zentralprojektion
' Projektionszentrum : XP , YP , ZP
' Ursprungskoordinaten : XSp, YSp, ZSp
' Resultierende Koordinaten : PXZ, PYZ
PXZ = YP * (YSp - YP) / (XP - XSp) + YP
YNZ = YP * (ZSp - ZP) / (XP - XSp) + ZP
|
Danke schon im Voraus. _________________ ! Achtung: Anfänger im anmarsch !
Wer Rechtschreibfehler findet darf sie behalten oder überlesen, da bin ich großzügig. |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 10.08.2005, 19:43 Titel: Re: Drehung in 3-D |
|
|
Was heißt "verhält sich nicht korrekt"? Was meinst du damit? Dass das komisch aussieht wenn er sich dann bewegt, dass das nicht rund ist ist normal..
Tron hat Folgendes geschrieben: | Zusätzlich wäre ein Achsensystem mit den exakten achsverläufen nicht schlecht. |
Und was meinst du damit? Was sollen die Achsverläufe denn sonst sein wenn nicht exakt? Ne krumme Achse hab ich auf jeden Fall noch nicht gesehen.. _________________ "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 |
|
 |
Tron
Anmeldungsdatum: 08.08.2005 Beiträge: 3
|
Verfasst am: 10.08.2005, 20:09 Titel: |
|
|
1.: Es ist mir durchaus klar, das sich die Bewegung nicht auf den exakten Kreisbahnen vollziehen. Nur die Lage der 3 Oritale sieht ziemlich willkürlich aus, genauso ihre Winkel zueinander. aber das gibt sich warscheinlich mit dem Zeichnen der 3 Achsen. Womit wir bei punkt Zwei wären.
2.: Mir ist klar das eine achse nicht krumm verläuft nur das problem ist, das ich den Achsenschnittpunkt nicht in der Bildschirmmitte zum Liegen bekomme ohne größere Korrekturwerte einführen zu müssen (Bis zu |X| = 300 bei screen 13. Ohne korrektur liegt er aber auch nicht direkt am Rand des Bildschirms.). Das gibt mir eben Rätsel auf um deren Lösung ich mich zumindest den halben Tag bemüht habe, jedoch ohne Erfolg. Mein Mathematikwissen liegt aber auch schon hoch genug um zumindest zu wissen das dies nicht der fall sein dürfte (ende 10. Klasse Gymnasium, und darüber hinaus eigenstudium für Privaten gebrauch). _________________ ! Achtung: Anfänger im anmarsch !
Wer Rechtschreibfehler findet darf sie behalten oder überlesen, da bin ich großzügig. |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 11.08.2005, 00:15 Titel: |
|
|
also zunächst musst du dir für die Darstellung nen Maßstab überlegen, zB eine Einheit soll 1cm sein. Dann musst du dir auch erst noch überlegen, wie du deine Achsen legen willst.. In der Mathematik ist aktuell X nach vorne, Y nach links und Z nach oben. Dann musst du dir auch noch überlegen, wie du die Drehungen anbringst. Meistens sind die der Reihe nach Breitendrehung, positiv=linksrum wenn du dich als Kamera drehst, Höhendrehung, positiv=nach oben und die Winkeldrehung, praktisch Kopf schieflegen, positiv=linkrum schieflegen. Die Richtungen benutz ich immer so, wie die Standardmäßig sind wenns da n standard gibt weiß ich ned.
Sag mir einfach mal, wie du das machen willst. _________________ "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 |
|
 |
Tron
Anmeldungsdatum: 08.08.2005 Beiträge: 3
|
Verfasst am: 12.08.2005, 18:20 Titel: |
|
|
Ja, danke. Aber inzwischen hab ich es nach 7h Codeschreiben und ändern selbst geschaft. jezt sind nur noch die Achsen vertauscht aber der rest funktioniert soweit, dass ich mir meine Attraktoren betrachten kann.
Ich werd aber trozdem die Achsenendpunkte alle mal durchgehen, nicht dass ich da einen Fehler gemacht habe.
PS.: Wozu Masstab?? das geht auch alles ohne bei mir. Ich brauche ja keine exakten Werte, sondern nur schöne Abbildungen. Ich kann dir mal den mit dem programm gezeichneten Rösslerattraktor zuschicken da sind sämtliche operationen wie Skalierung,Translation, Drehung, Spiegelung und Projektion in Kavalierperspektive. Die Zentralprojektion hab ich aufgegeben, da ich dafür noch keine perfekte Formel gefunden habe. _________________ ! Achtung: Anfänger im anmarsch !
Wer Rechtschreibfehler findet darf sie behalten oder überlesen, da bin ich großzügig. |
|
Nach oben |
|
 |
marzec
Anmeldungsdatum: 13.10.2004 Beiträge: 267
|
Verfasst am: 12.08.2005, 21:46 Titel: |
|
|
hm zentralprojektion ausgehend von einem viewpoint:
fokus = abstand viewpoint von viewplane
u = x coord auf viewplane
v = y coord auf viewplane
x, y, z = coords eines punktes im viewspace
u = x * fokus / ( z + fokus )
v = y * fokus / ( z + fokus )
wobei auf eine etwaige division durch 0 zu achten ist, die summe im divisor kann man auch weglassen und nur durch z dividieren führt zu einem etwas geweitetem sichtfeld.
bin mir jetzt nicht sicher ob das die zentralprojektion ist. _________________ Yagl - yet another gameprogramming library |
|
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.
|
|