2020-01-28 00:31:10 +01:00
|
|
|
# Math and vector utility functions.
|
2020-01-29 05:56:10 +01:00
|
|
|
class_name GSTUtils
|
2019-12-19 20:04:08 +01:00
|
|
|
|
|
|
|
|
2020-01-28 00:31:10 +01:00
|
|
|
# Returns the `vector` with its length capped to `limit`.
|
2019-12-21 03:32:21 +01:00
|
|
|
static func clampedv3(vector: Vector3, limit: float) -> Vector3:
|
2020-01-16 09:44:44 +01:00
|
|
|
var length_squared := vector.length_squared()
|
|
|
|
var limit_squared := limit * limit
|
2019-12-23 17:38:27 +01:00
|
|
|
if length_squared > limit_squared:
|
|
|
|
vector *= sqrt(limit_squared / length_squared)
|
2019-12-19 20:04:08 +01:00
|
|
|
return vector
|
2020-01-27 18:57:51 +01:00
|
|
|
|
|
|
|
|
2020-01-28 00:31:10 +01:00
|
|
|
# Returns an angle in radians between the positive X axis and the `vector`.
|
|
|
|
#
|
|
|
|
# This assumes orientation for 2D agents or 3D agents that are upright and
|
|
|
|
# rotate around the Y axis.
|
2020-01-29 16:04:47 +01:00
|
|
|
static func vector3_to_angle(vector: Vector3) -> float:
|
2020-01-27 18:57:51 +01:00
|
|
|
return atan2(vector.x, -vector.y)
|
2020-01-29 16:04:47 +01:00
|
|
|
|
|
|
|
|
|
|
|
# Returns a directional vector from the given orientation angle.
|
|
|
|
#
|
|
|
|
# This assumes orientation for 2D agents or 3D agents that are upright and
|
|
|
|
# rotate around the Y axis.
|
|
|
|
static func angle_to_vector2(angle: float) -> Vector2:
|
|
|
|
return Vector2(sin(-angle), cos(angle))
|