打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【新提醒】【如何在Unity中生成八面体球(下)】
如何在Unity中生成八面体球(上)

贴图与切线

那么,如果做成一个星球,八面体球表现怎么样呢?

下面是为一个星球贴图的实例,包括漫反射高光和法线贴图。您只看到了水,因为alpha通道用于高光强度,水设置为1,陆地设置为0。



这里我们的球体分别具有漫反射材质,高光材质和凹凸高光材质。场景中添加了方向光,来获得有趣的光照。



我们还没有给网格赋予切线向量,所以凹凸高光版本看起来存在问题的所以我们来添加CreateTangents 方法。

切线是单位长度向量,指向水平贴图方向,包裹着球体。所以它们应该在顶点行中完全跟随逆时针环。可以从顶点位置来生成它们,通过取得顶点的X和Z轴,对它们标准化来获得从中心出发的水平方向,然后逆时针旋转90度。旋转可以通过将(x, 0, z) 变换为 (-z, 0, x)来完成。

[C#] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
private static void CreateTangents (Vector3[] vertices, Vector4[] tangents) {
    for (int i = 0; i < vertices.Length; i++) {
        Vector3 v = vertices[i];
        v.y = 0f;
        v = v.normalized;
        Vector3 tangent;
        tangent.x = -v.z;
        tangent.y = 0f;
        tangent.z = v.x;
        tangents[i] = tangent;
    }
}


然而,unity使用3D向量来定义切线。

第四个组件用来决定法线和切线要怎样组合来构成一个3D空间,法线贴图就放在这个空间内。它可以是1或者-1。因为Unity组合法线和切线的顺序,我们使用-1。

[C#] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
private static void CreateTangents (Vector3[] vertices, Vector4[] tangents) {
    for (int i = 0; i < vertices.Length; i++) {
        Vector3 v = vertices[i];
        v.y = 0f;
        v = v.normalized;
        Vector4 tangent;
        tangent.x = -v.z;
        tangent.y = 0f;
        tangent.z = v.x;
        tangent.w = -1f;
        tangents[i] = tangent;
    }
}


由于这个途径在极点处的顶点没有用,我们将在循环后面单独定义它们。

[C#] 纯文本查看 复制代码
1
2
3
4
5
6
7
tangents[vertices.Length - 4] = tangents[0] = new Vector3(-1f, 0, -1f).normalized;
tangents[vertices.Length - 3] = tangents[1] = new Vector3(1f, 0f, -1f).normalized;
tangents[vertices.Length - 2] = tangents[2] = new Vector3(1f, 0f, 1f).normalized;
tangents[vertices.Length - 1] = tangents[3] = new Vector3(-1f, 0f, 1f).normalized;
for (int i = 0; i < 4; i++) {
    tangents[vertices.Length - 1 - i].w = tangents[i].w = -1f;
}


接下来在Create方法中生成切线并加到网格中。

[C#] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
Vector4[] tangents = new Vector4[vertices.Length];
CreateTangents(vertices, tangents);
if (radius != 1f) {
    for (int i = 0; i < vertices.Length; i++) {
        vertices[i] *= radius;
    }
}
Mesh mesh = new Mesh();
mesh.name = "Octahedron Sphere";
mesh.vertices = vertices;
mesh.normals = normals;
mesh.uv = uv;
mesh.tangents = tangents;
mesh.triangles = triangles;
return mesh;


现在,可以看见一个正确着色的星球。



比较球体

一个八面体球体星球和一个UV球体星球比较起来怎么样呢?

首先Unity的UV球,它有525个顶点和760个三角形。从侧面看起来效果不错,但从上往下看,轮廓会比较粗糙,而且在极点会看到一个比较大的变形。



拿一个三次细分的八面体球来与它比较。它有279个顶点和512个三角形,分别占UV球的37%和67%。从顶部看起来,放射状的扭曲没有了,取而代之的是一个更小的钻石状的东西。



如果使用4次细分会怎么样呢?那样的话有1,063(202%)个顶点和2,048(269%)个三角形。轮廓效果非常棒,极点处的放射状扭曲减少了。



需要多少次细分步骤,取决于星球看起来有多大。如果很近,您可能需要6次细分,如果更远一些的话,也许只需要细分2次。

可以使用LOD系统来做最佳选择,可以使用Unity Pro的LOD或者自定义一个。

网格资源

我们使用一个测试组件在Play模式下产生了网格物体,但其实要让它们像一个网格资源一样可供使用也很方便。

可以使用一个编辑器脚本(editor script)来将网格物体保存为资源文件。

下面是一个简单的向导,让您配置一个正八面体球形网格物体并将它保存为Unity的资源文件。这个脚本必须保存在Editor文件夹中。

[C#] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using UnityEditor;
using UnityEngine;
public class OctahedronSphereWizard : ScriptableWizard {
    [MenuItem("Assets/Create/Octahedron Sphere")]
    private static void CreateWizard () {
        ScriptableWizard.DisplayWizard<OctahedronSphereWizard>("Create Octahedron Sphere");
    }
    [Range(0, 6)]
    public int level = 6;
    public float radius = 1f;
    private void OnWizardCreate () {
        string path = EditorUtility.SaveFilePanelInProject(
            "Save Octahedron Sphere",
            "Octahedron Sphere",
            "asset",
            "Specify where to save the mesh.");
        if (path.Length > 0) {
            Mesh mesh = OctahedronSphereCreator.Create(level, radius);
            MeshUtility.Optimize(mesh);
            AssetDatabase.CreateAsset(mesh, path);
            Selection.activeObject = mesh;
        }
    }
}


最后,您可以在任何项目中使用这个八面体球。

原文作者 :Jasper Flick
原文链接:http://www.binpress.com/tutorial/creating-an-octahedron-sphere/162



感谢蛮牛译员“轩辕之子”对本文翻译所做的贡献~~~




本文翻译来自蛮牛社区-蛮牛译馆倾情奉献,转载请注明出处。

同时欢迎翻译大伽加入蛮牛译员团队!
http://www.unitymanual.com/thread-41126-1-1.html
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Unity3D研究院之与根据动态的两个轨迹点绘制面详解(二十)
<Unity3D>Unity3D中MeshRenderer的使用
unity 溶解贴花编辑器
unity表情动画
使用Unity实现动态2D水效果
10 步让你成为更优秀的程序员
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服