/math-essentials
Use when implementing game math — vectors, transforms, interpolation, curves, random number generation, and common geometric recipes
$ npx -y skills add jame581/GodotPrompter --skill math-essentials --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/math-essentials
Context preview
The summary Claude sees to decide when to auto-load this skill.
Use when implementing game math — vectors, transforms, interpolation, curves, random number generation, and common geometric recipes
SKILL.md
math-essentials.SKILL.mdname: math-essentials
description: Use when implementing game math — vectors, transforms, interpolation, curves, random number generation, and common geometric recipes
Game Math in Godot 4.3+
All examples target Godot 4.3+ with no deprecated APIs. GDScript is shown first, then C#.
> **Related skills:** **player-controller** for movement physics, **ai-navigation** for pathfinding math, **camera-system** for camera interpolation, **tween-animation** for easing curves, **physics-system** for collision math.
---
1. Vector Operations
Essential Vector Methods
| Method | Returns | Description | |-------------------------|-----------|-----------------------------------------------| | `length()` | `float` | Magnitude of the vector | | `length_squared()` | `float` | Squared magnitude (faster, skip sqrt) | | `normalized()` | `Vector` | Unit vector (length 1) in the same direction | | `distance_to(b)` | `float` | Distance between two points | | `distance_squared_to(b)` | `float` | Squared distance (faster for comparisons) | | `direction_to(b)` | `Vector` | Normalized direction from this to b | | `angle_to(b)` | `float` | Angle in radians between two vectors | | `angle_to_point(b)` | `float` | Angle from this point to b (2D) | | `dot(b)` | `float` | Dot product | | `cross(b)` | `float/Vector3` | Cross product (2D returns float, 3D returns vector) | | `rotated(angle)` | `Vector2` | Rotated by radians (2D) | | `move_toward(to, delta)` | `Vector` | Move toward target by at most delta | | `clamp(min, max)` | `Vector` | Clamp each component | | `snapped(step)` | `Vector` | Snap to grid | | `reflect(normal)` | `Vector` | Reflect off a surface | | `bounce(normal)` | `Vector` | Bounce off a surface (inverted reflect) | | `slide(normal)` | `Vector` | Slide along a surface |
Direction and Distance
# Get direction from A to B (normalized)
var dir: Vector2 = global_position.direction_to(target.global_position)
# Get distance
var dist: float = global_position.distance_to(target.global_position)
# Use squared distance for comparisons (faster — avoids sqrt)
if global_position.distance_squared_to(target.global_position) < detection_range * detection_range:
chase_target()Vector2 dir = GlobalPosition.DirectionTo(target.GlobalPosition);
float dist = GlobalPosition.DistanceTo(target.GlobalPosition);
if (GlobalPosition.DistanceSquaredTo(target.GlobalPosition) < detectionRange * detectionRange)
ChaseTarget();Dot Product
The dot product tells you how aligned two vectors are.
# Is the target in front of us? (dot > 0 = in front, < 0 = behind)
var forward: Vector2 = Vector2.RIGHT.rotated(rotation)
var to_target: Vector2 = global_position.direction_to(target.global_position)
var dot: float = forward.dot(to_target)
if dot > 0.7: # roughly within ~45° cone
print("Target is ahead")
elif dot < -0.7:
print("Target is behind")Vector2 forward = Vector2.Right.Rotated(Rotation);
Vector2 toTarget = GlobalPosition.DirectionTo(target.GlobalPosition);
float dot = forward.Dot(toTarget);
if (dot > 0.7f) GD.Print("Target is ahead");Cross Product (3D)
The cross product gives a vector perpendicular to two input vectors.
# Get the surface normal from two edge vectors
var edge1: Vector3 = vertex_b - vertex_a
var edge2: Vector3 = vertex_c - vertex_a
var normal: Vector3 = edge1.cross(edge2).normalized()
Vector3 edge1 = vertexB - vertexA;
Vector3 edge2 = vertexC - vertexA;
Vector3 normal = edge1.Cross(edge2).Normalized();
---
2. Transforms
Transform2D
A 2D transform holds position, rotation, and scale.
# Get the global transform
var xform: Transform2D = global_transform
# Convert between local and global space
var local_point: Vector2 = to_local(global_point)
var world_point: Vector2 = to_global(local_point)
# Apply transform to a point
var transformed: Vector2 = xform * Vector2(10, 0) # point in local space → global
# Inverse transform
var local: Vector2 = xform.affine_inverse() * global_point
Transform2D xform = GlobalTransform;
Vector2 localPoint = ToLocal(globalPoint);
Vector2 worldPoint = ToGlobal(localPoint);
Vector2 transformed = xform * new Vector2(10, 0);
Vector2 local = xform.AffineInverse() * globalPoint;
Transform3D & Basis
# Basis holds rotation and scale as 3 column vectors
var basis: Basis = global_transform.basis
# Forward direction (looking along -Z in Godot)
var forward: Vector3 = -basis.z
var right: Vector3 = basis.x
var up: Vector3 = basis.y
# Look at a target
look_at(target.global_position, Vector3.UP)
# Rotate around an axis
rotate_y(deg_to_rad(90.0))
rotate_object_local(Vector3.UP, deg_to_rad(45.0))
# Interpolate between two transforms (smooth transition)
var a: Transform3D = $Start.global_transform
var b: Transform3D = $End.global_transform
global_transform = a.interpolate_with(b, 0.5) # halfway
Basis basis = GlobalTransform.Basis;
Vector3 forward = -basis.Z;
Vector3 right = basis.X;
Vector3 up = basis.Y;
LookAt(target.GlobalPosition, Vector3.Up);
RotateY(Mathf.DegToRad(90.0f));
Transform3D a = GetNode<Node3D>("Start").GlobalTransform;
Transform3D b = GetNode<Node3D>("End").GlobalTransform;
GlobalTransform = a.InterpolateWith(b, 0.5f);is_orthonormal() (Godot 4.7+)
`Basis.is_orthonormal()` (const) returns `true` if the basis is *orthogonal* (axes perpendicular to each other) **and** *normalized* (every axis has length `
Read more
name: math-essentials description: Use when implementing game math — vectors, transforms, interpolation, curves, random number generation, and common geometric recipes
Game Math in Godot 4.3+
All examples target Godot 4.3+ with no deprecated APIs. GDScript is shown first, then C#.
> **Related skills:** **player-controller** for movement physics, **ai-navigation** for pathfinding math, **camera-system** for camera interpolation, **tween-animation** for easing curves, **physics-system** for collision math.
---
1. Vector Operations
Essential Vector Methods
| Method | Returns | Description | |-------------------------|-----------|-----------------------------------------------| | `length()` | `float` | Magnitude of the vector | | `length_squared()` | `float` | Squared magnitude (faster, skip sqrt) | | `normalized()` | `Vector` | Unit vector (length 1) in the same direction | | `distance_to(b)` | `float` | Distance between two points | | `distance_squared_to(b)` | `float` | Squared distance (faster for comparisons) | | `direction_to(b)` | `Vector` | Normalized direction from this to b | | `angle_to(b)` | `float` | Angle in radians between two vectors | | `angle_to_point(b)` | `float` | Angle from this point to b (2D) | | `dot(b)` | `float` | Dot product | | `cross(b)` | `float/Vector3` | Cross product (2D returns float, 3D returns vector) | | `rotated(angle)` | `Vector2` | Rotated by radians (2D) | | `move_toward(to, delta)` | `Vector` | Move toward target by at most delta | | `clamp(min, max)` | `Vector` | Clamp each component | | `snapped(step)` | `Vector` | Snap to grid | | `reflect(normal)` | `Vector` | Reflect off a surface | | `bounce(normal)` | `Vector` | Bounce off a surface (inverted reflect) | | `slide(normal)` | `Vector` | Slide along a surface |
Direction and Distance
# Get direction from A to B (normalized)
var dir: Vector2 = global_position.direction_to(target.global_position)
# Get distance
var dist: float = global_position.distance_to(target.global_position)
# Use squared distance for comparisons (faster — avoids sqrt)
if global_position.distance_squared_to(target.global_position) < detection_range * detection_range:
chase_target()Vector2 dir = GlobalPosition.DirectionTo(target.GlobalPosition);
float dist = GlobalPosition.DistanceTo(target.GlobalPosition);
if (GlobalPosition.DistanceSquaredTo(target.GlobalPosition) < detectionRange * detectionRange)
ChaseTarget();Dot Product
The dot product tells you how aligned two vectors are.
# Is the target in front of us? (dot > 0 = in front, < 0 = behind)
var forward: Vector2 = Vector2.RIGHT.rotated(rotation)
var to_target: Vector2 = global_position.direction_to(target.global_position)
var dot: float = forward.dot(to_target)
if dot > 0.7: # roughly within ~45° cone
print("Target is ahead")
elif dot < -0.7:
print("Target is behind")Vector2 forward = Vector2.Right.Rotated(Rotation);
Vector2 toTarget = GlobalPosition.DirectionTo(target.GlobalPosition);
float dot = forward.Dot(toTarget);
if (dot > 0.7f) GD.Print("Target is ahead");Cross Product (3D)
The cross product gives a vector perpendicular to two input vectors.
# Get the surface normal from two edge vectors var edge1: Vector3 = vertex_b - vertex_a var edge2: Vector3 = vertex_c - vertex_a var normal: Vector3 = edge1.cross(edge2).normalized()
Vector3 edge1 = vertexB - vertexA; Vector3 edge2 = vertexC - vertexA; Vector3 normal = edge1.Cross(edge2).Normalized();
---
2. Transforms
Transform2D
A 2D transform holds position, rotation, and scale.
# Get the global transform var xform: Transform2D = global_transform # Convert between local and global space var local_point: Vector2 = to_local(global_point) var world_point: Vector2 = to_global(local_point) # Apply transform to a point var transformed: Vector2 = xform * Vector2(10, 0) # point in local space → global # Inverse transform var local: Vector2 = xform.affine_inverse() * global_point
Transform2D xform = GlobalTransform; Vector2 localPoint = ToLocal(globalPoint); Vector2 worldPoint = ToGlobal(localPoint); Vector2 transformed = xform * new Vector2(10, 0); Vector2 local = xform.AffineInverse() * globalPoint;
Transform3D & Basis
# Basis holds rotation and scale as 3 column vectors var basis: Basis = global_transform.basis # Forward direction (looking along -Z in Godot) var forward: Vector3 = -basis.z var right: Vector3 = basis.x var up: Vector3 = basis.y # Look at a target look_at(target.global_position, Vector3.UP) # Rotate around an axis rotate_y(deg_to_rad(90.0)) rotate_object_local(Vector3.UP, deg_to_rad(45.0)) # Interpolate between two transforms (smooth transition) var a: Transform3D = $Start.global_transform var b: Transform3D = $End.global_transform global_transform = a.interpolate_with(b, 0.5) # halfway
Basis basis = GlobalTransform.Basis;
Vector3 forward = -basis.Z;
Vector3 right = basis.X;
Vector3 up = basis.Y;
LookAt(target.GlobalPosition, Vector3.Up);
RotateY(Mathf.DegToRad(90.0f));
Transform3D a = GetNode<Node3D>("Start").GlobalTransform;
Transform3D b = GetNode<Node3D>("End").GlobalTransform;
GlobalTransform = a.InterpolateWith(b, 0.5f);is_orthonormal() (Godot 4.7+)
`Basis.is_orthonormal()` (const) returns `true` if the basis is *orthogonal* (axes perpendicular to each other) **and** *normalized* (every axis has length `
Agentic skills framework for Godot 4.x game development. Gives AI coding agents domain-specific expertise for GDScript and C# projects.
Other skills on godot-prompter.
- /authoring-godot-prompter-skills
Use when writing or editing a SKILL.md or an agent definition in this repo — required frontmatter, section ordering, and the GDScript-then-C# example convention.
Open skill - /releasing-godot-prompter
Use when cutting a GodotPrompter release or bumping its version — the version-bump sequence, tag-triggered workflow, and the marketplace manifests that must follow.
Open skill - /2d-essentials
Use when working with 2D-specific systems — TileMaps, parallax scrolling, 2D lights and shadows, canvas layers, particles 2D, custom drawing, and 2D meshes in Godot 4.3+
Open skill - /3d-essentials
Use when working with 3D-specific systems — materials, lighting, shadows, environment, global illumination, fog, LOD, occlusion culling, and decals in Godot 4.3+
Open skill - /ability-system
Use when building character abilities — Resource-based abilities with cost/cooldown/cast, buffs/debuffs, stat modifiers, gameplay tags, and HUD binding
Open skill - /addon-development
Use when creating Godot editor plugins — EditorPlugin, @tool scripts, custom inspectors, and dock panels
Open skill

