程序行星球面网格变形 C# Unity 5.
本文关键字:Unity 变形 网格 行星 星球 程序 | 更新日期: 2024-10-31 18:51:14
我一直在公司发布许多问题,以及你们给出的所有答案,遵循了几个教程,由于我的谷歌搜索中的所有链接都标记为"已经访问过"我决定把我的骄傲放在一边,为你发布一个问题。
这是我的第一篇文章,所以我不知道我是否这样做是对的,如果不是,对不起,无论如何问题是这样的:
我正在 unity 5 上开发一个 C# 行星探索游戏,我已经按照这里提到的一些教程用八边形构建了一个球体,也可以用它们构建柏林纹理和高度贴图,问题在于将它们应用于球体并在网格上生成地形,我知道我必须映射球体的顶点和 UV 才能做到这一点, 但问题是我真的很讨厌数学的东西,我找不到任何一步一步的遵循,我听说过镶嵌着色器、LOD、沃罗诺伊噪音、柏林噪音,并迷失在这个过程中。简化:
我有什么:
-
我有球形网格
-
我有高度图
-
我已将它们与适当的法线贴图一起分配给材质
我认为我;(因为老实说,我不知道这是否是正确的路径了)需要以下方面的帮助:
-
基于高度图生成球面网格变形的代码
-
如何使用那些基于镶嵌LOD的着色器等来制作真实大小的程序星球
非常感谢您的关注,如果我粗鲁或要求太多,请道歉,但您可以提供的任何帮助都将对我有很大帮助。
我真的不认为我有能力给你代码特定的信息,但这里有一些关于你的清单的补充/建议。
-
如果你想设置一个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/
无论如何,祝你好运,如果我不清楚某事或您需要更多解释,请告诉我。