[

](kaveh808.medium.com/?source=pos…)
6月8日
-
3分钟阅读
[
拯救
28.这不就是超人居住的地方吗?

Mike和我认为,我们可以通过设计一个比外面的任何东西都要先进的3D系统而有所作为。在Softimage工作过后,我们相信我们可以做得更好。只有我们两个人。
这个想法并不像它听起来那样牵强。毕竟,Softimage是由四个程序员开发的,而我们是其中的两个。我们有这个。请再来点茶。
系统的设计在我们周末的午餐会议上开始成形。我做了大部分的谈话,而迈克(他说话有困难)通过在他的Tandy TRS-80 Model 100上打字来表达他的观点,那是一台早期的带有8行液晶显示屏的笔记本电脑。如果他特别喜欢一个想法,他也会笑着竖起大拇指。
我希望我有那些会议的设计文件,但2007年的一场房子大火毁了一切。
我们的系统将由建模、动画、渲染和绘画模块组成。它将是可扩展的,所以技术用户可以利用系统的全部功能。我们使用Symbolics的S-packages作为扩展性的黄金标准。
我提出了我在Neo-Visuals时代的一个想法:智能对象的想法,用户可以像电影导演一样与之互动,而不仅仅是像传统的动画师那样逐帧地进行。迈克对这个想法竖起了大拇指。
物体将有内部逻辑,能够计划和执行自己的动作。一个人类角色会知道如何坐、站、走、开门,并根据既定目标制定计划。我希望能够告诉一个角色 "从冰箱里拿一杯饮料",并让它计划、排序和执行动画。
如果没有雄心壮志,我们就什么都不是。为了记录在案,我仍然认为这个想法是有价值的。
我们把我们的公司称为Metropolis Graphics。

设计与代码
上面的图片是由几个不同分辨率的圆圈组成的。让它们变得有趣的是,如果它们的任何一个槽发生变化,这些形状会自动重新计算它们的点,正如代码列表中所示。
我想要一个实现程序性几何的机制,这意味着一个物体的某些槽取决于其他槽。
经过一番思考,我植入了procedural-mixin 类。我想我真的是在拥抱CLOS的多重继承了。事实上,我已经决定尽可能多地利用对象系统(以及一般的Common Lisp)的功能。我想知道我可以用读者宏做什么。
这种依赖机制是用一个混合类和访问器上的方法组合来实现的,所有这些都被包裹在宏里。
每个由def-procedural-input 定义的 "输入 "槽在其setter上都有一个after方法,用来设置mixin的dirty标志。而每个由def-procedural-output 定义的 "输出 "槽在其getter上有一个before方法,如果dirty标志被设置,则调用mixin的计算方法。
我很想知道这个设计是如何维持的,以及我是否可以将它扩展到不同对象之间的依赖关系。
我也很想知道这是否可以在其他语言中以更简单的方式实现。