Language agnostic 存储a";常规;在给定一些输入的情况下,会生成一个三维模型

Language agnostic 存储a";常规;在给定一些输入的情况下,会生成一个三维模型,language-agnostic,dynamically-generated,3d-model,Language Agnostic,Dynamically Generated,3d Model,嗯,这是一年中我忙于我的下一代尖端研发项目的时候了(只是为了好玩…也许最终会有一些利润) 这一次,我对服务有了一个很好的想法,不幸的是我不能详细说明 但是,该项目的一个主要部分是能够根据某些输入标准生成三维模型。生成的模型在每一代上必须不同 因此,这与游戏中使用的静态模型有很大不同——我认为我必须存储实际代码,而不仅仅是模型坐标 要给出一些输出的示例,请执行以下操作: var apple = new AppleGenerator(); apple->set_size_between(30,

嗯,这是一年中我忙于我的下一代尖端研发项目的时候了(只是为了好玩…也许最终会有一些利润)

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

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

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

要给出一些输出的示例,请执行以下操作:

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
因此,我需要在这里解决一些问题:

  • 如何将这些模型存储为数据
  • 你知道有什么有用的工具吗
  • 我需要加入一个随机因素(例如,每次苹果的形状都会略有不同)
  • 我想数学在这里会起到很好的作用,但是因为这些是复杂的形状,为每个模型编写必要的公式是不可行的,对吗
  • 此外,纹理必须与模型的每个部分相关,并使模型看起来随机(例如,对于生成的苹果,我可以详细说明40%到60%的红色,其余的绿色)

  • 这其实不是一项简单的任务。根据您试图创建的对象的复杂性和多样性,解决方案会有很大的不同

    我们考虑几个例子:

    对象或多或少是已知的:

    最简单的情况是,以传统的方式创建一个3d模型,然后将其随机化一点。以苹果为例。随机化可以从苹果的大小到它的纹理颜色,再到对水果的伤害

    可以使用NURBS曲面描述所有对象:

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

    对象具有旋转对称性:

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

    关于纹理 这比网格生成要复杂得多。这主要是因为纹理比网格承载更多的信息(它们更详细)。您可以有许多纹理生成策略。在苹果的例子中,你可以选择几个顶点,给它们颜色(一个红色,一个绿色,另一个红色等),然后插值其他顶点的颜色。这创造了一个平滑的颜色过渡,在苹果上看起来很漂亮。然而,如果你正在制造一把刀,那看起来很糟糕

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

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

    这实际上不是一项简单的任务。根据您试图创建的对象的复杂性和多样性,解决方案会有很大的不同

    我们考虑几个例子:

    对象或多或少是已知的:

    最简单的情况是,以传统的方式创建一个3d模型,然后将其随机化一点。以苹果为例。随机化可以从苹果的大小到它的纹理颜色,再到对水果的伤害

    可以使用NURBS曲面描述所有对象:

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

    对象具有旋转对称性:

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

    关于纹理 这比网格生成要复杂得多。这主要是因为纹理比网格承载更多的信息(它们更详细)。您可以有许多纹理生成策略。在苹果的例子中,你可以选择几个顶点,给它们颜色(一个红色,一个绿色,另一个红色等),然后插值其他顶点的颜色。这创造了一个平滑的颜色过渡,在苹果上看起来很漂亮。然而,如果你正在制造一把刀,那看起来很糟糕

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

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

    看看用于编码孢子的一些基本建筑原则,孢子是一款关于生物进化的电子游戏:

    下面是一个如何用XML序列化网格的示例,以及一些随机变形行为:

    要使您的苹果都有点不同,您可以应用随机变换(或变形)。例如,请参见:

    查看以下内容: