Physik Engine macht Probleme

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Physik Engine macht Probleme

    Hallo erstmal,
    befor ich meine erste Frage stelle, möchte ich darauf hinweisen,
    das ich zwar Englisch einigermaßen gut verstehe (zumindest der einfache kram ;) ) jedoch lernt man in der 7. Klasse herzlig wenig bergriffe
    rund um den Informatikbereich. :( Also bitte verweist nicht auf Englische Seiten (Wenn das bei meinem Problem überhaupt nötig ist):)
    Objective C Programme schreibe ich erst seit ein paar Wochen, allerdings kenne ich das meiste aus C und C++.
    Außerdem benutze ich Xcode 4.
    So, nun zum Problem:
    Da ich mich besonders für Spieleprogrammierung aber auch für Physik interessiere (habe eine eins im Halbjahreszeugnis) dachte ich mir,
    dass ich mir vielleicht eine simple Physik-Engine schreiben könnte.
    Ich habe es mir so vorgestellt:
    Es gibt eine Steuerklasse, die Weitere Klassen verwaltet.
    Für die Berechnung der nächsten Position muss man einfach nur die Methode move aufrufen, die dann weitere move-Methoden der zu Verwaltenden Klassen aufruft.
    Als Parameter übergibt sie einen Zeiger auf ein NSMutableArray, dass alle zu berechnenden Objekte enthält.
    So habe ich mir das Vorgestellt.
    Aber irgendetwas Funktioniert da nicht richtig. :(
    Xcode gibt mir in einer Zeile zweimal denselben Fehler zurück:
    Interface type cannot be statically allocated.
    Heir die Datei

    Quellcode

    1. #import
    2. #import "Defines.h"
    3. #import "PhyObj.h"
    4. #import "PSEvector2.h"
    5. #ifndef PhysicsGravi_H
    6. #define PhysicsGravi_H
    7. @interface PhysicsGravi : NSObject {
    8. @private
    9. PSEvector2 GraviDirection; //Das ist die Zeile mit den Fehlern
    10. }
    11. -(int) moveObjects;
    12. @end
    13. #endif
    Alles anzeigen



    moveObjects ist die Funktion für die Gravitations berechnung.
    PhyObj.h ist die Interface-Datei für die zu berechnenden Objekte.
    Defines.h definiert Präprozessor Konstanten, etwa PSE_Error falls eine Methode (z.B. moveObjects) fehl schlägt.
    PSEvector2 ist eine Klasse die für Positionen.
    Hier die Interface Datei von PSEvector2:

    Quellcode

    1. #import
    2. #import "Defines.h"
    3. @interface PSEvector2 : NSObject {
    4. @private
    5. float x,y;
    6. }
    7. - (id) initWithX: (float) Xnew andY: (float) Ynew;
    8. @end
    Alles anzeigen

    Ich denke hier muss man nichts zu sagen.
    Und hier ist die Impementations Datei:

    Quellcode

    1. #import "PSEvector2.h"
    2. @implementation PSEvector2
    3. - (id)init
    4. {
    5. self = [super init];
    6. if (self) {
    7. x = 0;
    8. y = 0;
    9. }
    10. return self;
    11. }
    12. - (id)initWithX:(float)Xnew andY:(float)Ynew
    13. {
    14. id Obj = [self init];
    15. x = Xnew;
    16. y = Ynew;
    17. return Obj;
    18. }
    19. - (void)dealloc
    20. {
    21. [super dealloc];
    22. }
    23. @end
    Alles anzeigen



    Bei der InitWithXandY Methode bin ich mir nicht sicher, ob ich das richtig gemacht habe.

    Wist ihr was ich Falsch mache?
  • a) Objekte brauchen eine Referenz (Zeiger): KlassenName *variable;
    b) Namenskonventionen: Klassen fangen mit GroßBuchStaben an und haben CamelCase (ist ok - nur PSEvector würde ich als PSEVector schreiben). Variablen bitte mit kleinBuchstaben anfangen und auch camelCase.

    =>

    Quellcode

    1. PSEvector2 *graviDirection; //Das ist die Zeile ohne Fehler

    Sonst fällt mir auf den ersten Blick nur der #import ohne weitere Angaben auf. Evtl. ist das aber erlaubt.

    Tip am Rande: unser Forumsmember Amin hat ein sehr gutes Buch in deutsch geschrieben...

    -- hns
  • 8|
    Ich denke, ich hätte meine Brille putzen müssen.
    Ich habe scheinbar immer übersehen das ich das Sternchen vergessen habe.
    Nun funktioniert der Code.
    Nun mal eine frage bezüglich der Genauigkeit:
    Ich habe der Gravi Klasse gerade eine float Variable graviPower hinzugefügt.
    Wie der Name schon sagt gibt die Variable die Stärke der Gravitation an.
    Nun ist die Frage, ist float wirklich geeignet?
    oder währe double besser?
    In allen Büchern die ich bis jetzt gelesen habe steht nur das double eine höhere Genauigkeit hat.
    Braucht ein double mehr Speicher oder kann sie weniger Vorkommastellen speichern?
    Außerdem kennt jemand die Durchschnittsgravitation?
  • newMacer schrieb:

    8|
    Ich denke, ich hätte meine Brille putzen müssen.
    Ich habe scheinbar immer übersehen das ich das Sternchen vergessen habe.
    Nun funktioniert der Code.
    Nun mal eine frage bezüglich der Genauigkeit:
    Ich habe der Gravi Klasse gerade eine float Variable graviPower hinzugefügt.
    Wie der Name schon sagt gibt die Variable die Stärke der Gravitation an.
    Nun ist die Frage, ist float wirklich geeignet?
    oder währe double besser?
    In allen Büchern die ich bis jetzt gelesen habe steht nur das double eine höhere Genauigkeit hat.
    Braucht ein double mehr Speicher oder kann sie weniger Vorkommastellen speichern?
    Außerdem kennt jemand die Durchschnittsgravitation?

    Klar braucht double mehr Speicher, dafür bekommst du eine genauere Berechnung. Wenns für Spiele sein soll, kannst du dir den double schenken, anders sieht es für wissenschaftliche Zwecke aus, wenn es auf eine ziemliche Genauigkeit ankommt.
  • Danke wolf_10de!
    Dann nehme ich lieber float.
    Nun zur Gravitationsberechnung.
    Ich will zum einen eine Berechnung einer " Erdanziehungskraft" und dann noch eine Berechnung von Anziehungskräften von Objekten (Ich meine PhyObj Objekte) untereinander.
    Bei Punkt Nr. 1 habe ich mal ein Tutorial für DirectX unter Windows gefunden. Theoretisch konnte ich die Berechnungen angepasst übernehmen.
    Die Formel für die Stärke für Punkt Nr. 2 habe ich, aber zum einen Brauche ich dafür den Abstand zwischen den Objekten (und ich komme einfach nicht darauf,
    wie man aus zwei PSEvector2 Objekten eine float Entfernung berechnen kann) zum anderen kriege ich eben nur eine Stärke, aber keine Position oder einen Richtungsvector.
    Die Formel:
    m1 * m2 (1 und 2 sind tiefgestelt)
    F = G * r²
    m1 und m2 sind eine zeile höher, weil sie die Zähler eines Bruches sind. r² ist der Nenner.
    G ist die Gravitationskonstante, m1 und m2 die Masse zweier Körper (float, double, int, long was ist besser? Ich habe so gar keinen schimmer wieviel masse mein MacBook hat :rolleyes: )
    r ist der Abstand der Mittelpunkte zweier Körper (Objekte).
    Bei r stand in meinem Buch noch in Klammern "Bei jeweils gleich verteilter Masse"
    Ich gebe zu, das außer das ich weiß das die Rechnung
    ((m1 * m2) : r²) * G = F
    Umgeschriben bedeutet garnicht mehr weiter.
  • Nicht im Physikunterricht. Wir sind gerade bei Temperatur.
    Sonst hatten wir ein bisschen Optik und simple Elektronische Schaltungen.
    In Mathe hatten Wir einmal Punkte im Koordinatensystem, also P(x|y).
    Aber das Koordinatensystem kannte ich von DirectX schon vorher.
    Aber ich war heute in der Bibilothek und habe mir neben einem PHP Workshop, zwei Chemie-Büchern und einem Buch über Webseiten-programmierung ein Buch über Mechanik geliehen.
    Ich hoffe das darin die Lösung meines Problems steht.
  • Ich habe jetzt mal in die Mathe-Lehrpläne geschaut. Pythagoras kommt ja erst in der 8ten oder 9ten Klasse, meine Güte. Dann ist klar, dass da noch nichts mit Vektoren und Abständen drangekommen ist.
    Keine Ahnung, wie man da in Physik überhaupt arbeiten kann :D

    Edit "Lineare Unabhängigkeit" von Vektoren ist dem Leistungskurs Mathe vorbehalten. Was haben wir damals überhaupt in der Schule gelernt?!
    C++

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von zerm ()