Transparency sorting
See-through objects must be drawn back to front. When they aren't, glass hides glass and parts of the model just vanish.
See it
What it is
Opaque surfaces sort themselves for free: each pixel writes its depth, and anything farther away gets rejected. Blended transparency can't do that, because a see-through pixel has to mix with whatever is behind it, which means whatever is behind it must already be drawn. So the engine draws transparent objects last, sorted back to front by distance to the camera. It will not turn off depth writing for you, though: three.js materials default to depthWrite true even when transparent is true, so blended pieces usually need depthWrite: false set explicitly or they punch holes in whatever sits behind them.
That sort is per object, using a single center point, which is where it falls apart. Two panes of glass that intersect have no correct order. A mug whose handle is nearer than its body sorts as one lump, so the handle vanishes. Escape hatches, roughly in order of how much you should try them: use alpha test / cutout instead of blending for foliage, hair, and cut-out decals, since those go back in the opaque pass and sort perfectly; split the model into separate meshes and pin the order by hand (renderOrder in three.js); or reach for order independent transparency (weighted blended OIT, or dithered/stochastic alpha) when nothing else holds.
Gotcha: turning off depthWrite is what makes transparency composite, and it is also what lets a transparent object show through itself, so the inside of a glass bottle looks wrong. Double-sided glass often needs two passes, back faces then front faces. Stacked transparency is also the fastest way to torch your framerate through overdraw.
Ask AI for it
Fix transparency sorting in this three.js scene: split the model so each transparent piece is its own mesh, keep genuinely opaque parts opaque, and convert any cut-out textures (foliage, decals, hair) to alphaTest around 0.5 with transparent: false so they render in the opaque pass. For the remaining blended materials keep depthTest: true and set depthWrite: false explicitly, then leave the renderer's camera-relative sorting to order them: do not hard-code renderOrder values from farthest to nearest, because those go stale the moment the camera moves. Render double-sided glass as two passes, back faces then front faces, and for transparent surfaces that genuinely intersect each other use weighted blended OIT instead of trying to order them. Do not use transparent: true on anything that could be alpha tested instead.