欢迎访问宙启技术站
智能推送

Catlike学习笔记(1.4)-使用Unity构建分形

发布时间:2023-05-15 10:07:53

分形是一种自相似的几何形状,这意味着它的一部分看起来像整个图形。因此,分形在自然界和数字艺术中广泛存在。Catlike教程的 章介绍了将分形构建到Unity中的基础概念,包括递归和分形图案的绘制。第二章深入探讨了使用Unity的代码工具来构建分形。本文将进一步探讨如何开始构建自己的分形的 步。

步:建立基础

在开始构建分形之前,需要建立一个空场景。打开一个新的Unity项目,在新的场景中创建一个空对象。这个对象的命名可以任意,比如叫做“Fractal”。然后,将脚本挂在上面。这个脚本的作用是将视图移动到适当的高度和位置,并为分形提供一个起点。以下是一个简单的摄像机控制脚本,可以复制粘贴到新的C#脚本文件中:

using UnityEngine;

public class Fractal : MonoBehaviour {

  private void Start() {

    Camera.main.transform.position = new Vector3(0f, 10f, -10f);

    Camera.main.transform.rotation = Quaternion.Euler(45f, 0f, 0f);

  }

}

这个脚本将视图移动到一个高度为10个单位,摄像机位置上和后面-10个单位的位置。摄像机的角度被设定为45度,这样可以看到从一个斜角的视角的分形。

第二步:分形代码

现在准备好了开始编写分形代码。在代码文件的上面,需要添加Unity引用。因为这个脚本将需要使用Unity的长方形、菜单和辅助函数, 在代码顶部添加这些引用:

using UnityEngine;

[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]

public class Fractal : MonoBehaviour {

  private void Start() {

    ...

    MakeFractal();

  }

  private void MakeFractal() {

    ...

  }

  private void Update() {

    ...

  }

}

这个脚本围绕“制作分形”的MakeFractal()函数。这个函数将包含递归代码,以绘制分形图案。在这个函数中,首先需要创建物体和网格。网格将是用于绘制分形的基础。然后,将创建一个递归函数来制作分形。以下是一个简单的递归函数,可以重复绘制相同的递归深度的辅助平面:

private void MakeFractal(int depth) {

    if (depth < 1) {

        return;

    }

    GameObject child = new GameObject("Fractal Child");

    child.transform.parent = transform;

    child.transform.localPosition = Vector3.up;

    child.transform.localRotation = Quaternion.identity;

    child.transform.localScale = 0.5f * Vector3.one;

    Mesh mesh = GetComponent<MeshFilter>().mesh;

    Vector3[] vertices = mesh.vertices;

    int[] triangles = mesh.triangles;

    Mesh childMesh = new Mesh();

    childMesh.vertices = vertices;

    childMesh.triangles = triangles;

    childMesh.RecalculateNormals();

    child.AddComponent<MeshFilter>().mesh = childMesh;

    child.AddComponent<MeshRenderer>().material = GetComponent<MeshRenderer>().material;

    MakeFractal(depth - 1);

}

这个函数将递归地重复绘制相同的子平面,直到深度小于1。然后,将创建新的子游戏对象,将其附加到分形对象上,将其移动到父对象的位置,并将其缩小到原来的一半。它还将复制网格,将其分配给子对象,并将其添加到子对象的渲染器。最后,MakeFractal()函数被再次调用,将深度减少1,如此递归。

第三步:显示分形

与在前面的步骤中创建的Start()函数作为框架相结合,现在可以绘制一个简单的分形。删除MakeFractal()函数中的所有代码,并替换为以下代码:

private void MakeFractal(int depth) {

    if (depth < 1) {

        return;

    }

    GameObject child = new GameObject("Fractal Child");

    child.transform.parent = transform;

    child.transform.localPosition = Vector3.up;

    child.transform.localRotation = Quaternion.identity;

    child.transform.localScale = 0.5f * Vector3.one;

    Mesh mesh = GetComponent<MeshFilter>().mesh;

    Vector3[] vertices = mesh.vertices;

    int[] triangles = mesh.triangles;

    Mesh childMesh = new Mesh();

    childMesh.vertices = vertices;

    childMesh.triangles = triangles;

    childMesh.RecalculateNormals();

    child.AddComponent<MeshFilter>().mesh = childMesh;

    child.AddComponent<MeshRenderer>().material = GetComponent<MeshRenderer>().material;

    MakeFractal(depth - 1);

    MakeFractal(depth - 1);

}

这个函数将递归地绘制分形形状,并绘制其子分形图案,深度为1。这将导致两个子对象被创建,每个对象将再次递归地创建两个子对象,依此类推。每个子对象都会缩小到其父对象的一半大小,依此类推,这样就可以创建逐渐减小的类似三叶草的形状。完成后,在Fractal对象上添加一个网格渲染器和网格过滤器。最后,在其中添加一个材料,并附加这个脚本。现在应该会在场景视图中看到分形图案。

总结

创建简单的分形图案可能是学习使用Unity的一个好的起点。这些图形很容易是引人注目的,可以通过添加文本和其他图形来翻译为完整的艺术品。Catlike教程提供了一些关于使用Unity的递归技术创建分形的有用信息。这个过程依赖于编写和组织简单的代码,以及使用Unity库和对象来创建完整的场景。