Mods / World Exporter

Tags:
Utility
Authors:
_Durus_, Joegen
Side:
Client
Created:
Jun 8th 2025 at 2:59 AM
Last modified:
May 2nd at 3:31 AM
Downloads:
240
Follow Unfollow 60
Latest release (for Vintage Story 1.22.0-pre.1 - 1.22.1, potentially outdated):
WorldExporter-v0.3.2.zip  1-click install

Do you want to 3D print your cozy cottage? Perhaps you want to make a Vintage Story animated short but need assets? Now you can!

This is a client side mode that takes the ingame chunk meshes and exports them as a 3D format to be used elsewhere.

Features

  • Client commands to export a region of the world terrain. (Blocks not entities)
  • Formats:
    • STL
    • Wavefront OBJ

Current Limitations

  • Does not export meshes being rendered with their own renderer. (i.e. Mechanical blocks, etc.)
  • Currently exports on a per chunk resolution. (i.e. can't export parts of chunks)

Other Feature Ideas

Blender importer incoming.

Below are some ideas for things to add.

  1. Optionally ignoring certain blocks.
  2. Optionally ignoring transparency on specified blocks.
  3. Optionally exporting Entities.
  4. Better export control
    • Probably implementing a GUI, keybinds, or wand item to specify the region, options, and moment of export.
  5. Exporting standalone block and item meshes.

Usage

First, set the output directory. You can do this in the client mod config, or by using the command ".wexporter directory C:\path\to\directory"

You can see the set directory by just running ".wexporter directory".

Exporting is done using the ".wexporter export" command. There are two modes for exporting a cube: "around" and "within".

  • "Around" will export a cube of the given dimension around the given coordinate.
    • For example: ".wexporter export around p 10 5 10" will export all chunks containing a 10x5x10 cube around the player's position.
  • "Within" will export a cube using the given start and end coordinates as opposing corners of the cube.
    • For example: ".wexporter export within p -52 156 24" will use the players position as one corner and "-52 156 24" as the other corner.

 

If you just want to export the chunk you are standing in, you can run a quick ".wexporter export here".

 

Since you may want less mesh than the entirety of a chunk, you'll probably have to trim the mesh down to your liking using another tool like Blender.

Notes

 

If anyone has any 3D prints, renders, or animations they want to share, I'd love to post them here! :D

Regarding OBJ Exports

When exporting an OBJ, each render pass is exported as an object— except the top soil. In the game top soil has special rendering where the grass texture is overlayed on the dirt texture. This is so that the game can render the grass texture based on the seasons, climate, rainfall, etc. (It's what makes the grass look so pretty!) This overlay texture actually starts out as a grayish green and is then tinted in a shader. Recreating this effect perfectly in an export would be difficult and annoying. (To my understanding...) Instead, the topsoil is exported as two seperate objects with the grass overlay slightly higher than the soil and with different materials. This is so that you can post process the grass overlay material however you'd like to achieve whatever grass effect you want. If you come up with a shader or effect for whatever program, feel free to share it with me an I can link it here for others.

Mod Version Mod IdentifierFor Game version Downloads Released Changelog Download 1-click mod install*
0.3.2 worldexporter
1.22.0-pre.1 - 1.22.1
41 May 2nd at 3:31 AM WorldExporter-v0.3.2.zip 1-click install

Same as 0.3.1. Rebuilt for 1.22.

0.3.1 worldexporter
1.21.0-pre.1 - 1.21.7
9 May 2nd at 2:48 AM WorldExporter-v0.3.1.zip 1-click install

Fixed bug where blocks that specified a LOD0 or LOD2 mesh where being dropped.

0.3.0 worldexporter
1.21.0-pre.1 - 1.21.7
11 Apr 25th at 12:41 AM WorldExporter-v0.3.0.zip 1-click install

Complete overhaul of tessaltion approach.

  • Old: manually retessalate each block and export it in it's position
  • New: reuse game tessalation code to retessalate entire chunks. 

 

This means blocks, UV mapping, texturing, face culling, etc. is done in the same way the game does it. This means the top soil, opaque, liquid, transparent, opaquenocull, etc renderpasses are all utilized.

Will probably add back the old method since this might not always be desirable.

However, this means getting exporting an OBJ working was much easier.

0.2.0-pre.1 worldexporter
1.21.0-pre.1 - 1.21.6
24 Feb 22nd at 11:31 PM WorldExporter-v0.2.0-pre.1.zip 1-click install

Added experimental support for .obj/.mtl (Wavefront) files. Simply append "obj" to the end of export commands. (if omitted, "stl" is assumed)

This only handles the base render pass of the game. Things like grass, liquids, etc. won't export properly.

 

Working on a somewhat significant rework to get everything else working.

0.1.1 worldexporter
1.21.0-pre.1 - 1.21.6
70 Dec 21st 2025 at 8:02 PM WorldExporter-v0.1.1.zip 1-click install
  • Updated for usage with 1.21+.
  • Added configurable output directory.
0.1.0 worldexporter 85 Jun 8th 2025 at 3:02 AM WorldExporter-v0.1.0.zip 1-click install

Initial Release

  • Two client commands to export a region of the world.
  • Exports Block and BlockEntity meshes. 

16 Comments (oldest first | newest first) (threaded | flat)

Corviboy, May 29th at 1:08 AM (modified May 29th at 4:01 AM)

When exporting as OBJ, it seems that something weird happens to the normals. Topsoil objects have the correct normals, but the opaque objects have normals that are skewed upward, and the rest of the objects have normals that point straight up. You can see this in blender by importing an OBJ, and, in the shader editor, add a geometry node and plug the Normal port into the surface output.
A workaround to fix this in blender is to select an object with normals you want to fix, go into edit mode by pressing Tab, select all by pressing A, then press Alt + N and select "Reset Vectors". Also make sure all faces are shaded flat by going back into object mode, selecting all, right clicking, and select "Shade Flat"
Edit: Changed instructions for fixing in blender. It might work now. Good luck

Bjorn0411, May 2nd at 11:03 AM (modified May 8th at 1:29 PM)

_Durus_ and id be happy to show any details you wanna see! you can hit me up on discord at "Bjorn0411", im on the VS discord server.
and yeah, ive taken the time to manually select basically all the grey parts of the texture atlas, and give them a green color, which wasnt tooo bad, just need to do it once and now I can reuse it as much as I want. It's only really a mild inconvenience now as it means I can only really represent summery greens without editing the atlas again. But right now I dont intend to do anything else anyways.

The real issue ive found is how much it sometimes culls the scene thats being exported. This can sometimes lead to extremely broken scenes, especially underground, from missing cave ceilings to sometimes being nothing more than a garbled mess

You mention youre gonna rewrite it once more, and im happy to see youre keen to make this mod the best it can be! Perhaps looking at how mods for minecraft does this can help? afaik they tend to read the map file rather than doing a gpu rip like you do.
Anyways, I think a really shoddy "hack" could be that, similar to "mega screenshots" in the game cranking the settings to maximum, taking the picture, and then returning to normal. Perhaps you could "disable" the face culling code in the renderer, create the export, then re-enable it?

EDIT: So people know, Durus has fixed my issue with poor culling, so thats all good!

_Durus_ , May 2nd at 3:41 AM

Bjorn0411 Looks great! Would love to see the finished product. :D
Mmmmmm. I will think about how that might work. Currently the mod reuses alot of game code to tesslate the meshes. The game tessalates bushes together with other opaque blocks in the same renderpass so I can't think of a way to seperate out specific blocks without significant patching. I'm thinking about rewriting instead of reusing this code so there is more control over how it is exported. (all blocks of the same type exported as one object/material, each block exported as it's own object, etc.)

Of course you could tint the particular sections of the atlas png, but I can see how that is a rough workaround. This might be easier if it could export FBX files?

 

DeadpanGod3 

The missing details/blocks should be fixed in 0.3.1/2! I had misunderstood how level of detail meshes work...

Interesting about the size limitation. I have given zero consideration to speed and memory performance. Been focused on functionality. Now that I think OBJ export is pretty solid, going to work on those kinds of improvements. For example, letting it export in the background and processing chunks serially. (Which should fix the export size issue)

DeadpanGod3, Apr 28th at 2:04 AM

_Durus_
Bravo! Wonderful work! Having materials exported with the world is a massive timesaver.

Seems to be mostly working so far! the only two issues ive encountered so far is having the OBJ exporter miss (skip? forget?) sloped shingle roof blocks in its export (red clay specifically in case it matters), I'm not sure if there are other blocks that are missed but thats the only one i've encountered so far in a couple quick tests.

The only other issue I encountered (not sure if this counts or is just me pushing the mod beyond it's intended limits) is exporting OBJ's with a diameter above 500 blocks results in the corners being rounded off and sizes beyond that will just be the same size as the 500 size one but with its origin moved off diagnally depending on how big it is.

Overall it works amazingly and both can be worked around. Thank you for your amazing work!

This was made before the update but I wanted to show a render I was able to make with the help of your mod:
Bjorn0411, Apr 25th at 9:21 AM

also, one humble request.
Youve made it so that the grass layer is a separate material so we can apply the colour ourselves, this is excellent, a solution that works absolutely perfect for me. But itd be lovely if the same mechanism was applied to shrubery like tall grass and leaf blocks, aswell!

Bjorn0411, Apr 25th at 9:13 AM (modified Apr 25th at 9:15 AM)

Thank you so much for these tools! This is something ive been desperately hoping you would add ever since you first uploaded the mod!
Heres a quick image render I did in about an hour or two from clicking export ingame. Its excessively dark but thats due to post processing during the image export that I cba with fiddling with at this point.
I'll probably shop around for better scenes to work with later, and maybe finally finish my Forlorn Hope armor set for the dragon fella I put into the image :P

Thanks again! im so happy you went the extra mile and made a tool thats really useful for us 3D artists!

Image inside spoiler so it doesnt cover 90% of the comment section lmao

Test render with the World Exporter tools
_Durus_ , Apr 25th at 1:43 AM

Craythray Cylli_Billi

0.3.0 contains a significant rework that should sidestep most of these issues.

_Durus_ , Apr 25th at 1:20 AM (modified Apr 25th at 1:51 AM)

MIGITO Joegen DeadpanGod3 EndlessOats
Sorry for the radio silence! I had my head down working on this, other projects, and life! I hadn't realized there were more comments about wanting textures, would have hustled a little more...

Excited to say that I have Wavefront OBJ working! Texturing and proper transparency is now doable. (See the new pictures above)

Please let me know if it's working!

 

I decided to significantly rework my approach as I was essentially re-coding the same thing that the game does to create chunk meshes. So I decided to just reuse game code for now which made textures and internal faceculling much easier— at the cost of being locked in to how the game renders things... So adding configuration for how it exports may be harder in the future.

 

Joegen

Thank you for the valuable feedback! :)

I made this mod because I love 3D printing, and thought it was a shame you couldn't 3D print Vintage Story worlds. Then started getting DMs about textures, animating, and rendering... which I have probably 10 hours of experience total in. So I am quite unfamiliar with those workflows. Some questions:

  1. How important is it for animation to have the full block mesh? No culling? Is there much of a need to "split open" the terrain where these details are necessary? I guess I'm asking if it's important to have the option to export un-culled terrain meshes. If the desire is to just have a certain model that can be animated, would a simple `.wexport export object quern-granite` be useful for getting a standalone mesh of a particular item/block?
  2. The USD-type workflow is a good idea (I had just done this quick and dirty before), but now that it uses the games tesselation pipeline, will hopefuly be able to sidestep this optimization. This comment was for optimization correct? Doesn't change outward features?
  3. Regarding an "add" option, yes! Will be doing this. However, since there already exists "world export" commands (which just save the world) if I'm gonna do a command refactor, I was thinking of just co-opting these commands (I think it's possible?) which do indeed have the "add" workflow. Mmmmmm.
  4. Would also like your opinion if my handling of exporting the grass overlays is adequate. See notes in description.

 

And yes I absolutely welcome any help! I can make you a contributor. I made this on a whim to learn some graphics programming and give my fellow 3D printing fans a tool, but I don't have much experience with, and lack the motivation for, rendering and animation tooling. I would love help with regard to what the heck "DCC import" is and more insight into the workflow for those who want rendering and animation tooling! :D

EndlessOats, Apr 12th at 5:37 PM

DeadpanGod3 Joegen Agreed immensely, I hope it's at the top of the priority list here because I would love to be able to make animations and such using actual story structures instead of having to build them from scratch in blender. Awesome tool already though 

Cylli_Billi, Apr 7th at 8:21 PM

When i export an model that contains anything other than cubes its just a string of meshes

DeadpanGod3, Mar 10th at 11:56 PM

Joegen

Seconding this as someone who has also been using this as an exporter to Blender for rendering, exporting textures as an option would be at the top of my wishlist.
I'd also be interested in this setup you've mentioned as i'm still in the learning stages and curious as to what it entails exactly.

Joegen, Mar 7th at 1:41 PM

Great work! The stuff I tested really came out clean.

For 3D printing, it's perfect and super easy to clean up and make stuff manifold, then print. Though it requires a lot of effort to turn an export into a fully animated short because there are no UVs or IDs for the blocks.

I've been building pipelines around other block-based stuff solely for animation and "offline" rendering (trailers, etc.). I have a few suggestions if you want to make it a fully-fledged exporter for any pipeline:

First off, something that might help tick of the first box in your "other feature ideas"

  • Export stuff that has alpha with UVs and the texture (or at least a JSON for the texture name). This would allow the user to edit the mesh and cut out the alpha with Geometry Nodes. (I actually have a setup in Blender for cutting out alpha from a texture to the mesh, which I can hand over/publish).

 

  • Focus on a USD-type workflow for scalability. This would be complex to begin with, but it would be incredibly robust for anything. Every block gets written as a primitive to be instanced. These instances would have UVs and a material with the texture assigned to them. Then the instancer distributes these blocks on points with block properties, ID, Index, Rotation, and Scale (if any), which is info that the VS engine already houses.

    • You could have an instancer per chunk to optimize the export a bit. Though it's best if there are no duplicate primitives for workflow purposes. First finding out what blocks exist in an export, assigning an ID, and then creating the instancer might be a better idea. (Mineways does it the other way around, which creates duplicate primitives since, if the same block is in another chunk, it assigns a different ID to it).

 

  • You could add an "Add" option instead of a GUI or Wand to begin with. This would let the user define multiple regions and then export them all at once. This would be great for flying around in a cave, adding the 20 blocks around you, going to the next point and adding again, and then running the export. Tunnel networks or narrow, dungeon-like places would be super easy to export like this.

 

I'm just babbling at this point..

If you want to expand this project, I can help out with the DCC import and cleanup end, like Houdini or Blender (perhaps Blender so that it's accessible to everyone). I have near to no knowledge on how to compile a mod for VS, so I might be talking out of my bum saying all of this though.

Craythray, Dec 25th 2025 at 10:43 AM

Importing a Underground cave results in the inbetween faces being connected resulting in faces "webbing" all of the cave. Any fix for this?

MIGITO, Aug 11th 2025 at 10:40 PM

Does this mod export the model textures as well?

SaltyWater, Jun 8th 2025 at 3:50 AM

DAMN how the hell did you managed to do that