From 8372a12f48cc72c9bef99116a9df846c70e10255 Mon Sep 17 00:00:00 2001 From: Starbeamrainbowlabs Date: Tue, 17 Jan 2023 02:13:15 +0000 Subject: [PATCH] initial WIP 3d point rotation algorithm Thanks to GitHub Copilot for the implementation! Just need to fully check it actually works, and then we can port it to Lua and Vector3. --- rotate.js | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100755 rotate.js diff --git a/rotate.js b/rotate.js new file mode 100755 index 0000000..c2e5726 --- /dev/null +++ b/rotate.js @@ -0,0 +1,57 @@ +#!/usr/bin/env node + +/** + * Rotate a given point around an origin point in 3d space. + * @source GitHub Copilot + * @warning Not completely tested! Pending a thorough evaluation. + * @param {Vector3} origin The origin point to rotate around + * @param {Vector3} point The point to rotate. + * @param {Number} x Rotate this much around the X axis (yz plane), in radians. + * @param {Number} y Rotate this much around the Y axis (xz plane), in radians. + * @param {Number} z Rotate this much around the Z axis (xy plane), in radians. + * @return {Vector3} The rotated point. + */ +function rotate_point_3d(origin, point, x, y, z) +{ + point[0] = point[0] - origin[0]; + point[1] = point[1] - origin[1]; + point[2] = point[2] - origin[2]; + + // rotate around x + var x1 = point[0]; + var y1 = point[1] * Math.cos(x) - point[2] * Math.sin(x); + var z1 = point[1] * Math.sin(x) + point[2] * Math.cos(x); + + // rotate around y + var x2 = x1 * Math.cos(y) + z1 * Math.sin(y); + var y2 = y1; + var z2 = -x1 * Math.sin(y) + z1 * Math.cos(y); + + // rotate around z + var x3 = x2 * Math.cos(z) - y2 * Math.sin(z); + var y3 = x2 * Math.sin(z) + y2 * Math.cos(z); + var z3 = z2; + + return [x3, y3, z3]; +} + +function deg_to_rad(deg) +{ + return deg * Math.PI / 180; +} + +function point_to_string(point, decimal_places=3) +{ + return "(x " + point[0].toFixed(decimal_places) + ", y " + point[1].toFixed(decimal_places) + ", z " + point[2].toFixed(decimal_places) + ")"; +} + + + + +console.log(point_to_string(rotate_point_3d( + [ 0, 0, 0 ], + [ 5, 0, 0 ], + deg_to_rad(0), // rotate around x axis = yz plane + deg_to_rad(90), // rotate around y axis = xz plane + deg_to_rad(0) // rotate around z axis = xy plane +))); \ No newline at end of file