Card i's position is set with rotateY(i × 360° / N) translateZ(radius) — spreading N cards evenly around a cylinder's circumference. Give the parent group (the "ring") transform-style: preserve-3d, and keep rotating the whole group by rotateY(θ); every card turns with the cylinder's surface, since each only needs to hold its own fixed angle while a single θ update spins the entire set.
To make the forward-facing card read clearly, normalize each card's current angle (its own angle + θ) to 0–360° and fade opacity as it approaches 180° (the back) — that sells the depth much more convincingly. If cards hold text, set backface-visibility: hidden on the back-facing ones so mirrored text doesn't show through.
Where coverflow shows one item large and centered with the rest as context, a 3D carousel keeps everything continuously turning and glimpsed in passing — it's less about reading any one item closely and more about conveying the presence and mood of a whole set.
When to use
Use it for logo walls or product showcases where the impression of "there are many" is the point itself. If users need to pick and examine one item closely, coverflow or a plain carousel works better.