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:

Drehung in 3-D

 
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
Tron



Anmeldungsdatum: 08.08.2005
Beiträge: 3

BeitragVerfasst am: 10.08.2005, 14:02    Titel: Drehung in 3-D Antworten mit Zitat

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



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

BeitragVerfasst am: 10.08.2005, 19:43    Titel: Re: Drehung in 3-D Antworten mit Zitat

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



Anmeldungsdatum: 08.08.2005
Beiträge: 3

BeitragVerfasst am: 10.08.2005, 20:09    Titel: Antworten mit Zitat

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



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

BeitragVerfasst am: 11.08.2005, 00:15    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 08.08.2005
Beiträge: 3

BeitragVerfasst am: 12.08.2005, 18:20    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 13.10.2004
Beiträge: 267

BeitragVerfasst am: 12.08.2005, 21:46    Titel: Antworten mit Zitat

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