Transform
Namespace:
namespace Lenga\Engine\Core;
class Transform
Transform stores an object's position, rotation, and scale.
When an object has a parent:
localPositionis the offset from that parentlocalRotationis the rotation relative to that parentlocalScaleis the scale relative to that parent
When you want the final world-space values, use:
positionrotationlossyScale
Rotation in Lenga
Lenga supports two ways to work with 3D rotation:
- Euler-angle properties such as
$localEulerAnglesand$eulerAngles - quaternion properties such as
$localRotationand$rotation
The Inspector is still mainly Euler-facing in this release, but runtime 3D transform composition uses quaternion-backed rotation math. That means you can author readable Euler values in the editor and still use safer quaternion rotation workflows in code.
Common Properties
| Property | Type | What it means |
|---|---|---|
$localPosition |
Vector3 |
Position relative to the parent. |
$position |
Vector3 |
World-space position. |
$localEulerAngles |
Vector3 |
Local rotation in degrees. |
$eulerAngles |
Vector3 |
World rotation in degrees. |
$localRotation |
Quaternion |
Local rotation relative to the parent. |
$rotation |
Quaternion |
World rotation. |
$localScale |
Vector3 |
Scale relative to the parent. |
$lossyScale |
Vector3 |
Final scale after parent scaling is applied. |
$right |
Vector3 |
World-space right direction. |
$up |
Vector3 |
World-space up direction. |
$forward |
Vector3 |
World-space forward direction. |
Methods
getChildren
public function getChildren(): array
Returns the direct child transforms.
childCount
public function childCount(): int
Returns the number of direct children.
getChild
public function getChild(int $index): ?Transform
Returns the child at the given index, or null.
find
public function find(string $path): ?Transform
Finds a child by a slash-separated path such as "Weapon/Muzzle".
isChildOf
public function isChildOf(Transform $parent): bool
detachChildren
public function detachChildren(): void
setParent
public function setParent(?Transform $newParent, bool $worldPositionStays = true): void
Changes the parent transform.
When worldPositionStays is true, Lenga keeps the object's world-space
position, rotation, and scale, then recalculates the local values under the new
parent.
When worldPositionStays is false, Lenga keeps the current local values and
lets the final world transform change relative to the new parent.
translate
public function translate(Vector3 $offset, bool $relativeToSelf = true): void
Moves the transform by the given offset.
- When
relativeToSelfistrue, the offset is applied in the object's own rotated space. - When
relativeToSelfisfalse, the offset is applied in world space.
translate2D
public function translate2D(Vector2 $offset, bool $relativeToSelf = true): void
rotate
public function rotate(Vector3|float $xOrEuler, ?float $y = null, ?float $z = null, bool $relativeToSelf = true): void
Applies a rotation delta.
- When
relativeToSelfistrue, the delta is applied in local space. - When
relativeToSelfisfalse, the delta is applied in world space.
For more deliberate 3D rotation control, set $localRotation or $rotation
directly with Quaternion.
rotate2D
public function rotate2D(float $degrees, bool $relativeToSelf = true): void
rotateAround
public function rotateAround(Vector3 $point, Vector3 $axis, float $angleDegrees): void
Rotates the object around a world-space point and axis.
Use this for orbit cameras, rotating platforms, satellites, radial projectiles, and objects that need to move around a pivot while their rotation changes by the same amount.
lookAt
public function lookAt(Vector3 $worldPosition): void
Rotates the object so it faces the given world-space point.
transformPoint
public function transformPoint(Vector3 $localPoint): Vector3
Converts a point from this transform's local space to world space.
inverseTransformPoint
public function inverseTransformPoint(Vector3 $worldPoint): Vector3
Converts a point from world space to this transform's local space.
transformDirection
public function transformDirection(Vector3 $localDirection): Vector3
Converts a direction from local space to world space. Position and scale are not applied.
inverseTransformDirection
public function inverseTransformDirection(Vector3 $worldDirection): Vector3
Converts a direction from world space to local space. Position and scale are not applied.
transformVector
public function transformVector(Vector3 $localVector): Vector3
Converts a vector from local space to world space. Scale and rotation are applied; position is not.
inverseTransformVector
public function inverseTransformVector(Vector3 $worldVector): Vector3
Converts a vector from world space to local space. Scale and rotation are removed; position is not applied.
getNativeId
public function getNativeId(): ?int
Example
use Lenga\Engine\Core\Behaviour;
use Lenga\Engine\Core\Quaternion;
use Lenga\Engine\Core\Time;
use Lenga\Engine\Core\Vector3;
class ObjectController extends Behaviour
{
public function update(): void
{
$transform = $this->transform;
$worldPosition = $transform->position;
$worldRotation = $transform->rotation;
$worldEuler = $transform->eulerAngles;
$transform->position = new Vector3(
$worldPosition->x + (1.0 * Time::deltaTime()),
$worldPosition->y,
$worldPosition->z,
);
$transform->rotate(0.0, 90.0 * Time::deltaTime(), 0.0);
$transform->rotateAround(
Vector3::zero(),
Vector3::up(),
30.0 * Time::deltaTime()
);
$transform->localRotation = Quaternion::fromEulerAngles(
new Vector3(0.0, 45.0, 0.0)
);
$transform->translate(
new Vector3(0.0, 0.0, -1.0 * Time::deltaTime())
);
$forward = $transform->forward;
$right = $transform->right;
$muzzleWorldPoint = $transform->transformPoint(new Vector3(0.0, 0.0, -2.0));
}
}
Usage Notes
- Use Euler angles when you want readable degree values.
- Use quaternions when you want safer 3D rotation composition in code.
- The scene format and Inspector still use Euler-facing values for authoring, but runtime transform composition is quaternion-backed for 3D workflows.