From a furniture photo to a 3D model: two AI models compared and where they fail
Transparency: this piece is a portfolio test of our own, not client work. The 3D models are AI-generated from two CC0 photos. They are real objects, with no people and no brands. We tested two models, and the commercial part, at the end, says what we do and do not offer.
Watch the video on YouTube (AI-generated presenter and voice).
The problem
An online shop or an interior studio has a photo of a piece of furniture and needs a textured 3D model. Modelling it by hand takes hours. AI models that make a 3D object from a single photo promise to save that time. We wanted to see what actually comes out, with one object that is easy to read and one that is hard, and where the work still has to continue.
What we did
Two photos, one per object, both CC0 from Wikimedia Commons:
- A walnut stool from about 1670 with an embroidered seat and green fringe (The Metropolitan Museum of Art, Open Access). Turned legs, stretchers and a very detailed textile.
- A black chair in the classic Thonet No. 14 shape (photo by Antonio Borrillo). Up close it turned out to be tubular metal with a plastic seat printed to look like cane, not bentwood. It still works as a hard test: dark, thin, glossy and full of gaps.
The process:
- Background matte with BiRefNet, then a square crop around the object.
- Two photo-to-3D models, same seeds (1234 and 777): Pixal3D (TencentARC, MIT licence) and TRELLIS.2 (Microsoft, MIT). Pixal3D is built on TRELLIS.2 and also uses the photo's field of view (we estimate it with MoGe-2). Both at resolution 1024; Pixal3D also at 1536 as an extra run. We used the ComfyUI-native port with int8 weights, not the official pipelines, so these results are not "official" figures for either model.
- Post-processing in the same graph: a very dense reference mesh, a version of about 150,000 triangles and one of about 50,000, UV unwrap and texture baking. The resulting GLB holds three 2048 px PNG textures: base colour, one packed map with ambient occlusion, roughness and metallic (occlusion is baked at 1024 px in the graph), and normal.
- Renders in Blender with neutral studio light: photo-angle, three-quarter, side, rear and top views, a 360-degree turntable, a wireframe of the 50,000-triangle mesh, and the UV atlas.
All on one RTX 4090: about 25 minutes of generation for the 10 runs and under 10 minutes of rendering.
Results
- Stool: Pixal3D wins clearly. The silhouette, turned legs, stretchers, fringe and floral embroidery follow the photo. At 1536 the embroidery is sharper and the fringe has the right green. The final model is seed 777 at 1536, with 147,869 triangles.
- Chair: a close call. All four 1024 runs recover the hoop, the double rail, the ring under the seat and the four tapered legs. We picked Pixal3D (seed 1234, 149,206 triangles) because the geometry is a little cleaner. The gap to TRELLIS.2 is within seed noise.
- More resolution does not always help. On the stool it did. On the chair, 1536 added a pale sliver on a rear leg and cut the end off another, so we kept 1024.
- Time per model on the stool: Pixal3D 124 and 135 s at 1024 (215 s at 1536); TRELLIS.2 252 and 215 s. On the chair, Pixal3D took 70 and 72 s and TRELLIS.2 56 and 52 s. We did not investigate why.
- GPU memory (peak): on the stool, Pixal3D 11.2 to 12.7 GB at 1024 and 15.6 GB at 1536; TRELLIS.2 18.2 to 18.5 GB. This is the whole-card peak, including about 2.1 GB used by other processes.
- What you get per object: a GLB with a PBR material (three 2048 px textures: base colour, packed occlusion + roughness + metallic, and normal), versions of about 150,000 and 50,000 triangles, a 360-degree turntable, views, wireframe and UV atlas.
Turn them yourself in 3D
These are the final models of about 150,000 triangles, with textures reduced to 1024 px (WebP) and vertices quantized for the web: 6.5 MB the stool and 5.2 MB the chair (the original GLBs are 24.4 and 16.5 MB). They load when you press the button. Drag to rotate, scroll or pinch to zoom.






What still fails
Each failure, with what a client job would add:
- TRELLIS.2 broke the stool. With one seed the stretchers came out as twisted shards and the top of the seat was torn open with black holes. With the other, the legs are fine but the seat is full of holes and the embroidery turns into yellow blotches. Two seeds, same verdict, but only two. In a client job: switch model, try several seeds and pick, or simplify the photo.
- The chair's cane weave is lost in every run. The seat comes out as a solid plate with a flat colour, not an open weave. In a client job: model the seat separately, use an alpha-cut material, or use a close-up photo as a tiling texture.
- What the photo cannot see is invented. The stool's hidden stretcher comes out pale wood and the hidden fringe mustard. The chair's seat seen from behind is a flat white disc. In a client job: several photos of the object (Pixal3D has a multi-view checkpoint, which we did not try with these weights), or texture touch-up.
- Thin parts come out uneven. The chair legs are wobbly rather than straight tubes, the tips flare or are cut at an angle, and in one TRELLIS.2 run there are pale slivers beside the rear legs. In a client job: rebuild legs and hoop as clean tubes in Blender, using the generated mesh only as a guide, or retopology and manual cleanup.
- The UV layout is very fragmented. Thousands of tiny islands and a few big ones; the 50,000-triangle mesh has irregular triangles, some giant and flat on the stool's stretchers. It bakes fine, but it is fragile if someone edits the texture. In a client job: quad retopology, a clean manual UV unwrap and a rebake. We estimate half a day per object; that is our estimate, not measured on a real job.
- The metal comes out too glossy. The chair seat looks like brass in the renders. In a client job: clamp the metallic map on the parts that are not metal.
- Pixal3D's mesh comes out tilted. It arrives in the photo's camera frame, with the camera's tilt (35 degrees on the stool). We levelled it by hand before rendering, by eye (-35 and -25 degrees). It cannot be delivered without this step.
- File weight. Each original GLB is 12 to 29 MB because the textures are PNG. For this page we recompressed the ones of about 150,000 triangles (1024 px WebP textures, quantized vertices): 6.5 MB the stool and 5.2 MB the chair. That is a viewing version, with less texture detail than the delivery.
- The light 50,000-triangle stool breaks. Opened in a 3D viewer it shows black patches on the top face of the seat and at the corners, which the 150,000-triangle model does not have (seen by eye in a viewer, not measured). The 50,000-triangle chair is fine. That is why the viewers on this page use the 150,000-triangle version. In a client job: more careful decimation or retopology.
- What we did not measure: whether the mesh is watertight (matters for printing), the number of UV islands, dimensions in real units, and behaviour on glass or chrome. We make no claim about any of these.
- Small sample. Two photos and two seeds per cell. Pixal3D's win on the stool is clear; on the chair we cannot say who wins.


What a client gets
This piece is not a service we sell as is: it is a test of our own, and the models are not delivered as a product. For a real case we would start from the photos of your furniture and give you the GLB with PBR textures, a lighter version, the renders and the wireframe. And we would tell you beforehand, as here, which parts of that object are likely to come out wrong and what manual work it would need to be ready for your shop or viewer. We do not promise a production-ready model from a single photo.
Write to us with your case and a photo of the furniture: hello@grawwww.xyz. We answer in under 48 hours.
Credits and licences. Photos: stool, The Metropolitan Museum of Art, Open Access (CC0), courtesy; chair, Antonio Borrillo (CC0), courtesy. Models: Pixal3D (TencentARC, MIT) and TRELLIS.2 (Microsoft, MIT), ComfyUI-native port with int8 weights. Built with DINOv3 (Meta). Background removal: BiRefNet (MIT). Field of view: MoGe-2 (MIT). Renders: Blender. 3D viewer: model-viewer (Google, BSD-3-Clause).
All 3D models and renders in this article are AI-generated. Real objects from two CC0 photos, no people and no brands.