This commit is contained in:
Laureηt 2022-05-17 10:26:07 +02:00
parent dedc389369
commit 6f31f76ee4
No known key found for this signature in database
GPG key ID: D88C6B294FD40994
2 changed files with 27 additions and 26 deletions

View file

@ -5,6 +5,7 @@ import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
@ -118,19 +119,25 @@ public class Camera extends JavaPlugin implements Listener {
.add(P.get(i + 1).clone().multiply(t))); .add(P.get(i + 1).clone().multiply(t)));
} }
} }
curve.add(P.get(0)); curve.add(P.get(0));
} }
} }
} }
public static String prettyLocation(LocationQuaternion point) { public static String prettyLocation(Location point) {
point.updateEulerAngles();
return String.format("X=%05.2f, Y=%05.2f, Z=%05.2f, P=%05.2f, Y=%05.2f", return String.format("X=%05.2f, Y=%05.2f, Z=%05.2f, P=%05.2f, Y=%05.2f",
point.getX(), point.getY(), point.getZ(), point.getX(), point.getY(), point.getZ(),
point.getPitch(), point.getYaw()); point.getPitch(), point.getYaw());
} }
public static String prettyLocation(LocationQuaternion point) {
return String.format(
"X=%05.2f, Y=%05.2f, Z=%05.2f, P=%05.2f, Y=%05.2f, R=%05.2f, w=%05.2f, x=%05.2f, y=%05.2f, z=%05.2f",
point.getX(), point.getY(), point.getZ(),
point.getPitch(), point.getYaw(), point.roll,
point.qw, point.qx, point.qy, point.qz);
}
public static void broadlog(String msg) { public static void broadlog(String msg) {
Camera.logger.log(Level.INFO, msg); Camera.logger.log(Level.INFO, msg);
Bukkit.broadcastMessage(msg); Bukkit.broadcastMessage(msg);

View file

@ -4,14 +4,13 @@ import org.bukkit.Location;
public class LocationQuaternion extends Location { public class LocationQuaternion extends Location {
private double qw; public double qw;
private double qx; public double qx;
private double qy; public double qy;
private double qz; public double qz;
private float roll = 0; public float roll = 0;
private static final float deg2grad = (float) Math.PI / 180.0f; private static final float deg2rad = (float) Math.PI / 180.0f;
private static final float grad2deg = 1 / deg2grad;
// https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles#Source_code // https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles#Source_code
public LocationQuaternion(Location location) { public LocationQuaternion(Location location) {
@ -26,11 +25,6 @@ public class LocationQuaternion extends Location {
} }
public void updateEulerAngles() { public void updateEulerAngles() {
// roll (x-axis rotation)
double sinr_cosp = 2 * (qw * qx + qy * qz);
double cosr_cosp = 1 - 2 * (qx * qx + qy * qy);
roll = (float) Math.atan2(sinr_cosp, cosr_cosp) * grad2deg;
// pitch (y-axis rotation) // pitch (y-axis rotation)
double pitch; double pitch;
double sinp = 2 * (qw * qy - qz * qx); double sinp = 2 * (qw * qy - qz * qx);
@ -39,19 +33,18 @@ public class LocationQuaternion extends Location {
} else { } else {
pitch = Math.asin(sinp); pitch = Math.asin(sinp);
} }
setPitch((float) pitch * grad2deg); setPitch((float) pitch / deg2rad);
// yaw (z-axis rotation) // yaw (z-axis rotation)
double siny_cosp = 2 * (qw * qz + qx * qy); double siny_cosp = 2 * (qw * qz + qx * qy);
double cosy_cosp = 1 - 2 * (qy * qy + qz * qz); double cosy_cosp = 1 - 2 * (qy * qy + qz * qz);
double yaw = Math.atan2(siny_cosp, cosy_cosp); double yaw = Math.atan2(siny_cosp, cosy_cosp);
setYaw((float) yaw * grad2deg); setYaw((float) yaw / deg2rad);
} }
public void updateQuaternionAngles() { public void updateQuaternionAngles() {
float yaw = getYaw() * deg2grad; float yaw = getYaw() * deg2rad;
float pitch = getPitch() * deg2grad; float pitch = getPitch() * deg2rad;
double cy = Math.cos(yaw * 0.5); double cy = Math.cos(yaw * 0.5);
double sy = Math.sin(yaw * 0.5); double sy = Math.sin(yaw * 0.5);
@ -91,7 +84,6 @@ public class LocationQuaternion extends Location {
public LocationQuaternion add(LocationQuaternion loc) { public LocationQuaternion add(LocationQuaternion loc) {
super.add(loc); super.add(loc);
qw += loc.qw; qw += loc.qw;
qx += loc.qx; qx += loc.qx;
qy += loc.qy; qy += loc.qy;
@ -103,7 +95,6 @@ public class LocationQuaternion extends Location {
public LocationQuaternion subtract(LocationQuaternion loc) { public LocationQuaternion subtract(LocationQuaternion loc) {
super.subtract(loc); super.subtract(loc);
qw -= loc.qw; qw -= loc.qw;
qx -= loc.qx; qx -= loc.qx;
qy -= loc.qy; qy -= loc.qy;
@ -115,11 +106,10 @@ public class LocationQuaternion extends Location {
public LocationQuaternion multiply(double m) { public LocationQuaternion multiply(double m) {
super.multiply(m); super.multiply(m);
qw *= m; qw *= m;
qx += m; qx *= m;
qy += m; qy *= m;
qz += m; qz *= m;
updateEulerAngles(); updateEulerAngles();
return this; return this;
@ -130,4 +120,8 @@ public class LocationQuaternion extends Location {
LocationQuaternion cloned = new LocationQuaternion(this); LocationQuaternion cloned = new LocationQuaternion(this);
return cloned; return cloned;
} }
public double dot(LocationQuaternion q) {
return qx * q.qx + qy * q.qy + qz * q.qz + qw * q.qw;
}
} }