part of sprites; class Node3D extends Node { double _rotationX = 0.0; double get rotationX => _rotationX; set rotationX(double rotationX) { _rotationX = rotationX; invalidateTransformMatrix(); } double _rotationY = 0.0; double get rotationY => _rotationY; set rotationY(double rotationY) { _rotationY = rotationY; invalidateTransformMatrix(); } double _projectionDepth = 500.0; double get projectionDepth => _projectionDepth; set projectionDepth(double projectionDepth) { _projectionDepth = projectionDepth; invalidateTransformMatrix(); } Matrix4 computeTransformMatrix() { // Apply normal 2d transforms Matrix4 matrix = super.computeTransformMatrix(); // Apply perspective projection Matrix4 projection = new Matrix4(1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, -1.0/_projectionDepth, 0.0, 0.0, 0.0, 1.0); matrix = matrix.multiply(projection); // Rotate around x and y axis matrix.rotateY(radians(_rotationY)); matrix.rotateX(radians(_rotationX)); return matrix; } }