Overview
Each test is one prompt. Every model gets the same prompt and, working as an agent, builds one self-contained HTML file: a Three.js scene of a single figure you can orbit and poke, with everything procedural. The site embeds that file live, exactly as delivered, and scores it on a four-axis rubric. If a model's code breaks, you see it break.
Runs are dated. When a model is tested again, or a new version comes out, the newest run leads and the older ones stay visible underneath as earlier versions. NSFWBench extends AssBench: same idea, twelve tests instead of one.
The 12 tests
Three subjects, each in four styles. Pick any cell to jump to its board.
| Subject | Realistic | Anime | Stylized CGI | Western comic |
|---|---|---|---|---|
| Full figure | Board | Board | Board | Board |
| Breasts | Board | Board | Board | Board |
| Ass | Board | Board | Board | Board |
- Full figure: head to toe, with a face, hands and separate fingers, 7 to 8 heads tall.
- Breasts: neck to navel, shoulders and upper arms, with a bikini top.
- Ass: waist to mid-thigh, front and back, with a thong and two clearly separate legs.
The styles are realistic (photoreal skin, soft shadows), anime (cel shading, clean outlines), stylized CGI (animated-feature polish) and Western comic (bold inks, flat color).
Methodology
Fixed, versioned prompts
Each test has exactly one prompt, published word for word on the Prompts page. The twelve prompts share the same structure and rules and differ only in subject and style. They are versioned as a set, currently v1.0. Any change to the wording bumps the version and is logged in the changelog. Scores from different prompt versions should not be compared directly.
Single-attempt agent protocol
A run is one attempt by one model at one test, carried out as an agent working under the published prompt (v1.0). The prompt itself sets the working conditions:
- Same input. Every model receives the same prompt, verbatim.
- Same output format. The model delivers one self-contained HTML file. Three.js and its official add-ons may come from a pinned CDN version; everything else (geometry, materials, lighting) must be procedural, with no images, textures, models or fonts.
- One file, one attempt. The model works only on that one HTML file and may not read or change anything else in the project. Each model gets a single attempt per test.
- Time budget. About two hours. If quality requires it, the model may run over by up to 50%, to three hours in total.
- Self-testing is allowed. Within that budget the model may open its own file with Playwright at 400×400, screenshot it from the front, back and sides, check the console, and iterate before delivering.
- Closed at delivery. After the file is delivered there is no human feedback or follow-up prompting, no best-of-n selection across separate attempts, and no edits to the file. What you see embedded is exactly what the model handed over.
- Recorded conditions. Each run records the model ID, the interface used such as an IDE, CLI agent, or API, the date, and any non-default settings. These are shown on its card.
Judging
Each run is scored against the rubric below by viewing the delivered file as-is: the same sandboxed embed you see on the site, orbited from every side and poked. The short judge notes on each card summarize the main strengths and deductions. A run that fails to render is kept on the board and scored 0 on every axis.
Rubric
Four axes, each scored 0 to 10. The anchors describe what 0, 5 and 10 look like; scores in between interpolate.
Fidelity
0–10Anatomy and style: a believable adult figure from every angle, rendered in the requested style.
- 0
- No recognizable figure, the wrong subject, or the requested style is missing.
- 5
- Recognizable anatomy with clear errors from some angles (merged legs, flat back, mirrored sides); style partly achieved.
- 10
- Correct, believable adult anatomy from every angle, and the style fully realized.
Interactivity
0–10Controls and framing inside a 400×400 embed: drag to orbit, no zoom, click to poke.
- 0
- Orbit and poke don't work, or the figure is out of frame.
- 5
- Controls work with flaws: zoom left on, off-center framing, pokes landing in the wrong place, or resizing breaks.
- 10
- Smooth orbit, no zoom, pokes deform exactly where clicked, and the figure stays centered and in frame at any size.
Physics
0–10Soft-body response after a poke: how deformation and secondary motion behave.
- 0
- No deformation, or it explodes and never settles.
- 5
- Deformation works but reads rubbery or mechanical, with visible jitter or overshoot.
- 10
- Localized, well-damped response that reads as soft tissue, with secondary motion that settles naturally.
Reliability
0–10Runs as delivered, within the rules: one file, pinned CDN, no external assets.
- 0
- Blank or broken on load.
- 5
- Renders, but with console errors, dropped frames or a broken rule (external assets, unpinned CDN).
- 10
- Renders on first load, clean console, steady 60 fps, every rule followed.
How scores are aggregated
- Test score
fidelity + interactivity + physics + reliability0–40 per run- Model overall
mean(test scores over judged tests)0–40, shown with n/12 judged
- Newest run counts. For each test, a model family is represented by its newest run. Earlier runs stay visible but don't count toward the overall.
- Missing is not zero. Tests a model hasn't been run on, or hasn't been judged on yet, are left out of its average rather than counted as 0. That's why the Leaderboard always shows n, the number of judged tests behind each overall.
- Small n, wide margin. An overall built on 2 tests is much less certain than one built on 12. Compare models with similar n, and read small gaps with caution.
- Ties share a rank. Equal scores get the same rank (1, 2, 2, 4). Unjudged runs are shown but not ranked.
- Filters recompute. Filtering the Leaderboard by subject or style recomputes each overall and n over the tests shown.
Arena votes and scores
The Arena shows two runs of the same test side by side without names. You inspect both, pick the better render, call a tie, or mark both bad, and only then see who made them.
Votes are a blind pairwise preference signal. They catch impressions the rubric might miss, but they do not replace it and do not change any score. For now votes stay in your own browser and are not published. When a backend collects them, they will be reported separately, such as win rates, next to the rubric scores rather than mixed into them.
Content rules
Adults only, 18+. The subject matter is adult; the content is swimwear-level and never explicit.
Every figure must read unmistakably as an adult woman, and every prompt requires a bikini or thong that fully covers the nipples, crotch and cleft wherever they are in frame. No nudity, no genitals, nothing explicit.
- Procedural, not real. Every render is code written by an AI model. There are no photos, scans or real people, and prompts never name or describe one.
- Breaking the rules means removal. A run that goes beyond swimwear-level or doesn't read as an adult is taken down, not scored.
- Sandboxed. Model code runs in a sandboxed frame that can't touch the rest of the site.
How to cite
If you use NSFWBench in your work, cite it as below. This citation is a placeholder until a write-up is published.
@misc{nsfwbench2026,
title = {{NSFWBench}: A Visual Benchmark for AI-Generated Interactive 3D Figures},
author = {{NSFWBench contributors}},
year = {2026},
howpublished = {\url{https://nsfwbench.com}},
note = {Prompt set v1.0. Accessed YYYY-MM-DD}
}
NSFWBench contributors (2026). NSFWBench: A Visual Benchmark for AI-Generated Interactive 3D Figures. Prompt set v1.0. https://nsfwbench.com
Changelog
-
Site
Removed the Gallery tab. The Board already shows every run. Site copy tightened.
-
Site
New Board: a filter sidebar for test, status, labs and models, with search and Only shortcuts, a Grid or Table view, and links that keep every filter. The Leaderboard gained the same lab and model filters. Calmer visual style and a plainer 18+ notice. Example data now uses the real names of the models queued for v1, still with placeholder scores. No real evaluations are published yet.
-
Site
Methodology section covering the single-attempt agent protocol, rubric anchors, aggregation rules and how Arena votes relate to scores. Added a citation, this changelog, prompt version labels, and a last-updated date and judged-test counts on the Leaderboard. Quieter visual style.
-
Prompts v1.0
First public prompt set: 12 tests, 3 subjects × 4 styles. Launch with the Board, Arena with votes stored locally, and Leaderboard. Example placeholder data only. No real models scored yet.
Get in touch
Want a model tested, or spotted a problem with a run? Reach out on X.