1

嗯,现在是我忙于我的下一代尖端研发项目的一年(只是为了好玩……也许最终会获得一些利润)。

这一次,我对一项服务有了一个很棒的想法,不幸的是我不能详细说明。

但是,该项目的主要部分是能够根据某些输入标准生成 3d 模型。生成的模型在每一代都必须不同。

因此,这与游戏中使用的静态模型有很大不同——我认为我将不得不存储实际代码而不仅仅是模型坐标。

举一个输出的例子:

var apple = new AppleGenerator();
apple->set_size_between(30, 50); // these two numbers are just samples...
apple->set_seeds_between(3, 8); // apple must have at least 3 seeds*
var apple_model = apple->generate();

// * I realize seeds may not be exactly part of the model, but I can't of anything else

所以我需要在这里解决一些问题:

  1. 如何将这些模型存储为数据?
  2. 你知道任何可能有帮助的工具吗?
  3. 我需要加入一个随机因素(例如,苹果每次的形状都会略有不同)
  4. 我想数学在这里会起到很好的作用,但由于这些是复杂的形状,为每个模型制定必要的公式是不可行的,对吧?
  5. 此外,纹理必须与模型的每个部分相关,以及使模型看起来随机(例如;我可以为生成的苹果详细说明 40% 到 60% 的红色,其余部分为绿色)。
4

3 回答 3

2

看一下用于编码Spore的一些基本架构原则,这是一款关于进化生物的视频游戏:http: //chrishecker.com/My_liner_notes_for_spore

这是一个如何对网格进行 XML 序列化的示例,以及一些随机变形行为:http ://www.ogre3d.org/tikiwiki/Morph+animation#The_XML_format_of_meshes_with_morph_animation

为了让你的苹果有点不同,你可以应用随机变换(或变形)。参见例如:http ://wiki.blender.org/index.php/Doc:2.4/Manual/Modifiers/Deform/MeshDeform

于 2012-03-28T22:46:12.937 回答
2

这实际上不是一个简单的任务。根据您尝试创建的对象的复杂性和种类,解决方案会有很大差异。

让我们考虑几个案例:

对象或多或少为人所知:

最简单的情况是,以常规方式拥有一个 3d 模型,然后将其随机化。以苹果为例。随机化可以从苹果的大小到它的纹理颜色再到水果损坏。

您的所有对象都可以使用 NURBS 曲面来描述:

在这种情况下,您需要存储足够的数据才能生成表面,当然这些数据可以随机化一点。

您的对象具有旋转对称性:

在这种情况下,生成一条曲线并围绕 a 轴旋转它可以给您一个形状。苹果就是一个例子。您只需要存储曲线数据,形状随机化可以在曲线上(保持对称)或最终网格上完成。

关于纹理

这比网格生成要复杂得多。这主要是因为纹理比网格承载更多的信息(它们更详细)。您可以有许多纹理生成策略。对于你的苹果,你可以选择几个顶点,给它们颜色(一个红色,一个绿色,另一个红色等)并插入其他顶点颜色。这会创建一个平滑的颜色过渡,在苹果上可能看起来不错。但是,如果您正在生成一把刀,那看起来很糟糕。

在大多数情况下,您需要知道网格的哪一部分代表什么,并逐部分生成纹理。在上面的刀示例中,您可以分两步生成网格;刀片和处理每个部分的纹理分别生成。

结论

当然,您可以混合使用这些。一个meshGenerator类可以获取数据并根据它们的类型生成相应的网格。对象创建的第一个解决方案可能是最合适的,因为任何复杂的对象都可以通过其三角形而不是 NURBS 更容易地定义。

于 2012-03-28T22:45:21.270 回答
1

您想使用已建立的文件格式来避免奇怪的问题。它更像是几何而不是纯数学。您的 generate 函数将绘制多边形,然后您的 save 方法将与格式交互。

https://stackoverflow.com/questions/441388/most-common-3d-model-format

于 2012-03-28T23:30:26.437 回答