A rectangle in the XY plane centred on the origin, facing +Z: 4 vertices,
2 counter-clockwise triangles (§53 "plane").
XY rather than XZ is the whole point of §7a's "Y-up in both 2D and 3D": the
same quad is a 2D sprite background, a world-space UI panel, and the ground
of a side-on physics scene, and it never needs re-orienting between them.
A floor in a 3D scene is this plane rotated -π/2 about X by its node's
transform.
Every vertex carries the +Z normal the plane faces (§68, 2026-08-04) —
the node's transform reorients it with the plane, so the rotated floor
above lights from +Y as expected. The back side is a legitimate view
(back-face culling is off, see @fourjs/render-webgl) but Lambert-dark:
a face lit from behind receives its ambient term only.
Uv (§53, R-19) is the quad's own unit square seen from +Z: (0, 0) at the
bottom-left corner, u growing with +x, v growing with +y. That is the
same mapping the sprite pipeline derives from a quad's local rectangle
(@fourjs/render-webgl), so a textured plane and a Sprite of the same size
show a texture identically — which is what makes the derived-uv workaround
safe to retire when its packet gets to it.
A rectangle in the XY plane centred on the origin, facing +Z: 4 vertices, 2 counter-clockwise triangles (§53 "plane").
XY rather than XZ is the whole point of §7a's "Y-up in both 2D and 3D": the same quad is a 2D sprite background, a world-space UI panel, and the ground of a side-on physics scene, and it never needs re-orienting between them. A floor in a 3D scene is this plane rotated -π/2 about X by its node's transform.
Every vertex carries the
+Znormal the plane faces (§68, 2026-08-04) — the node's transform reorients it with the plane, so the rotated floor above lights from+Yas expected. The back side is a legitimate view (back-face culling is off, see@fourjs/render-webgl) but Lambert-dark: a face lit from behind receives its ambient term only.Uv (§53, R-19) is the quad's own unit square seen from +Z:
(0, 0)at the bottom-left corner,ugrowing with+x,vgrowing with+y. That is the same mapping the sprite pipeline derives from a quad's local rectangle (@fourjs/render-webgl), so a textured plane and aSpriteof the same size show a texture identically — which is what makes the derived-uv workaround safe to retire when its packet gets to it.