Berechnen Sie die Zahnraddrehung für eine Echtzeitsimulation

7

Ich versuche ein Spiel mit Echtzeitsimulationen von Zahnrädern zu machen. Es gibt ein großes Zahnrad mit einem kleineren Zahnrad.

Ich habe es geschafft, Zahnräder mit unterschiedlichen Durchmessern, aber gleich großen Zähnen zu zeichnen, aber wenn ich versuche, das kleinere innerhalb des größeren zu bewegen, ist die Bewegung merkwürdig.

Siehe das animierte GIF:

Das größte Zahnrad befindet sich in der Mitte C1 und das kleine in der Mitte C2. Ich berechne die C2-Position folgendermaßen:

C2.x = C1.x + C1_RADIUS-C2_RADIUS) * cos(t);
C2.y = C1.y - C1_RADIUS-C2_RADIUS) * sin(t);

für t geht das in n Schritten von 0 nach TWO_PI.

Ich wende als Drehung den Winkel t an, aber vielleicht ist es falsch und ich muss eine andere Drehung berechnen, um eine perfekte Verbindung zu erhalten.

BEARBEITEN:

Ich benutze Bogenmaß für Rotationen und ich denke, das ist in Ordnung.

Mein Hauptproblem ist, dass ich wie in diesem Beispiel eine perfekte Verbindung zwischen den Zähnen erreichen möchte . Meine Zähne überlappen sich auf seltsame Weise.

BEARBEITEN

Ein funktionierendes Beispiel finden Sie hier: http://www.openprocessing.org/sketch/83665

nkint
quelle
Ich sehe nur die kleinen Zahnradzähne, die sich sehr langsam drehen. Aber das innere grüne Kreuz dreht sich mit der richtigen Geschwindigkeit. Ist das Hauptproblem, wenn die Zeichnung der Zähne rotiert oder die richtige Rotationsgeschwindigkeit gefunden wird? Hier ist häufig zu überprüfen, ob Sie Bogenmaß verwenden.
MichaelHouse
Ich habe die Frage ein wenig bearbeitet ..
nkint
Es erinnert an einen Shader, den ich vor einiger Zeit geschrieben habe: glsl.heroku.com/e#3738.0 . Was Sie hier berücksichtigen sollten, ist das Übersetzungsverhältnis. Verhältnis = Anzahl der Zähne Zahnrad A / Anzahl der Zähne Zahnrad B. Verwenden Sie dieses Verhältnis, um die Drehzahl des Hauptzahnrads gegenüber dem zweiten Zahnrad zu skalieren.
Tigrou
Können Sie bitte ein neues animiertes GIF erstellen, wenn Ihr Problem behoben ist? Das "Falsche" zu sehen ist so frustrierend :-)
Sam Hocevar
immer noch ein Problem, wenn das Getriebe draußen ist. Ich habe eine schmutzige Nummer gefunden, um zu versuchen, das Problem zu lösen, aber nichts zu tun .. wenn Sie eine Idee haben ..
nkint

Antworten:

7

Das große Zahnrad hat einen Umfang 2πR1und das kleine hat einen Umfang 2πR2. Wenn das kleine Zahnrad einen vollen Kreis gebildet hat, hat es sich R1/R2mal um sich selbst gedreht, minus einmal, weil es sich innerhalb des großen Zahnrads gedreht hat (es wäre plus eins, wenn das Zahnrad wäre draußen).

Wenn also die Mitte des inneren Zahnrads um einen Winkel gedreht wird t, muss das Zahnrad selbst um einen Winkel gedreht werden (R1/R2-1)t.

Wenn die Werte , die Sie behandeln sind Zähnezahlen N1und N2Sie können ersetzen R1/R2mit N1/N2.

Es gibt auch das Problem der anfänglichen Rotation. Sei ader Winkelwert atan2(C2.y - C1.y, C2.x - C1.x). Wenden Sie die erste Drehung aauf Zahnrad 1 an. Wenn sich Zahnrad 2 im Inneren befindet, drehen Sie aes auch darauf. Wenn sich Zahnrad 2 außerhalb befindet, wenden Sie eine π+a+hDrehung an, h = π/(2*N2)die dem halben Winkel eines Zahns entspricht.

Sam Hocevar
quelle
Vielen Dank. das hat den Trick perfekt gemacht. Können Sie mir weitere Informationen geben, wie ich diese Formel finde?
nkint
2
Ich muss zugeben, dass meine Kenntnisse der Zahnradmathematik nur aus 30 Jahren mit Legos stammen. Wenn ich auf eine aussagekräftige Ressource stoße, füge ich sie meiner Antwort hinzu.
Sam Hocevar
@nkint Es ist die Anzahl der Zähne, die zählt. Sie können nur das Radiusverhältnis ersetzen R1/R2mit der Zähnezahl Ration N1/N2.
Sam Hocevar
ok perfekt, danke, jetzt ist es klarer. Ich habe nach "Übersetzungsverhältnis" gegoogelt, aber ich finde nirgendwo die +1 oder -1 für außen / innen
nkint
Aufgrund der Tatsache, dass es immer noch einige Probleme gibt, habe ich die richtige Antwort deaktiviert. Und ich habe den gesamten Code hochgeladen. Vielleicht wird eines Tages jemand einen Blick auf das letzte ungelöste Problem werfen!
nkint