33. Hindsight Can Also Be Myopic
Long story short, we failed to get funding for our project and Metropolis Graphics withered on the vine, nothing more than the pipe dream of two idealistic developers.
I could muse at length as to why that was, but basically I had no business sense (and thirty years on there is very little evidence that things have changed in that regard). We spent all our time on the software and then gave a couple of presentations to companies we thought might be interested in the project. And they weren't. Could probably be taught in business school as a classic case of how not to run a startup.
Having said that, I can’t help but think how we could have done things differently. So, gentle reader, please indulge me.
On the tech side, the Mac simply wasn’t a viable platform for serious 3D applications. We could have used Common Lisp on the SGI platform, either AKCL or a commercial offering. The renderer and low-level vector and matrix code would be written in C. Much of that work was done anyway.
Working in a vacuum was another mistake. We should have involved potential users early on. Today, this is reflected in the startup mantra of “release early, release often”. We would have approached CG production houses we had connections to and provided them with the system in exchange for testing and feedback.
A near-term feature focus might have been a useful differentiation tool. Rather than tackle ambitious open-ended “smart object” ideas, we could have focussed on useful things that I had experience in and which were ahead of other commercial systems. Things such as facial animation, hair, fur, and cloth simulation.
Finally, I would have approached some business people early on and asked them on board as advisors, so we would be ready when we needed to raise financing.
One small thing that I have learned since then is that tech without marketing goes nowhere. I used to believe all you needed was a better mousetrap. Naive in the extreme.
As a sad coda to all of this, a few months later Mike passed away peacefully in his sleep. I recently discovered this link which talks about his life.
Design & Code
The image above shows an application of last post’s code. It depicts a branching particle system growing along the surface of a polyhedral model. A cow, to be precise.
Previously, I implemented
procedural-mixin to allow “output” slots of a class to depend on “input” slots. I wrote the
dependency-node-mixin class shown above to allow the same sort of connection between objects of different classes.
After some consideration, I decided on a scheme using timestamps to indicate when an object has been modified. I assume this may run into problems on a distributed system (where host clocks might not be in sync), but we’re not there yet.
One use I have put this feature to is implementing group classes which update when one of their children is modified. The class
manager-groupacts as an abstract superclass for such classes.
On a side note, having uploaded my code to Github, the other day I received my first pull request. A developer from Germany was kind enough to organize my code to use the ASDF system definition facility. I merged his changes into the code and now feel generally more organized.