A Rust library for CSS-style 3D transform composition and inheritance. Compose hierarchical transforms with support for perspective, rotations, translations, scaling, and transform origins - just like CSS transforms work in browsers.
- CSS-like transform composition: Chain transforms using familiar patterns (
translate,rotate,scale) - Hierarchical inheritance: Child transforms automatically inherit and compose with parent transforms
- Perspective support: Apply CSS-style perspective with customizable origin
- Hit testing: Project screen coordinates back to local space for accurate hit detection
- Optional serialization: Enable
serdesupport with theserializationfeature
[dependencies]
transformator = "0.1"
# With serialization support
transformator = { version = "0.1", features = ["serialization"] }use transformator::Transform;
// Create a root transform (identity)
let root = Transform::new();
// Create a parent with position, perspective, origin, and rotation
let parent = Transform::new()
.with_position_relative_to_parent(350.0, 250.0)
.with_parent_container_perspective(500.0, 400.0, 300.0)
.with_origin(50.0, 50.0) // Rotate around center of 100x100 element
.then_rotate_x_deg(45.0)
.compose_2(&root);
// Create a child that inherits parent's transform
let child = Transform::new()
.with_position_relative_to_parent(10.0, 10.0)
.compose_2(&parent);
// Transform local points to world coordinates
let world_pos = parent.transform_local_point2d_to_world(0.0, 0.0);let transform = Transform::new()
.with_position_relative_to_parent(100.0, 100.0)
.with_origin(50.0, 50.0)
.then_rotate_y_deg(30.0)
.then_rotate_x_deg(45.0)
.then_translate(10.0, 20.0)
.then_scale(1.5, 1.5)
.compose_2(&Transform::new());// Project mouse position to local coordinates for hit testing
if let Some((local_x, local_y)) = transform.project_screen_point_to_local_2d((mouse_x, mouse_y)) {
// Check if point is inside your shape in local space
if local_x >= 0.0 && local_x <= 100.0 && local_y >= 0.0 && local_y <= 100.0 {
println!("Hit!");
}
}| Method | Description |
|---|---|
translate(x, y) / then_translate(x, y) |
2D translation |
translate_3d(x, y, z) / then_translate_3d(x, y, z) |
3D translation |
rotate_x_deg(deg) / then_rotate_x_deg(deg) |
Rotate around X axis |
rotate_y_deg(deg) / then_rotate_y_deg(deg) |
Rotate around Y axis |
rotate_z_deg(deg) / then_rotate_z_deg(deg) |
Rotate around Z axis |
scale(sx, sy) / then_scale(sx, sy) |
2D scaling |
scale_3d(sx, sy, sz) / then_scale_3d(sx, sy, sz) |
3D scaling |
with_origin(x, y) |
Set transform origin (pivot point) |
with_position_relative_to_parent(x, y) |
Set position relative to parent |
with_parent_container_perspective(dist, ox, oy) |
Set perspective |
compose(&parent) / compose_2(&parent) |
Compose with parent transform |
Licensed under either of Apache License, Version 2.0 or MIT license at your option.