【问题标题】:Procedural Planet Spherical Mesh Deformation C# Unity 5程序行星球面网格变形 C# Unity 5
【发布时间】:2015-03-08 23:33:52
【问题描述】:

我一直陪伴着人们发布许多问题和你们给出的所有答案,遵循了几个教程,并且由于我的谷歌搜索上的所有链接都被标记为“已经访问过”,我决定把我的骄傲放在一边,给你发一个问题。

这是我的第一篇文章,所以我不知道我这样做是否正确,如果没有,抱歉,无论如何问题是这样的:

我正在 Unity 5 上的 C# 行星探索游戏中工作,我已经按照此处提到的一些教程从八边形构建了一个球体,并且还可以使用它们构建 perlin 纹理和高度图,问题开始将它们应用到球体并在网格上生成地形,我知道我必须映射球体的顶点和 UV 才能做到这一点,但问题是我真的很擅长数学而且我找不到任何一步一步,我都听说过 Tessellation 着色器、LOD、voronoi 噪声、perlin 噪声,并且在这个过程中迷失了方向。为了简化:

我有什么:

  1. 我有球形网格

  2. 我有高度图

  3. 我已将它们与适当的法线贴图一起分配给材质

我的想法; (老实说,我不知道这是否是正确的道路)需要帮助:

  1. 根据高度图生成球形网格变形的代码

  2. 如何使用那些基于 Tessellation LOD 的着色器等来制作真实大小的程序星球

非常感谢您的关注,如果我粗鲁或要求太多,我们深表歉意,但是您可以提供的任何帮助都会对我有很大的帮助。

【问题讨论】:

    标签: c# unity3d mesh procedural


    【解决方案1】:

    我真的不认为我有能力为您提供代码特定信息,但这里有一些针对您的清单的补充/建议。

    • 如果您想设置 LOD 网格和纹理系统,我知道的唯一方法是准系统方法,您可以在物理上创建网格和纹理的低多边形版本,然后在 Unity 中编写一个脚本,其中您有一系列距离,一旦玩家到达某个距离或接近对象,切换到适合该距离的网格和纹理。我认为您可以通过编写一个可以做同样事情的着色器来做同样的事情,但基本思想保持不变。下面以一些伪代码为例(我不太了解Unity库):

      int distances[] = {10,100,1000}
      Mesh mesh[] = {hi_res_mesh, mid_res_mesh, low_res_mesh}
      Texture texture[] = {hi_res_texture, mid_res_texture, low_res_texture}
      
      void Update()
      {
           if(player.distance < distances[0])
           {
               gameobject.Mesh = mesh[0]
               gameobject.Texture = texture[0]
           else
           {
               for(int i = 1; i < distances.length(); i++)
               {
                   if (player.distance <= distances[i] && player.distance >= distances[i-1]):
                   {
                       gameobject.Texture = texture[i]
                       gameobject.Mesh = mesh[i]
                   }
               }
           }
       }
      

    如果您想要更难编码的真正基于 Tesselation 的 LOD:这里有一些链接:

    https://developer.nvidia.com/content/opengl-sdk-simple-tessellation-shader

    http://docs.unity3d.com/Manual/SL-SurfaceShaderTessellation.html

    基本相同的概念适用。但是,您无需在物理上更改您正在使用的网格和纹理,而是在程序上更改网格和纹理,使用与在着色器代码中更改网格和纹理的分辨率的设置距离相同的想法。

    • 关于球形网格变形的问题。您可以在 3dsMax、Maya 或 Blender 等 3d 编辑软件中执行此操作,方法是导入网格并应用网格变形修改器,并将纹理用作变形纹理,然后根据自己的喜好更改变形级别。但是如果你想实时做一些更程序化的事情,你将不得不使用顶点数组物理改变网格的顶点,然后重新三角化你的网格或类似的东西。对不起,我对这个话题不太有帮助,因为我对此知之甚少。以下是我能找到的与您的问题相关的链接:

    http://answers.unity3d.com/questions/274269/mesh-deformation.html

    http://forum.unity3d.com/threads/deform-ground-mesh-terrain-with-dynamically-modified-displacement-map.284612/

    http://blog.almostlogical.com/2010/06/10/real-time-terrain-deformation-in-unity3d/

    无论如何,祝你好运,如果我对某些事情不清楚或者您需要更多解释,请告诉我。

    【讨论】:

    • 您的回复先生,但不幸的是,我需要的正是您所说的困难部分,因为我正在尝试实时构建真实大小的行星,所以我真的需要那些教程代码,不能使用搅拌机之类的,因为这是玩家将要操作的工具的一部分=/
    • 我可能会在空闲时间花一些时间在 Unity 中玩代码,直到获得理想的结果,但这可能需要一段时间。如果您也想这样做,我建议您查看这些教程并使用它们提供的 Unity 代码。希望我们能找到解决方案。
    猜你喜欢
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    相关资源
    最近更新 更多