3d scrollen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
INFACT
User
Beiträge: 385
Registriert: Freitag 5. Dezember 2008, 16:08

So, Ich arbeite wieder an meinem 3d programm mit panda weiter.
Ich habe das jetzt geschafft, dass Man entweder vertikal oder horizontal um den panda drehen:

Code: Alles auswählen

                #VERTIKAL
                
            
                print base.camera.getZ()
                phi1 = vector.Vector(0, #z
                                     self.radius,
                                     0) #x
                phi2 = vector.Vector(base.camera.getZ(),
                                     base.camera.getY(),
                                     base.camera.getX())
                

                phi = phi1.angle(phi2)

                if bool(phi2[2] < 0):
                    #On the other side
                    phi = -phi
                    
                move = self.mouse_lastest_x - self.mouse_now_x
                move = move * 6#speed
                cx = self.radius * math.sin(phi + move)
                cy = self.radius * math.cos(phi + move)
                base.camera.setX(cx)
                base.camera.setY(cy)
                base.camera.lookAt(self.panda)


                del phi1, phi2, phi, move, cx, cy
                #HORIZONTAL
                phi1 = vector.Vector(0,
                                     self.radius,
                                     0)
                phi2 = vector.Vector(base.camera.getZ(),
                                     base.camera.getY(),
                                     base.camera.getX())

                phi = phi1.angle(phi2)


                if 0:#bool(phi2[2] < 0):
                    #On the other side
                    phi = -phi

                move = self.mouse_lastest_y - self.mouse_now_y
                move = move * 6#speed
                cx = self.radius * math.cos(phi + move)#sin
                cy = self.radius * math.cos(phi + move)#cos
                cz = self.radius * math.sin(phi + move)
                base.camera.setY(cy)
                base.camera.setZ(cz)
                base.camera.lookAt(self.panda)
Aber wie oben nicht beides. Dann dreht der immer in so einem 3d u dessen enden nach hinten wegklappen, dann runter gehen und zusammen schließen. Ich weiß nicht wie ich das sonst beschreiben könnte.
Wie geht das das ich überall hindrehen kann?
[b][i]ein kleines game für die die lust haben http://konaminut.mybrute.com[/i][/b]
;-)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi,

also zunächst einmal: Ich verstehe Deine Frage nicht 100%ig - kannst Du die nochmal in etwas klarerem Deutsch wiederholen?

Aber mir fallen einige Seltsamheiten im Code auf - vielleicht hilft es ja schon weiter sie zu benenne:
- in Zeile 5 und 8 erstellst Du zwei Vector-Instanzen und benennst sie in Winkel, um dann in Zeile 13 tatsächlich in einen Winkel zu konvertieren. Das ist zumindest unorthodox - und mit Sicherheit ein Punkt zum Refactoring.
- in Zeile 15 konvertierst Du ein bool zu einem bool. Warum das denn? (Der Aufruf von bool() ist überflüssig!
- Zeile 40 ist logisch etwas vollkommen Anderes als Zeile 15, dabei sollte es doch eigentlich dasselbe machen?
- Zeile 28: Das 'del'-Statement ist überflüssig.

Zur Frage des beliebigen Drehens: Du hast zwei versch. Winkel, die beide phi heissen?! Das ist hochgeradig unlogisch, denn je nach Achse ergibt sich eine andere Rotationsmatrix. Wie wäre es, Du bestimmst einen Anfangs und einen Endpunkt und interpolierst - für jeden Zeitpunkt? Hiebei wendest Du die zu errechnenden Rotationsmatrices sukssesive an.

Und wenn Du Dich jetzt fragst: Rotationsmatrices??? Dann schau mal auf die Zeilen 21-24 und 46-50. Wenn Du das Matrixkonzept realisierst, kannst Du die jeweils in eine Zeile packen und beliebig drehen.

HTH
Christian

edit: Rechtschreibung.
Zuletzt geändert von CM am Sonntag 15. November 2009, 11:51, insgesamt 1-mal geändert.
INFACT
User
Beiträge: 385
Registriert: Freitag 5. Dezember 2008, 16:08

1. Was ist unorthodox?
2. Ich hatte probleme damit, als ich das nocht nicht in ein bool konvertiert habe. Ich weiß auch nicht warum.
3. Das ist weil es nicht untenrum drehen sollte. Vertikal dreht es in einem kreis, horizontal nur in einem kreis, der über der welt ist, damit man nicht unter den panda schaut
4. Das weiß ich, ich dachte ich schreibe es nur nochmal dazu damit man das besser nachvollziehen kann...

Und das klarer wiederholen:

Ich habe eine panda figur in einer 3d welt. Ich möchte um den panda drehen, wenn ich die rechte maustaste gedrückt habe.

gedrückt rechts:
nach oben ziehen = horizontal um den panda drehen
nach rechts ziehen = vertikal um den panda drehen

Mit dieser kombination sollte es mir möglich sein an jede stelle des pandas gucken.
Das ist aber nicht der Fall. Wenn ich nur das horizontale oder nur das vertikale "aktiviere" ( Das andere auskommentiere ) funktioniert das wunderbar. Wenn ich aber beides habe, geht die kamera immer nur [ in zwei hintereinander stehenden U 's deren obere enden sich in der mitte treffen, die rechten enden treffen sich und die linken treffen sich ]. Jetzt ist meine Frage warum das passiert und man nicht wie oben beschrieben, überall hin drehen kann. Der code ist ein Ausschnitt des programms, in dem die position der camera neu gesetzt wird. Die variablen sollten klar sein oder? Ich kann euch gerne den Ganzen code zeigen, der ist allerdings nicht aufgeräumt.

Achso: xy und z sind in dem vector modul anders als beim panda.
Beim vector ist x oben y rechts und z hinten, beim panda z rechts und x hinten.

Den zweiten teil deines beitrags kann ich dir noch nicht beantworten... das mach ich heute abend
[b][i]ein kleines game für die die lust haben http://konaminut.mybrute.com[/i][/b]
;-)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

ad 1 (unorthodox): Ein Winkel ist kein Vektor. Ein Winkel kann von Vektoren eingeschlossen sein. Was ich meine ist, dass "phi" wie ein Winkel klingt, tatsächlich aber eine Instanz einer Vektorklasse zu sein scheint. Und in der Tat: Zeile 13 liest sich, als ob erst dort ein Winkel berechnet würde.
ad 2: Was ist "phi2[2]", welcher Typ? Entweder es handelt sich um eine Zahl oder der Vergleich ist ohnehin unsicher und damit ein (potentieller) Bug. Das bool() notwendig ist, kann eigentlich nicht sein.
ad 3: Ah, verstehe. Aber es bleibt unlogisch. Warum sollte man im Blickwinkel nicht nach unten kippen können? Lediglich der Endpunkt der Drehung sollte so beschränkt sein, so dass der Betrachter nicht "in die Erde taucht", oder?
INFACT hat geschrieben:gedrückt rechts:
nach oben ziehen = horizontal um den panda drehen
nach rechts ziehen = vertikal um den panda drehen
Sorry, aber das finde ich auch etwas seltsam, denn ich frage mich, ob man mit der Maus als menschlicher Anwender tatsächlich nur in eine Richtung ziehen kann. Intuitiv - und da kann ich falsch liegen (!) - würde ich denken, daß man aufzeichnen sollte vom Beginn des Rechtsklicks bis zum Zeitpunkt t2 (z. B. 1/2 Sekunde später) und die Differenz in x und y aufzeichnet. Ist die Taste dann noch gedrückt schaut man nach der ersten Bewegung nochmal hin. (Wahrscheinlich sollte man häufiger schauen, aber das mußt Du für Deine Anwendung testen und wahrscheinlich ist eine threadbasierte Lösung sowieso besser in so einem Fall.) Ggf. kann man kleine Differenzen in x oder y unter den Tisch fallen lassen, um lediglich die Bewegung in einer Richtung simulieren zu können. Und denn bewegt man halt die Kamera.

Wobei ich noch denke: Am besten verwendet man Polarkoordinaten für die Kamerabewegung, weil es dann leichter fallen dürfte eine gleichmäßige Bewegung zu berechnen. Könnte sein, dass Du das schon beabsichtigst, aber so ganz schlau werde ich aus dem Code noch nicht. (Und im zweiten Abschnitt ist cx == cy, cx wird aber gar nicht verwendet. Für eine gleichzeitige Bewegung in beide Richtungen, müssen sich natürlich alle Kamerakoordinaten gleichzeitig verändert werden können. Dazu kannst Du auch alle Veränderung - erst horizontal, dann vertikal oder umgekehrt - berechnen und zusammen applizieren.)

Gruß,
Christian
INFACT
User
Beiträge: 385
Registriert: Freitag 5. Dezember 2008, 16:08

Ich habe das jetzt wieder angefangen und bin jetzt hier:

Code: Alles auswählen

                #Vertikal
                phi1 = vector.Vector(0,
                                     self.radius,
                                     0)
                phi2 = vector.Vector(base.camera.getZ(),
                                     base.camera.getY(),
                                     0)#base.camera.getX())

                phi = phi1.angle(phi2)


                if 0: #bool(phi2[2] < 0):
                     #On the other side
                    phi = -phi

                move = self.mouse_lastest_y - self.mouse_now_y
                move = move * 6#speed
                #cx = self.radius * math.cos(phi + move)#sin
                cy = self.radius * math.cos(phi + move)#cos
                cz = self.radius * math.sin(phi + move)
                NEW_Y = cy
                base.camera.setY(cy)
                base.camera.setZ(cz)
                base.camera.lookAt(self.panda)

                del phi1, phi2, phi, move, cx, cy # nur zur verdeutlichung
                
                #HORIZONTAL
            
                print base.camera.getZ()
                phi1 = vector.Vector(0,
                                     self.radius,
                                     0)
                phi2 = vector.Vector(0,#base.camera.getZ(),
                                     NEW_Y,#base.camera.getY(),
                                     base.camera.getX())
                
                print NEW_Y, "=", base.camera.getY()
                phi = phi1.angle(phi2)

                if bool(phi2[2] < 0):
                    #On the other side
                    phi = -phi
                    
                move = self.mouse_lastest_x - self.mouse_now_x
                move = move * 6#speed
                cx = self.radius * math.sin(phi + move)
                cy = self.radius * math.cos(phi + move)
                base.camera.setX(cx)
                base.camera.setY(cy)
                base.camera.lookAt(self.panda)
phi[2] ist eine Zahl, nämlich y. phi[:] = [x,y,z]

Kann mir vielleicht jemand ohne Code die vorgehensweise erklären, damit ich genauer weiß was ich machen soll, dann kann ich das in code schreiben. Ich habe bisher sowas nie berechnet. Hatten wir in der schule auch noch nicht.

Also noch mal zur erklärung:

Man hat ein Fenster in dem eine Figur ist um die sich eine cam drehen soll.
Man hat den radius ( also die entfernung zwischen der figur und der kamera ) gegeben.
Dann hat man noch die X Y und Z koordinate der cam.

Wie bekomme ich das jetzt so hin, dass:
Wenn ich meine Maus nach rechts/links bewege soll die kamera auch rechts/links um die figur kreisen
Wenn ich die Maus nach oben/unten bewege soll die kamera auch oben/unten um die figur kreisen

Mein Code oben funktioniert im 2d raum, also wenn man entweder den horizontalen oder vertikalen code weglässt. Ich vermute also, dass es an der Y koorinate liegt, weil diese 2 mal gesetzt wird.
[b][i]ein kleines game für die die lust haben http://konaminut.mybrute.com[/i][/b]
;-)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Oh, ich liebe Threads, die nur alle paar Monate aufleben ;-)

Also, so richtig werden wir hier nicht weiterkommen, denn Du sagst uns ja nicht, was "Vector" für eine Klasse ist. Woher kommt die? Und magst Du demnächst Code bitte auslagen (z.B. paste.pocoo.org), mir scheint schon, dass die Forumssoftware hier etwas träge wird.

Was man machen könnte, habe ich bereits erklärt. Dazu hängt es noch ein bißchen davon ab, welche Module so verwendest und was die bereits anbieten. Aber zu Deinem Code möchte ich nochmal Stellung nehmen - vielleicht hilft es weiter:

Code: Alles auswählen

phi = phi1.angle(phi2)
phi1 und phi2 sind Vektoren. Ok, doch das sind schon keine guten Namen für Vektoren - Du könntest Sie nachdem bennen, was sie repräsentieren sollen, z. B. "cameraview". Das macht das Lesen - auch für Dich viel klarer. Dann: Was ist *der Winkel* zweier Vektoren? Das ist ein bißchen Definitionsfrage. Im 3D-Raum finde ich Angabe einer Zahl jedenfalls etwas sinnfrei. Was steht denn in phi? Eine Zahl? Drei Zahlen? Wie sind die definiert? Welche Einheit haben sie?

Code: Alles auswählen

if 0:
ist immer falsch und wir nicht ausgeführt.
Statt

Code: Alles auswählen

phi = -phi
geht auch

Code: Alles auswählen

phi *= -1
und statt

Code: Alles auswählen

if bool(phi2[2] < 0):
einfach

Code: Alles auswählen

if phi2[2] < 0:
(Wozu der Aufruf von bool()?)

Warum für die horizontale Berechnung neue Objekte erstellen? Reicht es nicht die Position von phi2 upzudaten?

Also, in summa, wenn Du uns verrätst, was Du nutzt (welche Module), was "self" ist und was "base.camera", kann man auch konkreter werden.

Gruß,
Christian
Antworten