#1 09.01.2006 10:30:44

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

Mathe Problem: Bewegung meiner Planeten

Hi!

Mal zur Abwechslung ein Mathe-Problem.

So erstelle ich die Daten für Planeten (1-31, 1 ist Sonne und fix auf 0,0,0):

Code: delphi

  //Planeten
  for i:=1 to 31 do begin
    if i=1 then begin
    //Sonne
      planet3d[i].nrotx:=0;
      planet3d[i].stexturename:='sun.dds';
      planet3d[i].sbumptexture:='p1DOT3.dds';
    end else begin
      planet3d[i].nweite:=i*1000;
      planet3d[i].nrmul:=planettyp[i].nrmul;
      planet3d[i].ngmul:=planettyp[i].ngmul;
      planet3d[i].nbmul:=planettyp[i].nbmul;
      planet3d[i].stexturename:='p'+inttostr(i mod 10+1)+'.dds';
      planet3d[i].sbumptexture:='p'+inttostr(i mod 10+1)+'DOT3.dds';
      planet3d[i].nrotx:=120+i*10;
      planet3d[i].nrotspeed:=1000;//+i*20
    end;
  end;



Und so bewege ich die:

Code: delphi

    for i:=1 to 31 do begin
          if i>1 then begin
            x:=cos(planet3d[i].nweite/planet3d[i].nrotspeed)*planet3d[i].nrotx;
            z:=sin(planet3d[i].nweite/planet3d[i].nrotspeed)*planet3d[i].nrotx;
            y:=32-i*2;
          end else
          if i=1 then begin
            x:=0;
            y:=0;
            z:=0;
          end;
          planet3d[i].x:=x;
          planet3d[i].y:=y;
          planet3d[i].z:=z;
        end;



Eigentlich recht simpel. Allerdings kreisen die zwar immer schön um die Sonne, aber irgendwie nähern die sich aneinander an, und wenn ich die ewig kreisen lasse, schweben die nach einiger Zeit schön in einer Schlange/Reihe um die Sonne, einer schön neben dem anderen, sieht nicht so toll aus. Was entgeht mir hier gerade, sieht das jemand?

Danke,
Firle

Offline

 

#2 09.01.2006 10:36:38

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

Re: Mathe Problem: Bewegung meiner Planeten

Ist es richtig, das alle Planeten gleichschnell drehen?
planet3d[i].nRotSpeed:=1000;

Wo änderst du den Winkel? (planet3d[i].nRotX)


Coolcat


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

Offline

 

#3 09.01.2006 10:41:45

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

Re: Mathe Problem: Bewegung meiner Planeten

Hi!

danke fürs Reinschauen  big_smile

Erst hatte ich die verschieden schnell, aber dann hatte ich dieses Reihe-problem und die gleichschnell gemacht. Hat aber nix genützt scheinbar.

Die beiden nRot Werte ändere ich nicht mehr, nur die Weite nach dem Rendern eines Planeten:

planet3d[i].nweite:=planet3d[i].nWeite+time_elapsed*30;

Time_elapsed ist die verstrichene Zeit seit dem letzten Frame.

Ich kann auch meine ganze draw_Planets Funktion reinposten, die ist nur relativ lang (die war ja hier öfter schon drin wink)

Firle

Offline

 

#4 09.01.2006 11:41:23

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

Re: Mathe Problem: Bewegung meiner Planeten

Setzt du den planet3d[i].nweite auch irgendwann wieder zurück?
Ich vemute mal, dass die Variable vom Typ Single ist. Je größer die Zahl wird, desto ungenauer wird dieser Datentyp. Ich würde die Planeten anders rotieren, und zwar direkt über den Winkel:

Jeder Planet hat einen Winkel (alpha), entfernung zum Ursprung (radius) und eine Winkelgeschwindigkeit (rotspeed).
Ein Winkel ist eine Zahl zwischen 0 und 2*PI. Der Radius ist klar und die Winkelgeschwindigkeit ist in Grad pro Sekunde.

Jedes Frame änderst du den Winkel:
planet3d[i].alpha := planet3d[i].alpha + timeElapsed * planet3d[i].rotspeed;
while (planet3d[i].alpha >= 2*PI) do planet3d[i].alpha := planet3d[i].alpha - 2*PI;
while (planet3d[i].alpha < 0) do planet3d[i].alpha := planet3d[i].alpha + 2*PI; //diese Zeile kannst du weglassen, wenn du kein negativen Geschwindigkeiten zulässt.

Die Position berechnest du dann so:
planet3d[i].x := cos(planet3d[i].alpha) * planet3d[i].radius;
planet3d[i].y := 32-i*2;
planet3d[i].z := sin(planet3d[i].alpha) * planet3d[i].radius;

Coolcat


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

Offline

 

#5 09.01.2006 11:55:45

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

Re: Mathe Problem: Bewegung meiner Planeten

Hi Coolcat,

nWeite wird nicht zurückgesetzt. Der Typ ist single, time_elapsed ist nämlich auch Single. Gibt es eine einfachere Lösung, nur den Datentyp zu ändern? Wahrscheinlich nicht, grrr. :x

Oder gibt es eine Möglichkeit, ähnlich wie in deinem Code die nWeite zurückzusetzen wenn die einen bestimmten Wert überschreitet?

Ich muss dann nämlich ziemlich viel ändern, weil andere Objekte wiederum ähnlich berechnet werden, die in der Nähe von den Planeten sind (Sternentor, Raumschiff etc).

Ansonsten ist dein Code schön verständlich und sieht gut aus, wenn es keine einfachere Möglichkeit gibt, übernehme ich das so...

Vielen Dank,
firlefanz

Offline

 

#6 09.01.2006 11:58:09

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

Re: Mathe Problem: Bewegung meiner Planeten

Du berechnest dir einfach den Punkt, ab wann dein Planet wieder an der Ausgangsposition ist. Wenn deine Variable diesen Punkt überschritten hat, kannst du dann den Betrag dieses Punktes wieder abziehen.


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

Offline

 

#7 09.01.2006 11:59:34

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

Re: Mathe Problem: Bewegung meiner Planeten

So hatte ich mir das auch gedacht.

Mal doof gefragt: Wie berechne ich den denn? :down:
*überleg*

Firle

Offline

 

#8 09.01.2006 13:29:01

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

Re: Mathe Problem: Bewegung meiner Planeten

Du brauchst nur darauf zu achten, dass dein Argument im Cos oder Sin, eben
planet3d[i].nweite/planet3d[i].nRotSpeed
nicht aus dem [0, 2*Pi]-Bereich herauskommt.

Das heißt wiederum, dass
planet3d[i].nweite
nicht aus dem
[0, 2*Pi*planet3d[i].nRotSpeed]-Bereich
herausdarf.

Also könntest du sowas machen, wie:
if planet3d[i].nweite<0 then
planet3d[i].nweite:=planet3d[i].nweite+2*Pi*planet3d[i].nRotSpeed;
und
if planet3d[i].nweite>2*Pi*planet3d[i].nRotSpeed then
planet3d[i].nweite:=planet3d[i].nweite-2*Pi*planet3d[i].nRotSpeed;

Das jedesmal, nachdem du nweite verändert hast.

Würde alles einfacher, wenn man nur einen Winkel hätte.

Peer

Offline

 

#9 09.01.2006 14:31:25

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

Re: Mathe Problem: Bewegung meiner Planeten

Hi DerPeer,

ja, ich hätte das besser anders gelöst.

Zitat:


if planet3d[i].nweite>2*Pi*planet3d[i].nRotSpeed then
planet3d[i].nweite:=planet3d[i].nweite-2*Pi*planet3d[i].nRotSpeed;

Das probier ich mal, vielen Dank!

Firle

Offline

 

Brett Fußzeile

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson