Preparing a Model in 3ds Max: Difference between revisions

From Light Stream (EN)
(Перевод с русской вики (задача №983, LS Dev Hub))
 
(Перевод с русской вики (задача №1106, LS Dev Hub))
 
Line 1: Line 1:
[[ru:Подготовка модели в 3ds max]] [[en:Preparing a Model in 3ds Max]]
[[ru:Подготовка модели в 3ds max]] [[en:Preparing a Model in 3ds Max]] [[zh:在3ds Max中准备模型]]
This article explains what a model should look like to end up in the Light Stream scene at the right size, right side up, and without losses. It talks about 3ds Max, but the requirements are the same for any 3D editor: what matters to the program is not what the model was made in, but what is written in the <code>*.obj</code> file. The import process itself is covered in the article [[Importing OBJ Models]].
This article is about what a model needs to be like in order to land in the Light Stream scene at the right size, right side up, and without any loss. It uses 3ds Max as the example, but the requirements are the same for any 3D editor: what matters to the program is not what tool the model was made in, but what is written in the <code>*.obj</code> file. The import itself is covered in the article [[Importing OBJ Models]].


A model for Light Stream should be prepared not to look "prettier" but to be "clearer." There will be no beautiful rendering here: the program displays the object with a simple fill and a single texture. On the other hand, snapping works off the model's vertices, and its objects become rows in a list that you will scroll through for the entire project — so what matters most is the correct scale, clean geometry, and meaningful names.
A model for Light Stream should be prepared to be "clearer," not "prettier." There is no pretty rendering here: the program displays an object with simple flat shading and a single texture. On the other hand, snapping works off the model's vertices, and its objects become rows in a list you will be scrolling through for the whole project — so what matters most is correct scale, clean geometry, and meaningful names.


== What Carries Over Into Light Stream and What Doesn't ==
== What Carries Over to Light Stream and What Doesn't ==


{| class="wikitable"
{| class="wikitable"
! Carries Over !! Doesn't Carry Over
! Carries Over !! Does Not Carry Over
|-
|-
|
|
* Geometry — triangles and quads
* Geometry — triangles and quads
* Split into objects and their names
* The breakdown into objects and their names
* Normals (shading and smoothing)
* Normals (shading and smoothing)
* Lines — they become splines
* Lines — they become splines
Line 22: Line 22:
* All maps except the base texture: bump, reflection, opacity, self-illumination
* All maps except the base texture: bump, reflection, opacity, self-illumination
* The second and subsequent materials of one object
* The second and subsequent materials of one object
* Light sources and cameras — they don't come from <code>*.obj</code>
* Lights and cameras — these don't come through from <code>*.obj</code>
* Vertex colors
* Vertex colors
|}
|}
Line 28: Line 28:
== Units and Scale ==
== Units and Scale ==


Coordinates are taken from the file as they are: there is no scaling window on import, so you won't be able to adjust the size "on the way in."
Coordinates are taken from the file as-is: there is no scaling dialog on import, so you can't adjust the size "on the way in."


'''The Light Stream scene is measured in millimeters: one file length unit equals one millimeter.''' A facade 30 m tall should take up 30,000 units in the file, and a single pixel of an LED strip thirty to forty units. The easiest way to check the scale is with a cube created in the program itself: a cube sized '''1000''' × '''1000''' × '''1000''' is a one-meter cube — place it next to the model and compare.
'''The Light Stream scene is measured in millimeters: one unit of length in the file equals one millimeter.''' A facade 30 m tall should take up 30,000 units in the file, and a single pixel of an LED strip should be thirty to forty units. The easiest way to check the scale is with a cube created in the program itself: in the '''Properties''' window ('''Cube''' section), set its '''Width''', '''Height''', and '''Length''' to '''1000''' each — that's a one-meter cube — place it next to the model and compare.


In 3ds Max it's most convenient to work like this: set the system units to millimeters and model at real-world size — then nothing needs to be recalculated on export, and the scale factor stays at '''1'''. If the scene was built in other units, set the scale factor on export: from meters — '''1000''', from centimeters — '''10''', from inches — '''25.4'''.
In 3ds Max it's most convenient to work like this: set the system units to millimeters and model at real-world size — then nothing needs to be recalculated on export, and the scale factor stays equal to '''1'''. If the scene was built in other units, set the scale factor on export: from meters — '''1000''', from centimeters — '''10''', from inches — '''25.4'''.


A units mistake is the most common reason "nothing is visible" after import. A model exported in meters ends up a thousand times smaller than it should be and gets lost among the fixtures; a model accidentally scaled up a thousand times moves kilometers away from the origin, and the camera shows emptiness.
A units mistake is the most common reason for "nothing visible" after import. A model exported in meters ends up a thousand times smaller than it should be and gets lost among the fixtures; a model accidentally scaled up a thousand times ends up kilometers from the origin, and the camera shows nothing but empty space.


== Orientation ==
== Orientation ==


Up in the Light Stream scene is the '''Z''' axis — just as in 3ds Max. So in the OBJ export settings, uncheck the '''Flip YZ-axis''' checkbox (which swaps axes for Y-up): with it checked, the model will end up lying on its side in the scene. If the model does end up on its side, toggle this checkbox and export again.
In the Light Stream scene, the '''Z''' axis points up same as in 3ds Max. So in the OBJ export settings, the '''Flip YZ-axis''' checkbox (which swaps the axes for a Y-up convention) should be unchecked: with it enabled, the model will end up lying on its side in the scene. If the model does end up on its side, toggle this checkbox and export again.


Before exporting, it's useful to reset transforms and place the model in 3ds Max where it should end up relative to the origin: the position of objects relative to one another and the coordinates from the file are preserved completely on import.
Before exporting, it helps to reset transforms and position the model in 3ds Max exactly where it should end up relative to the origin: the position of objects relative to each other and the coordinates from the file are preserved in full on import.


== Splitting into Objects and Names ==
== Breaking Down into Objects and Naming ==


The file is parsed into separate objects, and each of them becomes a row in the '''3D Objects''' window with its own visibility checkbox, its own material, and its own lock. The rules are simple:
The file is parsed into separate objects, and each one becomes a row in the '''3D Objects''' window with its own visibility checkbox, its own material, and its own lock. The rules are simple:


* '''All geometry must be inside named objects.''' Anything written to the file before the first object is not imported.
* '''All geometry must belong to named objects.''' Anything written to the file before the first object is not imported.
* '''Every object must have a name.''' An unnamed object or group cuts off the reading of the file: anything written below it will no longer make it into the scene, and the model will arrive only half-complete.
* '''Every object must have a name.''' An unnamed object or group cuts off the file reading: anything written after it will no longer make it into the scene, and the model will arrive half-finished.
* '''Names must be in Latin characters, no Cyrillic.''' Cyrillic letters in object names and file names turn into a string of question marks on import.
* '''Names must be in Latin characters, no Cyrillic.''' This applies both to object names and to the names of files the model references — the material file and textures. Cyrillic letters in them turn into a string of question marks on import, and a texture with such a name simply won't be found.
* Split by meaning: "facade", "roof", "column_left". A model made of one solid piece will be a single row in the list — you won't be able to hide or recolor part of it later.
* '''Don't name an object <code>light</code>.''' This is a reserved name: the geometry of an object with this name is treated not as scenery but as a light-emitting part — it's drawn not with its own material but as light, and it's invisible in the scene until the object is selected.
* Don't overdo the opposite either: several hundred small objects turn the '''3D Objects''' list into an endless ribbon that's inconvenient to search through.
* Break it down by meaning: "facade", "roof", "column_left". A model made of one solid piece will be a single row in the list — you won't be able to hide or recolor part of it afterward.
* Don't overdo it in the other direction either: several hundred small objects turn the '''3D Objects''' list into an endless ribbon that's inconvenient to search through.


== Polygons ==
== Polygons ==


Light Stream reads triangles and quads. Faces with five or more vertices are silently skipped — there will be holes in the scene where they should be.
Light Stream reads triangles and quads. Faces with five or more vertices are silently skipped — their place in the scene will be a hole.


So in the export settings, in the '''Faces''' group, choose '''Triangles''' or '''Quads''', not '''Polygons'''. Before exporting, collapse the modifiers and convert the objects to a polygon mesh: NURBS, patches, bodies with boolean operations, and other non-tessellated objects will either not make it into the OBJ, or will make it in looking different from how they looked in the viewport.
So in the export settings, in the '''Faces''' group, choose '''Triangles''' or '''Quads''', not '''Polygons'''. Before exporting, collapse the modifiers and convert the objects to a polygon mesh: NURBS, patches, boolean-operation solids, and other uncalculated objects will either not make it into the OBJ at all, or will end up looking different from how they appeared in the viewport.


One more requirement for the geometry: '''don't export vertex colors'''. If the exporter appends the vertex's color to its coordinates as well, such a vertex won't be read correctly, and the faces that reference it will end up built from someone else's points the model will arrive turned inside out.
One more requirement for the geometry: '''don't export vertex colors'''. If the exporter appends the vertex's color to its coordinates on top of that, such a vertex won't be read at all, the vertex numbering will shift — and the faces will end up built from the wrong points: the model will arrive turned inside out or cut off partway through.


== Normals ==
== Normals ==


'''Normals must be written to the file''' — in the export settings this is the '''Normals''' checkbox. The program uses them to calculate shading: without normals, the object is drawn as one flat fill in the background light color, that is, it looks like a flat dark silhouette with no volume.
'''Normals must be written to the file''' — in the export settings this is the '''Normals''' checkbox. The program uses them to calculate shading: without normals the object isn't lit at all and stays in the scene as a flat black silhouette with no volume.


Smoothing groups by themselves aren't read, but there's no need to set them up separately either: the exporter writes the result of smoothing into the normals, and the object arrives in the scene just as smooth or faceted as it was in the editor.
Smoothing groups by themselves aren't read, but there's also no need to set them separately: the exporter bakes the smoothing result into the normals, and the object arrives in the scene just as smooth or as faceted as it was in the editor.
 
Shading is calculated only for parts colored with a plain color. An object with a texture is drawn flat, without shading — normals don't affect it.


Light Stream has no backface culling — a face is visible from both sides, so a part turned inside out won't disappear. But a normal pointing away from the light kills the shading: such a face will be noticeably darker than its neighbors. If there are dark patches on the model after import, check the direction of the normals in the editor.
Light Stream has no backface culling — a face is visible from both sides, so a part turned inside out won't disappear. But a normal pointing away from the light kills the shading: such a face will be noticeably darker than its neighbors. If there are dark patches on the model after import, check the direction of the normals in the editor.
Line 70: Line 73:
== Lines for Fixtures ==
== Lines for Fixtures ==


Lines written to the file arrive in the scene as ready-made splines — you can place fixtures along them right away, without having to trace the edges by hand. This is the most convenient way to bring the paths of strips, garlands, and contour lighting into Light Stream: draw them as splines in 3ds Max in their proper place, and in the program all that's left is to link them to the mapping.
Lines written to the file arrive in the scene as ready-made splines — you can place fixtures along them right away, without manually tracing the edges. This is the most convenient way to pass strip, garland, and contour-lighting runs to Light Stream: you draw them as splines in 3ds Max exactly where they should go, and in the program all that's left is to link them to the mapping.


For the lines to come through:
For the lines to come through:


* enable their export — the '''Shapes/Lines''' checkbox in the OBJ export settings;
* enable their export — the '''Shapes/Lines''' checkbox in the OBJ export settings;
* convert the splines to polylines with the required number of points: curves are written to the file as segments, and the smaller the step, the more points will arrive in the scene;
* convert the splines to polylines with the required number of points: curves are written to the file as segments, and the smaller the step, the more points arrive in the scene;
* join the segments into a single line. Each line in the file becomes a separate spline, so a path assembled from unconnected segments will arrive as a scattering of short splines;
* join the segments into a single line. Each line in the file becomes a separate spline, so a run made up of unconnected segments will arrive as a scattering of short splines;
* turn off the export of texture coordinates if the splines don't appear: some exporters append them to the line entries too, and Light Stream skips such lines.
* turn off the export of texture coordinates if the splines don't show up: some exporters append them to line entries too, and Light Stream skips such lines.
 
A spline's name is taken not from the line itself but from the object it's written inside — so it's worth grouping lines into separate, meaningfully named objects: "line_roof", "contour_window". Such an object itself won't appear in the '''3D Objects''' list: if it has no faces, only splines arrive in the scene.


There's no need to make a separate object for fixtures: light sources from 3ds Max are not saved into OBJ at all. If you'd also like to bring pre-placed fixtures into the program, export the model to <code>*.fbx</code> — from there, in addition to objects and splines, individual fixtures come through as well.
There's no need to make a separate object for fixtures: lights from 3ds Max aren't saved to OBJ at all. If you want to pass placed light fixtures to the program as well, export the model to <code>*.fbx</code> — from there, besides objects and splines, single fixtures come through too.


== Materials and Textures ==
== Materials and Textures ==


OBJ stores materials in a separate file next to the model, and textures are separate images too, so enable material export and always move the whole model together, the entire folder.
OBJ stores materials in a separate file next to the model, and textures are separate image files too so enable material export and always move the model as a whole, the entire folder.


What you should know about materials in advance:
What you need to know about materials in advance:


* '''One object — one material.''' A multi-component material (Multi/Sub-Object) is carried over as only one of its parts. If parts of a piece should be different colors, split the piece into objects by material.
* '''One object — one material.''' A multi-component material (Multi/Sub-Object) carries over only one of its parts — the one mentioned last in the file — and that part is applied to the whole object. If parts of a piece need to be different colors, split the piece into objects by material.
* Only the base color and base texture are taken from the material. Opacity, reflections, bump, self-illumination, and any procedural maps are ignored — it's better to bake them into an ordinary image or not rely on them at all.
* Only the base color and base texture are taken from the material. Opacity, reflections, bump, self-illumination, and any procedural maps are ignored — it's better to "bake" them into a regular image, or not rely on them at all.
* Textures are ordinary JPG, PNG, BMP, or GIF images. Put them next to the model or in a subfolder: the program looks for the file by name in neighboring folders as well. File names must be in Latin characters.
* Textures are regular JPG, PNG, BMP, or GIF images. Put them next to the model or in a subfolder: the program searches for the file by name next to the model and in all nested folders. File names must be in Latin characters.
* A texture needs a UV unwrap. An object without an unwrap will get the texture smeared into a single color.
* A texture needs a UV unwrap. An object without one will get the texture smeared into a single color.
* Light Stream has no self-illuminating materials. If a part should look like it's glowing — a sign, a screen, a light line — turn on the '''Glow''' checkbox for it after import, in the '''Material''' section of the '''Properties''' window.
* There are no self-illuminating materials in Light Stream. If a part needs to look like it's glowing — a sign, a screen, a light line — enable the '''Glow''' checkbox for it after import, in the '''Material''' section of the '''Properties''' window.


Color, texture, and glow can also be assigned entirely by hand once in the program, so for utility geometry you don't need to set up materials in the editor at all: an object with no material arrives white.
Color, texture, and glow can also be assigned entirely by hand within the program, so for utility geometry you don't need to set up materials in the editor at all: an object without a material arrives gray.


== Model Complexity ==
== Model Complexity ==


The model becomes part of the project file entirely, so its weight is the project's weight, its opening time, and the GPU load on every preview frame. And in the program the mesh takes up more space than in the editor: each face is stored with its own vertices.
The model is embedded inside the project file in full, so its weight is the project's weight, its load time, and the load on the graphics card at every preview frame. Moreover, the mesh takes up more space in the program than in the editor: each face is stored together with its own vertices.


A reasonable minimum of preparation before exporting:
A reasonable minimum of preparation before export:


* delete everything not visible on the object: insides, the reverse side, hidden details, helper objects, duplicate copies;
* delete everything that isn't visible on the object: interiors, the underside, hidden parts, helper objects, duplicate copies;
* remove small details that won't be visible in the preview: bolts, profiles, texture detail, one-millimeter chamfers;
* remove small details that won't show up in preview: bolts, profiles, surface texture detail, one-millimeter bevels;
* reduce the number of segments on fillets and pipes — smoothness is expensive;
* reduce the segment count on fillets and pipes — smoothness is expensive;
* leave vertices where they're needed: '''Snap to Vertices''' works off them, and fixtures will land precisely on corners and edges. If a row of fixtures should run along a flat wall, add edges to the model along its border.
* leave vertices where they're needed: '''Snap to Vertices''' works off them, and fixtures will land precisely on corners and edges. If a line of fixtures needs to run along a flat wall, add edges to the model along its borders.


== Export Order ==
== Export Procedure ==


# In the 3ds Max scene, gather only what should go to Light Stream: the model itself and the lines for fixtures.
# In the 3ds Max scene, gather only what should go to Light Stream: the model itself and the lines for fixtures.
# Collapse the modifiers, convert the objects to a polygon mesh, delete anything hidden or unnecessary.
# Collapse the modifiers, convert the objects to a polygon mesh, delete hidden and unnecessary geometry.
# Check the object names: they must exist, and they must be in Latin characters.
# Check the object names: they must exist, and they must be in Latin characters.
# Check the dimensions and bring the model to the "one unit one meter" scale.
# Check the dimensions and bring the model to the "one unit = one millimeter" scale.
# Export the selection to <code>*.obj</code>.
# Export the selection to <code>*.obj</code>.
# In the export settings: '''Faces''' — '''Triangles''' or '''Quads'''; '''Normals''' — enable; '''Texture coordinates''' — enable if there are textures; '''Shapes/Lines''' — enable if the scene has lines for fixtures; '''Flip YZ-axis''' — uncheck; material export — enable.
# In the export settings: '''Faces''' — '''Triangles''' or '''Quads'''; '''Normals''' — enable; '''Texture coordinates''' — enable if there are textures; '''Shapes/Lines''' — enable if there are lines for fixtures in the scene; '''Flip YZ-axis''' — uncheck; material export — enable.
# Save the model, the material file, and the textures in a single folder and import from there.
# Save the model, the material file, and the textures into a single folder and import from there.


The exporter reserves the first line of the resulting file for a service entry about itself — if you edit the file by hand, don't delete it: on import the first line isn't read, and anything you put in its place will be lost along with it.
The exporter reserves the first line of the resulting file for a note about itself — if you edit the file by hand, don't delete it: on import the first line isn't read, and along with it, anything you put in its place would be lost.


== What to Check After Import ==
== What to Check After Import ==


# Press '''Z''' in the '''3D View''' window with nothing selected — the camera will frame the whole scene. Create a cube sized '''1000''' × '''1000''' × '''1000''' next to it and compare: if a one-meter cube next to the facade looks like a one-meter cube, the scale is correct.
# Press '''Z''' in the '''3D View''' window with nothing selected — the camera will frame the whole scene. Create a cube next to it and set its '''Width''', '''Height''', and '''Length''' to '''1000''' each: if the one-meter cube next to the facade looks like a one-meter cube, the scale is correct.
# Look at the '''3D Objects''' list: are all the parts there, are their names readable, did the splines from the lines come through.
# Check the '''3D Objects''' list: are all the parts there, are their names readable, did the splines come through from the lines.
# Fly the camera around the model and look for holes where complex faces were and dark patches where normals were flipped.
# Fly the camera around the model and look for holes where complex faces used to be, and dark patches where normals are flipped.
# Make sure the objects aren't white or gray, if you exported materials.
# Make sure the objects aren't gray if you exported materials: a flat gray color means neither the material nor the texture was found.


Anything that doesn't match up is more reliably fixed in 3ds Max and re-imported: geometry can't be fixed with Light Stream's own tools, and a model fixed in the editor can also be reused in other projects.
Anything that doesn't line up is more reliably fixed in 3ds Max and re-imported: you can't refine geometry using Light Stream's own tools, and a model fixed in the editor can also be reused in other projects.


== What Else Will Be Useful ==
== What Else Might Help ==


* How the import itself goes and what to do with the model in the scene — [[Importing OBJ Models]].
* How the import itself works and what to do with the model in the scene — [[Importing OBJ Models]].
* Names, visibility, lock, and materials of imported objects — [[3D Objects]].
* Names, visibility, lock, and materials of imported objects — [[3D Objects]].
* Snap to vertices and the other buttons of the '''3D View''' window — [[3D Toolbar]].
* Snapping to vertices and the rest of the '''3D View''' window's buttons — [[3D Toolbar]].
* How to place fixtures along a finished model — [[Adding 3D Splines]] and [[Linking 2D and 3D]].
* How to place fixtures onto a finished model — [[Adding 3D Splines]] and [[Linking 2D and 3D]].

Latest revision as of 16:12, 3 September 2026

This article is about what a model needs to be like in order to land in the Light Stream scene at the right size, right side up, and without any loss. It uses 3ds Max as the example, but the requirements are the same for any 3D editor: what matters to the program is not what tool the model was made in, but what is written in the *.obj file. The import itself is covered in the article Importing OBJ Models.

A model for Light Stream should be prepared to be "clearer," not "prettier." There is no pretty rendering here: the program displays an object with simple flat shading and a single texture. On the other hand, snapping works off the model's vertices, and its objects become rows in a list you will be scrolling through for the whole project — so what matters most is correct scale, clean geometry, and meaningful names.

What Carries Over to Light Stream and What Doesn't

Carries Over Does Not Carry Over
  • Geometry — triangles and quads
  • The breakdown into objects and their names
  • Normals (shading and smoothing)
  • Lines — they become splines
  • UV unwrap (texture coordinates)
  • The material's base color and base texture
  • Modifiers, construction history, bones, and animation
  • Layers, groups, parent–child links
  • Smoothing groups by themselves
  • All maps except the base texture: bump, reflection, opacity, self-illumination
  • The second and subsequent materials of one object
  • Lights and cameras — these don't come through from *.obj
  • Vertex colors

Units and Scale

Coordinates are taken from the file as-is: there is no scaling dialog on import, so you can't adjust the size "on the way in."

The Light Stream scene is measured in millimeters: one unit of length in the file equals one millimeter. A facade 30 m tall should take up 30,000 units in the file, and a single pixel of an LED strip should be thirty to forty units. The easiest way to check the scale is with a cube created in the program itself: in the Properties window (Cube section), set its Width, Height, and Length to 1000 each — that's a one-meter cube — place it next to the model and compare.

In 3ds Max it's most convenient to work like this: set the system units to millimeters and model at real-world size — then nothing needs to be recalculated on export, and the scale factor stays equal to 1. If the scene was built in other units, set the scale factor on export: from meters — 1000, from centimeters — 10, from inches — 25.4.

A units mistake is the most common reason for "nothing visible" after import. A model exported in meters ends up a thousand times smaller than it should be and gets lost among the fixtures; a model accidentally scaled up a thousand times ends up kilometers from the origin, and the camera shows nothing but empty space.

Orientation

In the Light Stream scene, the Z axis points up — same as in 3ds Max. So in the OBJ export settings, the Flip YZ-axis checkbox (which swaps the axes for a Y-up convention) should be unchecked: with it enabled, the model will end up lying on its side in the scene. If the model does end up on its side, toggle this checkbox and export again.

Before exporting, it helps to reset transforms and position the model in 3ds Max exactly where it should end up relative to the origin: the position of objects relative to each other and the coordinates from the file are preserved in full on import.

Breaking Down into Objects and Naming

The file is parsed into separate objects, and each one becomes a row in the 3D Objects window with its own visibility checkbox, its own material, and its own lock. The rules are simple:

  • All geometry must belong to named objects. Anything written to the file before the first object is not imported.
  • Every object must have a name. An unnamed object or group cuts off the file reading: anything written after it will no longer make it into the scene, and the model will arrive half-finished.
  • Names must be in Latin characters, no Cyrillic. This applies both to object names and to the names of files the model references — the material file and textures. Cyrillic letters in them turn into a string of question marks on import, and a texture with such a name simply won't be found.
  • Don't name an object light. This is a reserved name: the geometry of an object with this name is treated not as scenery but as a light-emitting part — it's drawn not with its own material but as light, and it's invisible in the scene until the object is selected.
  • Break it down by meaning: "facade", "roof", "column_left". A model made of one solid piece will be a single row in the list — you won't be able to hide or recolor part of it afterward.
  • Don't overdo it in the other direction either: several hundred small objects turn the 3D Objects list into an endless ribbon that's inconvenient to search through.

Polygons

Light Stream reads triangles and quads. Faces with five or more vertices are silently skipped — their place in the scene will be a hole.

So in the export settings, in the Faces group, choose Triangles or Quads, not Polygons. Before exporting, collapse the modifiers and convert the objects to a polygon mesh: NURBS, patches, boolean-operation solids, and other uncalculated objects will either not make it into the OBJ at all, or will end up looking different from how they appeared in the viewport.

One more requirement for the geometry: don't export vertex colors. If the exporter appends the vertex's color to its coordinates on top of that, such a vertex won't be read at all, the vertex numbering will shift — and the faces will end up built from the wrong points: the model will arrive turned inside out or cut off partway through.

Normals

Normals must be written to the file — in the export settings this is the Normals checkbox. The program uses them to calculate shading: without normals the object isn't lit at all and stays in the scene as a flat black silhouette with no volume.

Smoothing groups by themselves aren't read, but there's also no need to set them separately: the exporter bakes the smoothing result into the normals, and the object arrives in the scene just as smooth or as faceted as it was in the editor.

Shading is calculated only for parts colored with a plain color. An object with a texture is drawn flat, without shading — normals don't affect it.

Light Stream has no backface culling — a face is visible from both sides, so a part turned inside out won't disappear. But a normal pointing away from the light kills the shading: such a face will be noticeably darker than its neighbors. If there are dark patches on the model after import, check the direction of the normals in the editor.

Lines for Fixtures

Lines written to the file arrive in the scene as ready-made splines — you can place fixtures along them right away, without manually tracing the edges. This is the most convenient way to pass strip, garland, and contour-lighting runs to Light Stream: you draw them as splines in 3ds Max exactly where they should go, and in the program all that's left is to link them to the mapping.

For the lines to come through:

  • enable their export — the Shapes/Lines checkbox in the OBJ export settings;
  • convert the splines to polylines with the required number of points: curves are written to the file as segments, and the smaller the step, the more points arrive in the scene;
  • join the segments into a single line. Each line in the file becomes a separate spline, so a run made up of unconnected segments will arrive as a scattering of short splines;
  • turn off the export of texture coordinates if the splines don't show up: some exporters append them to line entries too, and Light Stream skips such lines.

A spline's name is taken not from the line itself but from the object it's written inside — so it's worth grouping lines into separate, meaningfully named objects: "line_roof", "contour_window". Such an object itself won't appear in the 3D Objects list: if it has no faces, only splines arrive in the scene.

There's no need to make a separate object for fixtures: lights from 3ds Max aren't saved to OBJ at all. If you want to pass placed light fixtures to the program as well, export the model to *.fbx — from there, besides objects and splines, single fixtures come through too.

Materials and Textures

OBJ stores materials in a separate file next to the model, and textures are separate image files too — so enable material export and always move the model as a whole, the entire folder.

What you need to know about materials in advance:

  • One object — one material. A multi-component material (Multi/Sub-Object) carries over only one of its parts — the one mentioned last in the file — and that part is applied to the whole object. If parts of a piece need to be different colors, split the piece into objects by material.
  • Only the base color and base texture are taken from the material. Opacity, reflections, bump, self-illumination, and any procedural maps are ignored — it's better to "bake" them into a regular image, or not rely on them at all.
  • Textures are regular JPG, PNG, BMP, or GIF images. Put them next to the model or in a subfolder: the program searches for the file by name next to the model and in all nested folders. File names must be in Latin characters.
  • A texture needs a UV unwrap. An object without one will get the texture smeared into a single color.
  • There are no self-illuminating materials in Light Stream. If a part needs to look like it's glowing — a sign, a screen, a light line — enable the Glow checkbox for it after import, in the Material section of the Properties window.

Color, texture, and glow can also be assigned entirely by hand within the program, so for utility geometry you don't need to set up materials in the editor at all: an object without a material arrives gray.

Model Complexity

The model is embedded inside the project file in full, so its weight is the project's weight, its load time, and the load on the graphics card at every preview frame. Moreover, the mesh takes up more space in the program than in the editor: each face is stored together with its own vertices.

A reasonable minimum of preparation before export:

  • delete everything that isn't visible on the object: interiors, the underside, hidden parts, helper objects, duplicate copies;
  • remove small details that won't show up in preview: bolts, profiles, surface texture detail, one-millimeter bevels;
  • reduce the segment count on fillets and pipes — smoothness is expensive;
  • leave vertices where they're needed: Snap to Vertices works off them, and fixtures will land precisely on corners and edges. If a line of fixtures needs to run along a flat wall, add edges to the model along its borders.

Export Procedure

  1. In the 3ds Max scene, gather only what should go to Light Stream: the model itself and the lines for fixtures.
  2. Collapse the modifiers, convert the objects to a polygon mesh, delete hidden and unnecessary geometry.
  3. Check the object names: they must exist, and they must be in Latin characters.
  4. Check the dimensions and bring the model to the "one unit = one millimeter" scale.
  5. Export the selection to *.obj.
  6. In the export settings: FacesTriangles or Quads; Normals — enable; Texture coordinates — enable if there are textures; Shapes/Lines — enable if there are lines for fixtures in the scene; Flip YZ-axis — uncheck; material export — enable.
  7. Save the model, the material file, and the textures into a single folder and import from there.

The exporter reserves the first line of the resulting file for a note about itself — if you edit the file by hand, don't delete it: on import the first line isn't read, and along with it, anything you put in its place would be lost.

What to Check After Import

  1. Press Z in the 3D View window with nothing selected — the camera will frame the whole scene. Create a cube next to it and set its Width, Height, and Length to 1000 each: if the one-meter cube next to the facade looks like a one-meter cube, the scale is correct.
  2. Check the 3D Objects list: are all the parts there, are their names readable, did the splines come through from the lines.
  3. Fly the camera around the model and look for holes where complex faces used to be, and dark patches where normals are flipped.
  4. Make sure the objects aren't gray if you exported materials: a flat gray color means neither the material nor the texture was found.

Anything that doesn't line up is more reliably fixed in 3ds Max and re-imported: you can't refine geometry using Light Stream's own tools, and a model fixed in the editor can also be reused in other projects.

What Else Might Help