Ähnliche Nicht-Physik verwendet, um Baseball auf Minecraft und Implementierung in Spigot auszudrücken (Werfen / Schlagen)

Andere Artikel

Gebunden Fangen / Tipps

Pitching

Obwohl dies eine Funktion ist, die in anderen Ballspielen nicht so häufig vorkommt, ist es notwendig, die Ballgeschwindigkeit und -rotation (-änderung) beim Werfen eines Balls erheblich beeinflussen zu können. Ich weiß nicht, ob dieses Format korrekt ist, aber in Schneeballspiel heißt es: "Abhängig vom Namen des Schneeballs, der zum Ball wird." Es hat die Form "ein wechselnder Ball wird geworfen". Es gibt ein Ereignis namens ProjectileLaunchEvent, um festzustellen, dass der Ball geworfen wurde. Verwenden. Wenn dieses Ereignis aufgerufen wird, führen Sie es als `event.getEntity (). GetShooter ()` aus, um den Inhalt der Haupthand des werfenden Spielers zu überprüfen und die Ballgeschwindigkeit so einzustellen, dass sie seinem Namen entspricht. Du kannst es ändern. (Wenn Sie aus der Hand werfen können, überprüfen Sie aus der Hand, ob die Haupthand nicht der Ball ist, sondern die Nebenhand der Ball.)

Verwenden Sie für die sich ändernde Kugel `BukkitRunnable.runTaskTimer (Verzögerung, Periode)`. Normalerweise laufen Sie mit 0 Verzögerung und 1 Periode. Schreiben Sie so, dass die Entität des geworfenen Balls selbst sowie die Richtung und das Ausmaß der Änderung empfangen werden und die Geschwindigkeit jedes Tickballs geändert wird. Bei der Bestimmung der Änderungsrichtung des Balls sind jedoch einige Dinge zu beachten. Die vertikale Änderung kann durch die Schwankung in Y-Richtung ausgedrückt werden, die horizontale Änderung hängt jedoch von der Richtung ab, in die der werfende Spieler blickt. Vom Hügel aus kann sich die Heimbasis in X- oder Z-Richtung befinden, und insbesondere kann es sich um ein diagonales Stadion handeln, sodass die Spieler den sich ändernden Ball ohne Unbehagen in so verschiedenen Variationen des Stadions verwenden können. Ich muss es tun. Verwenden Sie daher `Location.getDirection ()` für die Richtung der horizontalen Änderung. Alles was Sie tun müssen, ist die aktuelle Sichtlinie des Spielers als vorwärts einzustellen.

getHorizontalMove


//Die Bewegung gibt das Ausmaß der Änderung der Schussrichtung pro Tick an, wenn das Vorzeichen positiv ist, und das Ausmaß der Änderung der Schiebereglerrichtung, wenn das Vorzeichen negativ ist.
static Vector getHorizontalMove(Player player, double move, boolean fromMainHand){
    //Wenn Sie nach links werfen, kehren Sie die Richtung der seitlichen Änderung um
    int modifierWithHand = 1;
    if(player.getMainHand() == MainHand.LEFT && fromMainHand || player.getMainHand() == MainHand.RIGHT && !fromMainHand){
        modifierWithHand = -1;
    }
    Location loc = player.getLocation();
    //Gieren Sie nach der Richtung zur Haupthandseite+90 ° Ausrichtung
    loc.setYaw(loc.getYaw() + 90 * modifierWithHand);
    return loc.getDirection().normalize().multiply(move);
}

Durch Erhöhen des Gierens der Position des Spielers um +90 Grad und Erfassen der Richtung auf diese Weise kann die "richtige" Richtung des Spielers erhalten werden. Danach können Sie den Code 90 abhängig von der Art des Ballwechsels und des Wurfarms ändern. Übrigens können Sie in Snowball Game in der Konfigurationsdatei festlegen, "welche Art von Namen welche Art von Änderung ändert".

Problem

Es gibt fast kein Problem mit dieser Implementierung, wenn es ums Werfen geht, aber im Gegensatz zu anderen Baseballspielen kann Minecraft wechselnde Bälle in eine beliebige Anzahl von Richtungen werfen, so dass es sich seltsam verhält, wie es ist. Wenn beispielsweise eine Vier-Naht (angenommen als Ball, der sich nach oben ändert) direkt darüber geworfen wird, ist das erwartete Verhalten vom Pitcher aus gesehen rückwärts, da die Vier-Naht ursprünglich eine Backspin-Kugel ist. Obwohl es sich rückwärts ändert, wird in dieser Implementierung die Änderung der vertikalen Richtung einheitlich als die Fluktuation definiert, die sich auf die Y-Koordinate bezieht, so dass es sich so verhält, als ob es gerade nach oben steigt und nicht leicht fällt. ..

Wenn dies das einzige ist, hat es im eigentlichen Spiel keine großen Auswirkungen, und es ist kein Problem, wenn Sie es mit "weil es ein Spiel ist" und "weil es höchstens ein Plug-In ist" abweisen, aber die Implementierung dieses sich ändernden Balls dient dazu, den Ball zu treffen. Beim Versuch, sich zu bewerben, liegt ein Problem vor. ** Die Fängerfliege kommt nicht zurück. ** **. Die detaillierte Methode wird später beschrieben, aber solange wir ein Baseball-Plug-In befürworten, möchten wir dem getroffenen Ball natürlich eine Änderung der Flugbahn wie "Dehnung" oder "Scheibe" entsprechend der Qualität des Treffers geben. Um dies zu erreichen, möchten wir die Richtung der Änderung zum Zeitpunkt des Aufpralls bestimmen und dasselbe Bukkit Runnable verwenden, das zur Implementierung der sich ändernden Kugel verwendet wird. Dann ändert sich die Fliege, die einen Backspin haben sollte, einfach zu jedem Tick. Dies bedeutet, dass eine Fängerfliege, die einen extrem starken Backspin haben sollte, einfach eine Fliege ist, die "nicht leicht fällt". ** Das sollte nicht sein. Die Fängerfliege muss zur hinteren Netzseite zeigen und sie fangen. ** **. Es ist zu einsam, um diese eigentümliche Schwierigkeit nicht ausdrücken zu können.

Lösung

Eine einfache Kenntnis der Fluiddynamik war hilfreich, um dieses Problem zu lösen. Es scheint, dass eine Hebekraft in einer Richtung erzeugt wird, die proportional zum äußeren Produkt des Rotationsvektors (Vektorausdruck der Rotation) des Bewegungsvektors des Zylinders / der Kugel ist, der sich während der Rotation in der Flüssigkeit bewegt. Dies wird als Magnus-Effekt bezeichnet. Ich habe das Gefühl, dass ich es in der Blütezeit von Fujikawa Kyuji oft gehört habe. Ich bin eine Person, die noch nicht einmal Physik an der High School studiert hat. Selbst wenn es das äußere Produkt eines Vektors sein soll, fällt es mir immer noch nicht ein, aber als ich das Gesetz von Flemings linker Hand mit meiner rechten Hand machte, ging ich in Richtung meines Zeigefingers und drehte meinen Daumen um die Achse. Es scheint, dass sich eine Kugel, die sich im Uhrzeigersinn dreht, zum Mittelfinger hin biegt. Wenn Sie es versuchen, ändert es sich sicherlich rückwärts, wenn sich der Backspin-Ball nach oben bewegt, und es ändert sich vorwärts, wenn er auf und ab geht. Darüber hinaus hängt das Ausmaß der Änderung von der Rotationsmenge und der Ballgeschwindigkeit in diesem Moment ab. Insbesondere unter der Annahme, dass der Durchmesser der Kugel etwa 73 mm beträgt und der atmosphärische Zustand der Standardzustand ist, `` `1/8 * Math.PI * Math.PI * 1.205 * Math.pow (73/1000, 3) * speed.length () * Es scheint sich um rps``` zu handeln (Referenz). (rps ist die Anzahl der Umdrehungen pro Sekunde. Beachten Sie, dass Sie dies häufig in Trackman sehen, da RPM die Einheit ist.) Mit anderen Worten

BallMovingTask


import org.bukkit.entity.Projectile;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.util.Vector;

public class BallMovingTask extends BukkitRunnable {
    private Vector spinVector;
    private Projectile ball;
    private int rps;
	public BallMovingTask(Projectile ball, Vector spinVector, int rps) {
        this.ball = ball;
        this.spinVector = spinVector;
        this.rps = rps;
    }
    @Override
    public void run() {
        //Brechen Sie die Aufgabe ab, wenn der Ball nach dem Abprallen oder Schlagen stirbt
    	if(ball.isDead()){
    		this.cancel();
    	}
    	Vector velocity = ball.getVelocity();
    	if(spinVector.length() != 0){
	    	Vector actualMove = velocity.getCrossProduct(spinVector);
	    	if(actualMove.length() != 0){
	    		actualMove.normalize().multiply(1/8 * Math.PI * Math.PI * 1.205 * Math.pow(73/1000, 3) * velocity.length() * rps);
	    	}
	    	velocity.add(actualMove);
    	}
    	ball.setVelocity(velocity);
    }

}

Sie können ein Runnable wie dieses erstellen, und wenn Sie es werfen, können Sie nach rps und spinVector fragen und es übergeben. Das Schneeballspiel betont jedoch die Funktion, dass "das Ausmaß der Änderung pro Tick und die Änderungsrichtung durch die Konfiguration bestimmt werden kann" und "nachdem die Änderungsrichtung des werfenden Spielers anhand des numerischen Werts der Konfiguration ermittelt wurde". Das äußere Produkt des geworfenen Vektors des Balls wird genommen und als Rotationsvektor verwendet. "" Der Wert des Änderungsbetrags wird als Länge des SpinVektors angegeben, und die tatsächliche Bewegung wird auf diese Länge angepasst (daher wird die obige Formel nicht verwendet). " Es ist geworden. In jedem Fall bringt dies die Fängerfliege wieder an ihren Platz und die in Scheiben geschnittene Fliege wird eher zum Stillstand kommen. 2018-06-01_18.02.31.png Durch die Verwendung dieser Berechnungsmethode ist es auch ein Merkmal, dass die Umlaufbahn des Homeruns keine symmetrische Parabellinie mehr ist.

Schlag

Ich bin mit der tatsächlichen Situation überhaupt nicht vertraut, aber ich denke, es ist der entscheidende Teil, der der Implementierung in Baseballspielen die größte Individualität verleiht. Wenn Sie den Treffer genau reproduzieren möchten, müssen Sie die Form des Schlägers definieren und dann den Treffer mit dem fliegenden Ball beurteilen, aber es ist ziemlich schwierig, ihn in Minecraft zu implementieren. Welche Art von Elementen sollte der Spieler dann fühlen, dass "der Schlag reproduziert werden kann"? Als Voraussetzung, um einen Schlag im Baseball zu komponieren

――Wenn Sie das Timing und den Kurs nicht einhalten, können Sie den Ball verpassen oder den Ball schwach treffen. ――Die Richtung und Höhe des getroffenen Balls sind unterschiedlich.

Ich denke, da ist so etwas. Um diese Anforderungen zu erfüllen, verwendet Snowball Game Bögen als Fledermäuse.

Da der Bogen ursprünglich eine Zugfestigkeit aufweist, ist es sehr einfach, die Festigkeit einzustellen. Spigot hat auch ein EntityShootBowEvent, das erkennen kann, wann ein Spieler einen Bogen schießt. Außerdem kann dieses Ereignis die Entität des Pfeils abrufen, der ausgelöst werden sollte, selbst wenn `event.setCancelled (true)`, und dieser Pfeil wird als Fledermaus angesehen, da er `Entity.getNearbyEntities (x) ist. Durch Ausführen von y, z) , um zu bestimmen, ob der Rückgabewert eine Ballentität enthält oder nicht, ist es möglich, den Treffer zwischen dem Ball und dem Schläger zu bestimmen. Bis zu diesem Punkt ist es möglich, die Stärke des Schwungs und den Schwung / Schlag zu beurteilen. Alles was Sie tun müssen, ist die Frage zu klären, welche Art von Ball der Ball auf den Schläger trifft. Zu diesem Zweck haben wir uns entschieden, `` Location.subtract (Location)` `` zu verwenden, um den "Vektor vom Pfeil, der wie ein Schläger aussieht, bis zu der Position, an der sich der Ball befindet" zu finden und zu verwenden. Befindet sich ein Ball über der Position, an der der Schläger geschwungen wird, handelt es sich um eine Fliege, und wenn sich draußen ein Ball befindet, handelt es sich um ein Waschbecken. Wenn Sie zu spät kommen und der Ball hinter Ihnen liegt, ist dies ein Foul, das in Richtung des hinteren Netzes fliegt. Das Verhalten ist fast wie ein Gefühl.

Die Stärke des getroffenen Balls kann geschwächt werden, wenn der Ball weiter vom Pfeil entfernt ist. Es gibt viele Möglichkeiten, es anzupassen, aber im Schneeballspiel wird der Vektor von Schläger zu Ball normalisiert und dann `` Math.pow (1.3, -batToBall.length ()) `angewendet. Ich nehme die Methode. Ein Wert von 1 oder mehr hoch -x wird zu 1, wenn x 0 ist, und wenn x zunimmt, nimmt er kontinuierlich ab und wird nicht zu einer negativen Zahl, so dass es schwierig ist, mit unerwarteten Werten umzugehen. .. Basierend auf dem oben genannten,

getBattedBall


//GetBattedBall von EntityShootBowEvent(event.getEntity(), event.getProjectile)Rufen Sie in Form von
static Projectile getBattedBall(Projectile arrow, float force){
    //Der Bereich, in dem der Ball und der Schläger getroffen werden, ist zur Vereinfachung einheitlich 1.2
    Collection <Entity> nearByEntities = arrow.getNearbyEntities(1.2,1.2,1.2);
    for(Entity entity : nearByEntities){
        if(Util.isBall(entity)){
	        Vector batToBall = entity.getLocation().subtract(arrow.getLocation()).toVector();
	        //3 hier.5 ist ein Wert, der einen Homerun mit einem guten Gefühl gibt. Es gibt keine besondere Grundlage, um dies abzuleiten.
	        double speed = Math.pow(1.3, -batToBall.length()) * force * 3.5;
	        Projectile battedBall = (Projectile)entity.getWorld().spawnEntity(entity.getLocation(), EntityType().Snowball);
	        battedBall.setShooter(arrow.getShooter());
            battedBall.setVelocity(batToBall.normalize().multiply(speed));
		    return battedBall;
		}
	 }
	 return null;
}

Es wird so etwas sein. Danach können Sie Gewürze wie "Je schneller die Wurfgeschwindigkeit, desto einfacher ist das Fliegen" und "Die Reichweite, die den Schläger trifft, lässt Y sich kleiner fühlen" hinzufügen.

Problem

Das erste Problem mit dieser Methode kann für diejenigen sofort offensichtlich sein, die die obigen Würfe sorgfältig gelesen haben. Mit anderen Worten ist es schwierig, die Drehung des getroffenen Balls einzustellen. Es mag möglich sein, den Zustand des Balls zum Zeitpunkt der Kollision anhand der Krümmung des Schlägers und der Elastizität des Balls zu simulieren, aber ich möchte keine so schwierige Berechnung durchführen. Da ein Element benötigt wird, mit dem die Drehung des getroffenen Balls definiert werden kann, dh die "Positionsbeziehung zwischen Schläger und Ball", möchte ich dieses verwenden. Dann möchte ich die Richtung des getroffenen Balls und des äußeren Produkts des Vektors vom Schläger zum Ball auf die gleiche Weise wie am Ende des Werfens erläutert nehmen, aber dies ist auch nicht möglich. Dies liegt daran, dass die beiden Vektoren dieselbe Ausrichtung haben, sich jedoch nur in der Länge unterscheiden. Das äußere Produkt paralleler Vektoren ist immer ein Nullvektor. (Wie die Theorie, dass der Kreiselball zu einem vertikalen Schieberegler wird)

Ein weiteres Problem ist, dass ich zuvor ein Video erstellt habe. Schauen Sie also bitte mal rein. Kurz gesagt, es ist nicht möglich, einen Ball herzustellen, der sowohl eine hohe Schlaggeschwindigkeit als auch einen hohen Schlagwinkel aufweist. Wenn Sie den Ball höher als die Position des Pfeils schlagen, ist die Fliege höher, aber die Schlaggeschwindigkeit nimmt mit zunehmender Entfernung ab. Wenn Sie den Pfeil näher am Ball treffen, erhöht sich die Schlaggeschwindigkeit, aber der Ball schlägt in einem niedrigeren Winkel. Werden. Dies gilt auch für Goro, und es ist schwierig, ein Goro zu erstellen, das den Boden in einem tiefen Winkel durchbohrt und hoch springt. Mit anderen Worten, der getroffene Ball ist weniger vielfältig geworden.

Wie lösen wir diese Probleme?

Implementierung der Schwungbahn

In SnowballGame bestand die Lösung darin, einen "Swing" -Vektor zu definieren und ihn beim Schlagen zum Trefferballvektor hinzuzufügen. Auf diese Weise zeigt der Bewegungsvektor des getroffenen Balls in eine andere Richtung vom Schläger zum Ballvektor, und das äußere Produkt der beiden Vektoren kann als Rotationsvektor des getroffenen Balls genommen werden. Zusätzlich kann die Vielzahl der getroffenen Bälle durch Manipulieren der Schwungbahn gesichert werden. Es wäre sogar noch besser, wenn jeder Schlagmann seine eigene Persönlichkeit haben könnte, wie zum Beispiel Upper Swing und Down Swing.

Die Frage ist dann, wie man diese "Schwungbahn" definiert. Ich denke, dass der ähnlichste Punkt in diesem Plug-In hier ist, aber meine Erfahrung und technische Bücher, die ich in der Vergangenheit gelesen habe 83% 90% E3% 83% 83% E3% 83% 86% E3% 82% A3% E3% 83% B3% E3% 82% B0% E3% 81% AE% E6% AD% A3% E4% BD% Von 93-% E6% 89% 8B% E5% A1% 9A-% E4% B8% 80% E5% BF% 97 / dp / 4583045654) wird gesagt, dass der Schwung im Baseball aus den folgenden drei Übungen besteht. Ich dachte.

Diese Klassifizierung ist nicht immer korrekt, aber das Schneeballspiel implementiert darauf basierende Schwungbahnen.

Von diesen dreien ist der zweite der schwierigste. Diese Bewegung ist der Teil, der Gegenstand von Wörtern ist, die einen Schwung beschreiben, wie z. B. "obere Ebene nach unten", und die Schwungbreite und die Schwankung der vertikalen Bewegung sind für jeden Schlagmann ebenfalls unterschiedlich. Mit anderen Worten, es gibt keine Umlaufbahn, in der "dies die richtige Antwort ist". Es gibt jedoch eine Flugbahn, die als "ideal" bezeichnet werden kann, wenn Sie das erzwungene Denken durchsetzen. Dies ist die [schnellste Abstiegskurve](https://ja.wikipedia.org/wiki/%E6%9C%80%E9%80%9F%E9%99%8D%E4%B8%8B%E6%9B%B2 % E7% B7% 9A). Kurz gesagt, dies scheint eine Umlaufbahn zu sein, die "am schnellsten erreicht, wenn nur die Schwerkraft wirkt und sich von einem bestimmten Punkt in der Ebene zu einem bestimmten Punkt bewegt". Mit anderen Worten, wenn wir annehmen, dass "die Zeit, die zum Schwingen benötigt wird, so kurz wie möglich sein sollte", dann ist dies die ideale Schwungbahn. Tatsächlich ist die Bewegung des Schwingens des Schlägers keine "Bewegung, die nur durch die Schwerkraft wirkt", daher ist sie immer noch verdächtig, aber zumindest wird es kein Problem sein, wenn sie als Leitfaden für die Verwendung im Spiel verwendet wird. (Neulich hörte ich, dass in einem bestimmten Programm eine Besonderheit "Shohei Otanis Schwungbahn ist eine Zykloide" eingerichtet wurde. Diese Kurve mit dem schnellsten Abstieg scheint eine Zykloide zu sein, daher hielt ich sie bis zu einem gewissen Grad für realistisch. Es scheint in Ordnung zu sein.)

Es scheint, dass die schnellste Abstiegskurve in der zweidimensionalen Ebene "x = a (θ-sinθ), y = a (1-cosθ)" ist, daher wird diese Formel von x als Koordinaten von X und Z verwendet. Die Formel von Y sollte auf die Koordinaten von Y angewendet werden. Das Problem ist die Richtung, in die diese Kurve verlängert wird, dies wird jedoch in Kombination mit der dritten Bewegung oben betrachtet und diagonal nach hinten verlängert (bei einem Rechtshänder wird die Richtung von der Sichtlinie um 90 Grad nach rechts gedreht). Und. Damit

getBatPosition


//Der Grad der seitlichen Drehung, der in Zukunft implementiert werden soll, wird als Rolle definiert.
//rollDirection ist 1 für Rechtshänder,Wenn Sie ein Linkshänder sind-Es wird 1.
public static Location getBatPosition(Location eye, double roll , int rollDirection){
	Location eyeLoc = eye.clone();
	eyeLoc.setYaw(eyeLoc.getYaw() - (float)(90 * rollDirection));
	Vector push = eyeLoc.getDirection().setY(0).normalize();
	double theta = Math.abs(roll * 2);
	double x = push.normalize().getX() * (theta - Math.sin(theta));
	double y = -(1 - Math.cos(theta));
	double z = push.normalize().getZ() * (theta - Math.sin(theta));
    return eye.clone().add(x,y,z);
}

Kann geschrieben werden. Geben Sie dabei einen Wert von 0 bis π an, um zu rollen, und führen Sie die Schleife der Laichpartikel 20 Mal an der erhaltenen Position aus. Dies sieht folgendermaßen aus. 2018-06-01_17.01.18.png

Zu diesem Zeitpunkt sollte die zweite Bewegung, die horizontale Drehung, ausgeführt werden. Um die Wahrheit zu sagen, habe ich, bis ich hier zu schreiben begann, Coordinate Transformation verwendet, um diese Rotation zu implementieren. Während ich organisierte, was ich schrieb und tat, wurde mir klar, dass ** "Ich muss nur Yaw ändern" **. Als ich bemerkte, dass es natürlich war, aber warum habe ich es bis jetzt nicht verstanden ...

getBatPosition


public static Location getBatPosition(Location eye, double roll , int rollDirection){
	Location eyeLoc = eye.clone();
    //↓ Ich musste mich hier nur umziehen ...
	eyeLoc.setYaw(eyeLoc.getYaw() - (float)(90 * rollDirection) - Math.toDegrees(roll));
	Vector push = eyeLoc.getDirection().setY(0).normalize();
	double theta = Math.abs(roll * 2);
	double x = push.normalize().getX() * (theta - Math.sin(theta));
	double y = -(1 - Math.cos(theta));
	double z = push.normalize().getZ() * (theta - Math.sin(theta));
    return eye.clone().add(x,y,z);
}

Das ist es also, was ich versucht habe, Partikel auf die gleiche Weise wie zuvor zu entfernen. 2018-06-01_18.12.51.png Da der Schwung in einer Richtung beginnt, die um 90 Grad nach rechts verschoben ist, ist die Richtung, in die die Sichtlinie zeigt, dh die Richtung, die zum Treffpunkt wird, dort, wo die Rolle π / 2 wird. Da Theta doppelt so hoch ist wie der absolute Wert von roll, nimmt Y zu diesem Zeitpunkt den niedrigsten Wert an.

Wenn man diese Partikel betrachtet, scheint es, dass die Schwingposition zu weit vom Körper entfernt ist, aber diese Schwingbahn wird nicht zur Trefferbestimmung verwendet, so dass es kein Problem gibt. Für die Trefferbestimmung wird nur die Beziehung zwischen der Position des Pfeils und des Balls verwendet, und diese Schwungbahn wird nur zur Berechnung der Kraft verwendet, die vom Schläger auf den Ball ausgeübt wird, wenn der Schläger auf den Ball trifft.

Dieser Teil ist

//Treffen Sie den Ball an einer Sichtlinie und 0 von dort.01 Es wird davon ausgegangen, dass Ball und Schläger bis zu der von Radian gedrehten Position miteinander in Kontakt standen (diese Zahl ist unbegründet).
Vector batMove = getBatPosition(player.getEyeLocation(), (Math.PI / 2 + 0.01) * rolld, rolld,).subtract(getBatPosition(player.getEyeLocation(), Math.PI / 2 * rolld, rolld,));

Es wäre schön, sich danach zu fühlen.

Nebenprodukt

Indem die Schwungbahn auf diese Weise ausgedrückt wird, kann das Problem der Definition des oberen Schwungs und des Abschwungs einfach gelöst werden. Im obigen `getBatPosition ()` gibt es Variablen, die zwei Winkel darstellen, roll und theta. Roll ist die horizontale Drehung von der Startposition des Schwungs und Theta ist der Grad der Drehung des Kreises, der zum Zeichnen der Kurve mit dem schnellsten Abstieg verwendet wird. Wie bereits erläutert, ist der Punkt, an dem der Ball getroffen wird, der niedrigste Punkt auf der Kurve mit dem schnellsten Abstieg, wenn Theta dem doppelten Wurf entspricht. Vor diesem Punkt befindet sich die Umlaufbahn von oben nach unten, und wenn sie sich hinter diesem Punkt befindet, befindet sich die Umlaufbahn von unten nach oben. Mit anderen Worten könnte dies als "Level Swing" definiert werden.

Dies bedeutet, dass ein Aufprallpunkt des Balls vor diesem Punkt als Abschwung und später als oberer Schwung ausgedrückt werden kann. Mit anderen Worten kann gesagt werden, dass, wenn ein Wert zu Theta hinzugefügt wird, der Mehrwert zum oberen Schwung wird, und wenn er reduziert wird, wird der reduzierte Betrag zum Abschwung. Das bedeutet


public static Location getBatPosition(Location eye, double roll , int rollDirection, double upper){
    Location eyeLoc = eye.clone();
    eyeLoc.setYaw(eyeLoc.getYaw() - (float)(90 * rollDirection - Math.toDegrees(roll)));
    Vector push = eyeLoc.getDirection().setY(0).normalize();
    //Wenn es 1 überschreitet, wird die Zykloide herumlaufen.
    if(Math.abs(upper) > 1){
        upper = 1 * Math.signum(upper);
    }
    //Ich möchte Upper auf einen Wert setzen, der in der Konfiguration eingestellt werden kann, daher habe ich ihn zum leichteren Verständnis auf eine Vergrößerung von π eingestellt.
    double theta = Math.abs(roll * 2) + Math.PI * upper;
    double x = push.normalize().getX() * (theta - Math.sin(theta));
    double y = -(1 - Math.cos(theta));
    double z = push.normalize().getZ() * (theta - Math.sin(theta));
    return eye.clone().add(x,y,z);
}

Wenn Sie es so schreiben, ist es umso einfacher, den Goro zu treffen, je größer der obere Wert ist, je leichter es ist, die Fliege zu treffen, und je kleiner er ist (das Vorzeichen ist negativ). Auf diese Weise kann der Spieler in der Konfiguration "Welcher Name des Schlägers für welche Art von Schwung verwendet werden soll" im selben Mechanismus wie ein sich ändernder Ball einstellen. Man kann sagen, dass die Anpassbarkeit verbessert wurde.

Auch die unter dieser Bedingung berechnete Kraft vom Schläger zum Ball ist in Richtung "Ziehen" für den Schlagmann. Wenn dies dem Ball hinzugefügt wird, hat der getroffene Ball in der "Zug" -Richtung höchstwahrscheinlich eine lange Flugstrecke. Man kann sagen, dass ein realistischerer Schlag möglich geworden ist.

Fortsetzung

Im nächsten Artikel werde ich über den Fangteil und die Tipps schreiben, die zur Implementierung anderer Balltechniken verwendet werden können.

Recommended Posts

Ähnliche Nicht-Physik verwendet, um Baseball auf Minecraft und Implementierung in Spigot auszudrücken (Werfen / Schlagen)
Ähnliche Nicht-Physik verwendet, um Baseball auf Minecraft und Implementierung in Spigot auszudrücken (gebundene Ausgabe)
Ähnliche Nicht-Physik verwendet, um Baseball auf Minecraft und Implementierung in Spigot auszudrücken (Ballfang / Tipps)