Where Was I?…

Exile came out 19 years ago.

And it was 2 years ago since I started this project.
And over a year since my last post.
This project isn’t dead, I promise.

The Bad, the Ugly, the Good, and the Lame

The Bad

There have been set backs and bumps in the road that keep me from spending anywhere near as much time on this as I would like. So this site has been sitting here like a log.

But I have been quietly working on things in the background whenever I could.

The Ugly

In the intervening time between posts I have vacillated to some degree about potentially ditching UE4.

The big roadblock I was hitting with Tomahna was in getting lighting and materials to match the original game. UE4 can create stunning visuals, but I am trying to do a recreation that is as close to a 100% visual reproduction of the original as possible. And I really feel like I’m fighting with Unreal. Lighting is such a critical element, and I don’t feel like I have good control of it with UE4.

Tomahna in UE4 (WIP)
This might look decent at this resolution, but at 1080p it looks rather ‘gamey’ compared to the original game’s visuals

I was also having trouble on the backend. Actual coding (not blueprints) in Unreal is painful. Getting a VR setup working correctly can also be painful. Unity is better for both. But Unity has significant drawbacks. Unreal is also such a massive, heavy, kinda bloated feeling engine. It takes forever just to load the editor, movement feels laggy and slow to respond even with test scenes.

I’ve been exploring Godot for the last year. It’s come a long way and I really like it at this point, but it’s not yet mature enough to be used for this project. But maybe when version 4.0 is released later this year… Stay tuned.

Frustrated by my lack of meaningful progress in getting the high fidelity visuals I wanted, I spent time focusing more on areas that not directly related to the original scope of this project (which was just those two little rooms in Tomahna).

The Good

Last time I posted I was still struggling with getting good results with photogrammetry, which is really important for a good recreation of the larger worlds from the game. Most of the software out there is not geared for panoramas, and I was trying to figure out how to roll my own solution.

Fortunately I finally did find (relatively) functional solution.
Agisoft’s Metashape (previously Photoscan).

I feel a little silly about it, since it’s one of the big names in photogrammetry software, and it support’s spherical (equirectangular) panoramas. A few years ago I was trying a whole bunch of different things. I remember attempting to use Photoscan. I tested out the feature using the panoramas from Tomahna (which needed to be reprojected) as well as the frames from the flyby. I got pretty terrible results, and became discouraged with Photoscan and moved on.

In hindsight I was clearly testing the feature with too small a dataset. And the compression from the frames of Tomahna’s flyby are particularly bad. So it’s not surprising (now) that I got such awful results. Garbage in, garbage out, as they say.

A little while after my last post, in a fit of frustration I did another survey of the photogrammetry software. Somehow after all this time, 360 panorama support is pretty dire (and forget directly using cubemaps). Reality Capture still doesn’t offer support for them, after years of rumors that is was an upcoming feature. Photoscan (now Metashape) still seems to be the only game in town that offers some kind of support for spherical cameras.

So I decided to give it another try. But this time I had a much larger data set. And this time I got much better results.

Enough talk, I think some pictures are in order.

Jnanin’s caldera as a pointcloud
But this isn’t even from this game!

The Lame

Unfortunately, this isn’t a silver bullet.

The whole process depends on a lot of redundancy between different views of the scene. It works quite well when the panoramas are situated in a scene in such a way that they are all surrounded by the same environment like inside a room, inside a chasm. But it simply doesn’t work if there are too few panoramas in a place (like Tomahna). When the panoramas are surrounding something large or in a daisy chain (a cave or passage, or transition from interior to exterior) it also breaks down. The result is a collection of different areas that need to be manually adjusted to relate properly to each other.

Additionally, Metashape seems unable to align still images with the nodes. I’m not sure if there is something I could be doing differently that might get it working. But as it stands it means FMV and flybys require an enormous amount of manual work to get the cameras where they are supposed to be, and it doesn’t benefit the reconstructed mesh as much as I think it otherwise could. As an example I can get all the panoramas in an area like the exterior of Jnanin automatically aligned, and I can get the frames of the flybys from Jnanin aligned with themselves, but getting them aligned together is requires manually marking reference points on each frame, which is tedious and takes a lot of time.

On top of that Metashape has the concept of a chunk (really just a collection of images that produce a model). Each section of a scene can have it’s own chunk, and they can be aligned. Which is great, that’s exactly what is needed for this project. But Metashape’s interface feels incredibly limited in how you can interact with the chunks. In fact I found myself needing to delve into making python scripts to do things that seem pretty damn basic.

It makes the process of aligning and orchestrating these different sections of a scene into a single whole rather painful. That needs to be completed before the reconstructions are finalized and used as a basis for the creation of new assets. For this project to move to the next level a large amount of manual work in Metashape will need to be completed.

I’m pretty sure it’s going to have to be dragged across the finish line.

19 Years Later

Today marks the 19th year since Myst 3 Exile was released. Happy Birthday!

This image has an empty alt attribute; its file name is exile_header.jpg

I would like to say thank you to everyone who worked at Presto for creating a great game.

Manual Camera Matching

I wanted to delve a little into the process I was using for reconstructing the scene from the game.

When doing a project like this, the most important things you want to know are:
-The positions of the original cameras that rendered the scene
-The positions of the surfaces in a scene.

Ideally Automation Would Be Used

When I first played with some photogrammetry software, and realized I could attempt to apply it to something like this, I was hoping to have an automated process that could give me the two things I really needed.

While the quality (rather the lack of it) of any automated reconstruction would prevent it from ever being used as an asset in a proper remake of a game like Exile, the value it holds as a guide in creating those proper assets is immense. It would save enormous amounts of time and effort, and help ensure the recreation is as close to the original as possible.

Unfortunately I haven’t been able to find a freely available process to perform such a reconstruction, or even properly calculate the camera positions using panoramic images (I’ll be posting more about that in the future).

What is freely available is geared more toward structure-from-motion (SFM) or massive collections of overlapping images from many vantage points. Even then it is rather tricky to get good quality.

This image has an empty alt attribute; its file name is myst_reconstruction-1020x518.jpg
A reconstruction of Myst created with VSFM from frames of the flyby video

When All Else False, Do It The Hard Way

So without an automated way to get the camera positions, I decided to do it manually.

Camera Matching Panoramas

This image has an empty alt attribute; its file name is TomahnaNode.jpg
Exile’s 360 panoramas were rendered as cube maps. Each node consisted of 6 images.

Step 1: Setup

  • For each node, apply the images to an inward facing cube, and stick a camera in the middle of the cube.
  • Set a viewport to look through that camera. Blender allows you to pan the camera that makes it feel rather similar to the original game.
  • I configure Blender so I can look at 4 different nodes at one time.
It’s a tight squeeze
  • The objects/meshes in the actual 3d scene can be xrayed/overlayed as wireframes. I can then use the original game’s images as full 360 backgrounds to work against.
  • I can move these node/camera setups freely around the actual 3d scene and adjust them as needed

Step 2: Camera Pose Recovery

This is the painstaking bit. Since Presto rendered all the nodes in Exile in the same orientation, it really comes down to working out the xyz location of each node. Even so, it’s a huge pain just to get that one aspect just right.

The goal is to put a shape in the scene representing a given object that appears in different cubemaps, and adjusting the position of those cubes/cameras so that the shape looks correct for each cubemap

There are a number of assumptions you can reasonably make in a scene like this. The floor is flat and in the same plane for the majority of the scene. Each node doesn’t seem to have any change in elevation. So I assume each node is on the same plane. I assume this plane is about 1.5 meters from the ground ( average eye level) so I set each node/camera at that height.

Then I designate a particular node as special, I keep it at the origin, and I will arrange the rest of the nodes relative to it to avoid things getting to crazy and out of hand (In this case I chose the one in the middle of the sunroom for convenience). So let’s call this Node A. So Node A has a position of (0, 0, 1.5).

I then outlined the pattern on the floor (which is at a height of 0 – where it should actually sit in the scene). I can look through Node B and see the same outline and the same floor pattern in the cubemap image (but from a differing vantage point). Then I slide the node around without altering it’s height (so laterally – in the x/y direction) until that pattern is properly aligned with it’s appearance in the background image.

This process works rather well in this case because I was able to make those assumptions about the floor. Otherwise, when you have changes in elevations between nodes, you end up with a bit of a feedback loop where you need use several different points of reference (say patterns/shapes on the ceilings, walls and floors) and adjust them until both you can get multiple points of reference to appear in the correct spots for each cubemap.

Step 3: The Fun Begins!

At this point, once you lock down the camera positions, it becomes easier to work out/ reason about the location of any given object in the scene. This can be rather painstaking itself, but I find it more fun. It was an interesting challenge creating the mesh for the sunroom’s dome, I used splines to extrude a shape and could twist and taper it along it’s height, and used that to create the branch like supports, the whole time seeing them overlayed on top of the original game images from multiple views, so I could verify I had the shape right as I was editing it.

Imperfect Process

Ultimately it’s a clunky and painful process. I decided to go for it since I only needed to work with 4 nodes. Once you have a significant number (say 20 or more) it becomes a very very difficult process to do this manually.

It feels like trying to solve a jigsaw puzzle where all the interlocking stubs on the pieces are just a few millimeters off, so you know you’ve got the right pieces, in the right general area, but you can’t get the whole picture to fit together.

It was reasonably suited for a scene like Tomahna, but I really want something better if I try tackling anything else in the game. (I’ll be posting more about potential solutions)

Been Busy II

Sorry, I’ve been distracted with personal stuff and other side projects for quite a while. Hopefully I’ll be able to spend some more time on this project.

Caliper Teaser

I modeled this back in June, and figured I’d do a quick render with Blender cycles. I just wanted to get more visual content on here. I’ve done a fair amount of work on many parts of the study and sunroom, but much of it’s not in a finished state (or doesn’t look as good as I want). Plus it’s easy to make something look good in cycles. It’s a little bit trickier in Unreal.

I’ll do a more detailed post on this a little later.

Here are the original versions for comparison.

(concept art, Exile, Revelation)

Been Busy

This site isn’t dead! I promise!

I’ve been busy with personal stuff for the last couple months, and I don’t always post while I’m working on stuff for this project.

Going to add a quick post of something I meant to post before, but didn’t get around to it.

A Few Website Tweaks

First, I added a proper contact page with a dedicated email, so someone can get a hold of me that way.

Next, added a new tools page to provide a quick list of any software I’m using.

Finally, decided to grab the domain TomahnaProject.com. I may switch that to being the primary domain for the site.

That’s all for now.

Extracting Assets

So a couple years ago I got a bit interesting in photogrammetry.

Here is my favorite video on a free way to do it.

At some point my brain realized that while this sort of thing wouldn’t work well for Myst/Riven, it might work for Exile/Revelation. So I started playing around and experimenting with running photogrammetry software on data from Exile. I’ll get into all that in another post.

One of the things I had a bit of trouble with when I first started working on this was getting the data from the original game.

Of course there is the old standby of Dragon Unpacker. DUP always worked fine for Exile. But since it just brute force detects the files (images/video) inside of the data files, they are all spit out sequentially. It requires having to wade through lots of stuff to find what you are looking for in Exile’s data.

Also, I wanted to take a good look at Revelations version of Tomahna (while they look similar, they are distinctly different). The trouble is that Ubisoft used nested .m4b files. DUP can open them, but bulk extraction never worked correctly. So you have to manually extract each nested file. It’s a pain.

On top of that, Revelation’s cube maps were broken into tiled grids of smaller images, and many of them were saved in a .zap format. These could not be read correctly by image software. So extracting full panoramas from Revelation wasn’t possible that way.

There was Revelator, but it’s not open source, and to my knowledge the author passed away.

Between my frustration and curiosity with the situation, one thing led to another, and I ended up writing my own program for extracting Exile & Revelation data.

Introducing the MYSTER Asset Explorer!

MYSTERAssetExplorer Github Page

I’ve released it under the MIT license. So have at it!

It’s still a bit rough, and there are some features I haven’t finished yet. I’ll revisit finishing this project at some point.

And if you have any pull requests, let me know!

How To Proceed

The scope of this project (for now) is limited to Myst 3’s version of Tomahna.
I will be following Starry Expanse’s lead and using camera matching and UE4. It will be VR enabled (definitely for Vive).

Now, if I’m being honest I kinda hope this project could possibly one day turn into a sister project to Starry Expanse for purposes of a realtime recreation of Exile.

Trouble with that idea is of course the rights to the game. At the time I was involved with Starry Expanse we had no idea if Cyan would approve or not. It was problematic to spend time working on something knowing that with one email it could all be for not, and was a big factor in my leaving Starry Expanse.

Back then it was nearly impossible to communicate with Cyan.
It took forever for Starry Expanse to become legitimate. And Cyan owned Riven. Completely. To say nothing of the fact that they have NEVER had even the slightest interest in making realRIVEN themeselves (I have chat logs from RAWA saying so in 2003!)

So I’m fully aware of how complex a situation it must be when Presto (long defunct) and Ubisoft are involved. Sure Myst’s 25 anniversary kickstarter has the rights for rereleasing the original games, but it’s unlikely that would extend to allowing for a full 3d recreation. Honestly, I don’t know what is possible with any of that.

What I do know is I have been particularly interested in recreating Tomahna.  Not sure why exactly, but I tried to once, a LONG time ago. And I thought it was time to dust it off, and try again with the newer, fancier tools and skills I have now. If this turns into something bigger, yay!

But until then, this will just be a showcase passion project.

The upcoming posts will be covering things I’ve already done up until now.

But here is a teaser of things to come: