#1 04.08.2005 06:40:24

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Kamera zufällig in 3D Raum (Skybox) rumfliegen lassen

Hallo,

mein Menü und meinen Shop habe ich umgebaut und in eine 3D Scene gepackt, ein Asteroiden/Minen-Feld in einer Skybox.

Sieht sehr nett aus. Jetzt folgendes Problem, wir haben ja hier schlaue studierende Leute und Mathematiker.

Also Y ist senkrechte Achse, soll immer 0 sein.

X und Z sollen berechnet werden, und zwar als Eingangsparameter verstrichene Zeit (time_startelapsed).

X und Y dürfen -150 nicht unterschreiten, und 150 nicht überschreiten.

Einfach nur im Kreis rumfliegen ist nicht schön, also am besten immer anders im Bereich -150 bis 150 X und Z rumfliegen ohne zu wilde Schwenks  big_smile

Ich habe da was im Hinterkopf, das hatte einen französischen Namen, das war eine Art Schleife, die immer in einem vorgegebenem Raum rumfliegt.... und zwar jedesmal etwas anders, die malt sowas wie ein Gänseblümchen... Kann jemand so eine (oder zwei) formeln machen?

Im Kreis rumfliegen auch mit wechselndem Radius sieht nicht so toll aus, soweit habe ich es schon.

Danke!
Firle

Offline

 

#2 04.08.2005 08:23:14

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Kamera zufällig in 3D Raum (Skybox) rumfliegen lassen

[Edit: Topic verschoben. Dein Problem ist doch nicht Delphi spezifisch?! Warum traut sich eigentlich keiner in "Datenstrukturen und Algorithmen" zu posten? wink ]

Versuch es doch mit einem wirklich zufälligen Flug.

Wenn du es mathematisch korrekt machen willst schau dir mal Splines an. Sieht höchstwahrscheinlich genial aus, aber kann ich dir aber nich empfehlen und auch nich helfen, weil ich die Dinger selbst nich ganz verstanden hab...(die Klausur  Differentialgleichungen und Numerik schreib ich lieber erst nächstes Jahr... wink )

Die einfache Variante:
Setze zufällige Punkte in deinem Asteriodien Feld, die vielleicht auch irgendwie zumindest halbwegs im Kreis angeordnet sind. Setze z.B. 8 Punkte auf einem Kreis und addiere jeweils zufällige Werte, damit der Kreis zur Kartoffel wird:
http://www-users.rwth-aachen.de/Martin.Weusten/upload/kartoffel.jpg

Entweder machst du dir auf diese Art zwei Kreise (einen für Kamera und einen für KameraTarget) oder das KameraTarget ist einfach ein Stückchen weiter vorne.
Es muss auch kein Kreis sein, du kannst die Punkte ja auch zur Laufzeit generieren, dann sieht es immer anders aus...

Diese Punkte tust du dann interpolieren, z.B. hier mit:

Code: delphi

function cubic_interpolate(v0, v1, v2, v3,x)
  p = (v3 - v2) - (v0 - v1)
  q = (v0 - v1) - p
  r = v2 - v0
  s = v1

  return px^3 + qx^2 + rx + s
end of function



Beispiel (ein dimensional), wenn du einen Pixel der zwischen a und b liegt berechnen willst brauchst du für eine Cubic Interpolation folgende Punkte:
v0 := the point before a
v1 := the point a
v2 := the point b
v3 := the point after b

Bildchen:
http://freespace.virgin.net/hugo.elias/models/m_inter4b.gif

Das musst du dir dann noch irgendwie auf 2D fummeln...

Coolcat


My software never has bugs. It just develops random features.

Offline

 

#3 04.08.2005 09:02:10

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Kamera zufällig in 3D Raum (Skybox) rumfliegen lassen

Die Idee mit dem Kreis ist nicht schlecht. Vielleicht mache ich es noch einfacher und setze einfach irgendwo einen zufälligen Pubkt, dahinfliegen, und wenn erreicht, dann einfach irgendwo anders wieder zufälliger Punkt etc. Im moment fliege ich immer in wechselnden Kreisbahnen, ist nicht so toll.

Danke für den Tip! :mrgreen:

Firle

Offline

 

#4 04.08.2005 09:57:35

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Re: Kamera zufällig in 3D Raum (Skybox) rumfliegen lassen

Ich hätte sozusagen ein kleines Raumschiff programmiert. Die Physik dazu, meine ich.

Dann setzt Du wie Coolcat zeigt ein paar zufällige Waypoints in den Raum, die der Reihenfolge nach abzufliegen sind (wie du schon meintest).

Die Physik ist recht einfach, wenn man weiß, wie man sowas macht -  ich hab sowas früher tausendmal im Info-UnNterricht gemacht smile

xpos, zpos ist die Position der Kamera
xvel, zvel seien die Geschwindigkeiten

wNr der aktuelle Wegpunkt und WegpunktXpos[wNr] ist ja dann klar.

alles mit 0 initialisieren, erster Wegpunkt sei 1 (wNr:=1), und dann:

// die Cam will zum Waypoint:
xvel:=xvel+(WegpunktXpos[wNr]-xpos)*0.0001;  // 0.001? probieren
zvel:=zvel+(WegpunktZpos[wNr]-zpos)*0.0001;

// Viskosität damit nicht zu schnell und kein Schwingen:
xvel:=xvel*0.9;  // oder 0.99? 0.999? probieren
zvel:=zvel*0.9;

// Cam weiterfliegen lassen:
xpos:=xpos+xvel;
zpos:=zpos+zvel;

// Schauen, ob Waypoint erreicht:
if sqrt(sqr(WegpunktXpos[wNr]-xpos)+sqr(WegpunktZpos[wNr]-zpos))<20 then wNr:=wNr+1;

keine Ahnung, ob das gut aussieht. Frage ist auch, auf welchen Punkt deine Cam schaut.

Eine viel einfachere Möglichkeit sind auch solche ... Dinger hier:

x:=150*cos( zeit_in_sekunden/100 * 13);
z:=150*sin( zeit_in_sekunden/100 * 23);

wobei die 13 und die 23 Willkür sind, am besten Primzahlen. Je größer, desto mehr Kurven.

Offline

 

#5 04.08.2005 10:09:25

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Kamera zufällig in 3D Raum (Skybox) rumfliegen lassen

Die 0.0001 solltest du durch die Vergangene Zeit in Sekunden ersetzen
=> wesentlich flüssigere Animation


My software never has bugs. It just develops random features.

Offline

 

#6 04.08.2005 11:12:26

artzuk
GodlikeMember
Ort: Leipzig
Registriert: 24.01.2005
Beiträge: 1164

Re: Kamera zufällig in 3D Raum (Skybox) rumfliegen lassen

Hier, die hier können dir bestimmt sehr gut dabei helfen.

D3DXVec3Lerp und D3DXQuaternion ( -SLerp, -RotationAxis ... )


Mein kleiner .NET Blog: http://artzuk-interactive.de/

Offline

 

#7 04.08.2005 11:34:11

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Kamera zufällig in 3D Raum (Skybox) rumfliegen lassen

Hi Artzuk,

so wie ich das verstehe, interpolieren die dann z.b. den Vektor Quelle bis Ziel oder so.

Ich habe mir schon selber eine Funktion gebastelt, die Kamera und Hingug-Punkt abhängig von Zeit und Geschwindigkeit entsprechend langsam beweg/schwenkt, ich glaube, ich werde das erstmal damit probieren, falls das aber nicht gut aussieht, probier ich deins auch mal, danke  big_smile

Firle

Offline

 

Brett Fußzeile

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson