【Unity】Mesh网格编程(四)麦比乌斯环

前言

事隔四个多月,第二篇网格编程原创,本次献给大家的是麦比乌斯环。

其实这个早就想做了,还是轻松下来的时候思绪转的快。

不废话,先看效果:

博文首发:http://blog.csdn.net/duzixi

工程资源准备:

1. 本脚本要放在Editor文件夹下

2. 在资源中有一个空对象,作为顶点预设体,创建时要引入

3. 在Resources文件夹下有一个材质,叫"M"

源代码:

using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
/// <summary>
/// 脚本功能:扩展Unity编辑器,在GameObject目录下添加“麦比乌斯带”目录以向导方式生成麦比乌斯带3D模型对象
/// 添加对象:无(在Editor文件夹中)
/// 创建时间:2015年6月27日14:16:16
/// 创建人员:杜子兮
/// 版权声明:2015 www.duzixi.com
/// 技术要点:
/// 1. 通过生成,父子化和旋转空对象确认各个顶点位置
/// 2. 根据几何顶点位置生成网格顶点位置
/// </summary>
public class CreateMesh : ScriptableWizard {
    public int n = 50;       // 切割数
    public float r = 5;      // 半径
    public float h = 0.2f;   // 半高
    public GameObject point; // 顶点的预设体(选择适当的图标可显示顶点号)

    [MenuItem("GameObject/麦比乌斯带")]
    static void Create() {
        DisplayWizard<CreateMesh>("创建麦比乌斯带", "创建");
    }

    void OnWizardCreate() {
        // Step 1: 确定顶点位置
        List<Vector3> vList = new List<Vector3>();

        GameObject obj = new GameObject();  // 实例化要生成的目标对象
        obj.name = "麦比乌斯带";

        float angle = 2 * Mathf.PI / n;     // 计算单位弧度

        for (int i = 0; i < n; i++)
        {
            // 分别计算带子上中下三个顶点位置并保存到数组中
            Vector3 center = new Vector3(Mathf.Cos(angle * i), 0, Mathf.Sin(angle * i));
            Vector3[] vs = new Vector3[3] { center, center + h * Vector3.down, center + h * Vector3.up };

            // 计算中心点的角度,使之朝向坐标原点
            Quaternion rot = Quaternion.Euler(new Vector3(0, -90 - 360 / n * i, 0));

            // 生成顶点对象
            GameObject p0 = Instantiate(point, vs[0], rot) as GameObject ;
            GameObject p1 = Instantiate(point, vs[1], Quaternion.identity) as GameObject;
            GameObject p2 = Instantiate(point, vs[2], Quaternion.identity) as GameObject;

            // 设置顶点名字(用于调试)
            p0.name = "c" + i;
            p1.name = 2 * i + "";
            p2.name = 2 * i + 1 + "";

            // 让上下边缘的点认中心点为父对象
            p0.transform.parent = obj.transform;
            p1.transform.parent = p0.transform;
            p2.transform.parent = p0.transform;

            // 通过旋转中心点,改变上下边缘顶点的位置
            p0.transform.Rotate(Vector3.right, 360 / n * i);

            // 将上下边缘顶点添加到顶点列表中
            vList.Add(p1.transform.position);
            vList.Add(p2.transform.position);

        }

        // Step 2: 生成顶点数组
        Vector3[] Vs = new Vector3[6 * n];
        int index = 0;

        for (int i = 0; i < 2 * n - 2; i += 2)
        {
            Vs[index++] = vList[i];
            Vs[index++] = vList[i + 1];
            Vs[index++] = vList[i + 2];
            Vs[index++] = vList[i + 2];
            Vs[index++] = vList[i + 1];
            Vs[index++] = vList[i + 3];
        }

        // 结合处顶点
        Vs[index++] = vList[2 * n - 2];
        Vs[index++] = vList[2 * n - 1];
        Vs[index++] = vList[0];
        Vs[index++] = vList[1];
        Vs[index++] = vList[0];
        Vs[index++] = vList[2 * n - 1];

        // Step 3: 缔造三角形索引
        int[] Ts = new int[Vs.Length];
        for (int i = 0; i < Vs.Length; i++)
        {
            Ts[i] = i;
        }

        // Step 4: 给目标对象添加网格组件
        obj.AddComponent<MeshFilter>();
        obj.AddComponent<MeshRenderer>();

        Mesh mesh = new Mesh();
        mesh.vertices = Vs;
        mesh.triangles = Ts;
        obj.GetComponent<MeshFilter>().mesh = mesh;

        // Step 5: 载入材质资源,添加给目标对象
        Material m = Resources.Load<Material>("M");
        obj.renderer.sharedMaterial = m;
    }

}

后记:

形状不是严格的麦比乌斯环,渲染只渲染了一面,目前没有加法线和切线。

时间: 2024-11-05 12:31:46

【Unity】Mesh网格编程(四)麦比乌斯环的相关文章

【Unity】Mesh网格编程(一)正二十面体

前言 Mesh类是Unity用脚本创建和修改3D模型的重要脚本类. 本文以自定义编译器菜单的方式,实现了Unity创建正二十面体的功能扩展. 博文首发:http://blog.csdn.net/duzixi 添加了各种Shader材质球+Halo的效果图: 关于Mesh编程相关内容网上有很多资料,这里就不再赘述了. 步骤一: 创建Editor文件夹(若有就不用),将以下源代码保存为MyEditor.cs文件,存入文件夹中. 源代码: <span style="font-size:14px;

unity Mesh(网格)的使用

创建两个三角形合成的矩形网格: GameObject obj= new GameObject(); MeshRenderer meshRenderer=obj.AddComponent<MeshRenderer>(); MeshFilter meshFilter=obj.AddComponent<MeshFilter>(); //渲染材质 meshRenderer.material=new Material(Shader.Find("Sprites/Default&quo

网格编程基础--01

(原文链接:https://catlikecoding.com/unity/tutorials/procedural-grid/) 创建网格点 使用协程分析网格点的布局 定义三角面 自动生成法线 添加纹理坐标和切线 本篇教程学习简单的顶点和三角形网格的创建 需要具备的基础: 熟悉基本的Unity编程 了解协程 使用Unity5.0.1或更高版本               复杂的表面下是简单的几何结构 渲染知识 如果你想在Unity中使某些物体可视化,那么使用网格(mesh).可以从别的项目中导

Unity Mesh 初体验

什么是Mesh Mesh是Unity中的一个组件,称为网格组件.通俗的讲,Mesh是指模型的网格,3D模型是由多边形拼接而成,而一个复杂的多边形,实际上是由多个三角面拼接而成.所以一个3D模型的表面是由多个彼此相连的三角面构成.三维空间中,构成这些三角面的点以及三角形的边的集合就是Mesh.如下图所示: mesh.png 所以建模型就是就是要画一些列的三角形,而定位一个三角形就是只需要3个顶点而已.很简单哦. 比如我们要画一个五边形,如下: demo1.png 它有五个顶点,但是在Unity中是

蛋哥的学习笔记之-基于Unity的Shader编程:X-1 音乐水波特效

蛋哥的学习笔记之-基于Unity的Shader编程:X-1 音乐水波特效 热度 13728 2015-7-11 23:34 |个人分类:蛋哥的学习笔记之-基于Unity的Shader编程| 音乐, Unity, Shader, 水波, Shader, Shader, Shader, Shader 一.要干些啥: 很久很久没有写文档了,前段时间做了个个人很喜欢的,自认为比较原创的小特效,所以写个文档纪念下(本人特别喜欢音乐) 思路其实很简单,首先用顶点着色器实现一般的水波特效,然后解析音频数据(我

GCC编程四个过程:预处理-编译-汇编-链接

在Linux下进行C语言编程,必然要采用GNU GCC来编译C源代码生成可执行程序. 一.GCC快速入门Gcc指令的一般格式为:Gcc [选项] 要编译的文件 [选项] [目标文件]其中,目标文件可缺省,Gcc默认生成可执行的文件名为:编译文件.out我们来看一下经典入门程序"Hello World!"# vi hello.c #include <stdlib.h>#include <stdio.h>void main(void){printf("he

SHELL编程四剑客练习--sed

SHELL编程四剑客: sed    awk     grep      find sed  可以将数据行进行替换.删除.新增.选取等特定工作 1.sed 如果不加任何参数,是不会去修改文件中的内容的.加 -i  参数会修改,如下图: 2.在文件行首加空格或其他字符,如下图: 行首   ^ 3.在行尾添加字符,如下图: 行尾   $ 4.在某行之后添加内容,如下图: 如果要在之前添加内容,把  a  改为  i   就OK了. 5.只显示其中某一行,如下图: 匹配关键字,"p"&quo

网络编程四:互联网中TCP Socket服务器的实现过程需要考虑哪些安全问题

这篇曾经是答在这里的 互联网中TCP Socket服务器的实现过程需要考虑哪些安全问题- auxten 的回答 最近总是有人问我相关的问题,在专栏补发一下,希望能帮到更多人 首先,这是个很大的命题,之前在360负责过几个对外的服务的研发,也算是有点小经验,我试着答一下 在Internet环境下安全问题我主要分为如下几类 1. 信息传输过程中被黑客窃取 2. 服务器自身的安全 3. 服务端数据的安全 首先,如果能用https,就尽量用https,能用nginx等常见服务器,就用常见服务器,主要能避

Win32 Windows编程 四

一 窗口注册和窗口创建的过程 1  Win32窗口程序创建步骤 1.1 WinMain入口函数的定义 1.2 WindowsProc 函数的定义 1.3注册窗口 RegisterClass/RegisterClassEx 1.4创建窗口 CreateWindow /CreateWindowEx 1.5 显示刷新窗口 ShowWindow/UpdateWindow 1.6 消息处理 GetMessage /DisptchMessage 1.7 窗口退出 WM_DESTROY:PostQuitMes