SentenceASCIIGenerator

SentenceASCIIGenerator is a specialty group that lays out copies of a single object in the shape of text. Give it one asset and a string, and it stamps a copy of the asset at each filled cell of an ASCII-art rendering of that string — useful for signage, event displays, or playful arrangements (a hedge spelling a word, tea-lights forming a message).

with scene.SentenceASCIIGenerator() as ascii_gen:
    plant = scene.AddAsset("a small succulent plant", modulate_scale=5.0)
    ascii_gen.place(plant, "HI")

ascii HI top-down ascii HI perspective

place(obj, sentence)

Parameter Type Description
obj object The asset to stamp at each filled cell. It is copied automatically — you pass one object, not a list.
sentence str The text to render. Use \t to separate words on a line and \n to start a new line.

The generator computes how many cells the text occupies, copies the object that many times, and positions one copy per cell on the floor plane.

ascii_gen.place(plant, "WORLD\tPEACE\n2045")

Scaling up: a forest that spells the title

The mechanism has no size limit — the object can be a tree and the sentence a whole title card. This is the InteriorAgent 3DV 2026 demo: a forest of cherry-blossom trees spelling the paper title, built by exactly the code shape above (the trees are scaled up slightly so their canopies close into a continuous forest):

with scene.SentenceASCIIGenerator() as gen:
    tree = scene.AddAsset("a cherry blossom tree", modulate_scale=1.45)
    gen.place(tree, "InteriorAgent\n3DV\t2026\nVancouver")

The walkthrough starts at eye level inside the forest — just trees drifting past — then cranes up and back until the trees resolve into the title.

How it works

Behind the scenes the generator uses a language model to produce an ASCII-art bitmap for each character (an AlphabetGenerator/WordGenerator pair), then maps every * cell of that bitmap to a copy of your object. Because it calls a language model to render glyphs, it is slower than the purely geometric groups and requires a configured model.

Compilation

Like the other groups, SentenceASCIIGenerator is used as a context manager and freezes into a single unit when the block closes. Its layout is deterministic given the glyph bitmaps, so compilation simply executes the placements — there is no overlap or proportion optimization. The frozen result can be placed in a room or another group like any other unit:

with scene.RoomGroup() as room:
    room.place_on_center(ascii_gen, facing="front")

Next: a group that hides an LLM behind the standard contract is one of three ways IDSDL has grown new vocabulary — Extending the Language tells that story, including the motif groups the agent added itself.


This site uses Just the Docs, a documentation theme for Jekyll.