使用Unity3D生成网格并加贴图

摘要:
当使用Unity3D进行开发时,我们通常需要生成自己的网格来控制,例如图像变形。首先,需要在空间中生成顶点,然后定义三角形面片顶点的数量。网格生成代码如下:usingUnityEngine;使用系统。收藏;publicclassMeshGeneration:MonoBehavior{Meshmesh;Vector3[]顶点;Vector2[]uv;int[]三角形;Vector3[]法线;voidStart(){gameObject.AddComponent<MeshFilter˃();gameObject.AddComponent<MeshRenderer>();Texturing=Resources.Load;gameObject。GetComponent<Renderer˃().material.mainTexture=img;mesh=newMesh();intm=5;//rowintn=10;//colfloatwidth=8;floatheight=6;顶点=newVector3[(m+1)*(n+1)] ;// 位置垂直法线=新矢量3[(m+1)*(n+1)];uv=新矢量2[(m+1)*(n+1)];三角形=newint[6*m*n];对于{floatx=i%(n+1);floaty=i/(n+1);floadx_pos=x/n*宽度;floaty_pos=y/m*高度;顶点[i]=newVector3;法线[i]=newVector3,floatu=x/n;floatv=y/m;uv[i]=new Vector2(u,v);}对于{int[]triIndex=newint[3];如果{triIndex[0]=i/2+i/(2*n);triIndex[1]=triIndex[0]+1;triIndex[2]=triIndex[0]+(n+1);}否则{triIndex[0]=(i+1)/2+i/(2*n);triIndex[1]=triIndex[0]+(n+1);triIndex[2]=triIndex[1]-1;}//三角形顶点的顺序将影响显示方向三角形[i*3]=triIndex[0];三角形[i*3+1]=triIndex[2];三角形[i*3+2]=triIndex[1];}网格顶点=顶点;网格uv=uv;网格三角形=三角形;网格法线=法线;this.GetComponent<MeshFilter>()。mesh=网格;}}下图中的景观图像是将地图直接粘贴到网格上的结果。看起来效果和直接把地图扔到飞机上是一样的。但是,我们可以控制网格顶点的数量,并大大增加自由度。

        在使用Unity3D进行开发时,我们通常需要生成自己的网格来进行控制,比如进行图像变形等等。本文将介绍如何在Unity3D中生成一个网格。

        首先,需要在空间中生成顶点,然后在定义三角面片顶点序号。生成网格的代码如下:

using UnityEngine;
using System.Collections;


public class MeshGeneration : MonoBehaviour
{


    Mesh mesh;
    Vector3[] vertices;
    Vector2[] uv;
    int[] triangles;
    Vector3[] normals;
    void Start()
    {
        gameObject.AddComponent<MeshFilter>();
        gameObject.AddComponent<MeshRenderer>();
        Texture img = (Texture)Resources.Load("tu");
        gameObject.GetComponent<Renderer>().material.mainTexture = img;
        mesh = new Mesh();
        int m = 5; //row  
        int n = 10;  //col  
        float width = 8;
        float height = 6;
        vertices = new Vector3[(m + 1) * (n + 1)];//the positions of vertices 
        normals = new Vector3[(m + 1) * (n + 1)];


        uv = new Vector2[(m + 1) * (n + 1)];
        triangles = new int[6 * m * n];
        for (int i = 0; i < vertices.Length; i++)
        {
            float x = i % (n + 1);
            float y = i / (n + 1);
            float x_pos = x / n * width;
            float y_pos = y / m * height;
            vertices[i] = new Vector3(x_pos, y_pos, 0);
            normals[i] = new Vector3(0,0,-1);
            float u = x / n;
            float v = y / m;
            uv[i] = new Vector2(u, v);




        }
        for (int i = 0; i < 2 * m * n; i++)
        {
            int[] triIndex = new int[3];
            if (i % 2 == 0)
            {
                triIndex[0] = i / 2 + i / (2 * n);
                triIndex[1] = triIndex[0] + 1;
                triIndex[2] = triIndex[0] + (n + 1);
            }
            else
            {
                triIndex[0] = (i + 1) / 2 + i / (2 * n);
                triIndex[1] = triIndex[0] + (n + 1);
                triIndex[2] = triIndex[1] - 1;


            }
            //三角形顶点顺序会影响显示方向
            triangles[i * 3] = triIndex[0];
            triangles[i * 3 + 1] = triIndex[2];
            triangles[i * 3 + 2] = triIndex[1];


        }
        mesh.vertices = vertices;
        mesh.uv = uv;
        mesh.triangles = triangles;
        mesh.normals = normals;
        this.GetComponent<MeshFilter>().mesh = mesh;
    }
   
}

        下图中的风景图片就是将贴图直接贴在网格上的结果。看上去效果和直接将贴图扔到一个plane上是一样的。但是我们可以控制网格顶点的数量,自由度大大增加。

使用Unity3D生成网格并加贴图第1张


免责声明:文章转载自《使用Unity3D生成网格并加贴图》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇XXE漏洞复习版本JS批量替换内容中关键词为超链接,避开已存在的链接和alt、title中的关键词下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Unity3D 创建一个简单的2D游戏

开始研究Unity3d 中的2D游戏。 首先创建出一个项目: 然后创建出一个场景: 然后添加一个背景: 然后创建一个主人公对象: 可以是自己做的素材,也可以是用unity裁剪的素材, 下面贴出裁剪素材的步奏 然会对图像进行裁剪,裁剪后进行保存: 有这样符号的就是裁剪后的素材: 然后将素材添加到游戏场景中(也就是拖到视图就可以了,如果是后期做碰撞...

[Unity3D]Unity3D游戏开发之《愤慨的小鸟》弹弓实现

        各位朋友,大家晚上好, 我是秦元培。欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei。今天我们来做一个高端大气上档次的东西。 我相信大家都玩过一款叫做《愤慨的小鸟》的游戏,这款游戏之所以可以受到玩家的喜爱,是由于这是一款物理游戏,在游戏中处处充满了物理。我们熟悉的抛物线、引力等物理元素都在这款游戏中得到...

Unity3D 原生Android结合UnityPlayerActivity开发遇到的问题

需求是原生Android 的Activity启动UnityPlayerActivity,按Back键后返回原来的Activity 1、在AndroidManifest.xml中的UnityPlayerActivity标签中加入 android:process=":unityplayer" 2、在C#代码里可以直接掉Application.Quit()...

11.Unity3D与android交互---构建android插件

为android构建一个插件 要创建一个android插件,首先要有 Android NDK 并熟悉使用ndk构建共享库的方法。 如果用C++来实现库,必须声明成用C语言的链接方式,以避免Name Mangling问题。 extern "C" { float FooPluginFunction (); } 通过C#脚本使用插件 构建了共享库后,必...

Unity3D之如何将包大小减少到极致

Unity3D之如何将包大小减少到极致,图片是游戏app里最最占空间的资源,所以请各位还没有理解u3d对图片文件存储方式理解的请看《unity3d-texture图片空间和内存占用分析》。因为u3d对资源的压缩并不阐述的十分详细,所以很多项目在遇到包大小瓶颈时非常头疼。我也不是神仙,也同样痛苦过,但经历几个项目的折腾,最终能梳理出一套能将u3d包大小减少到...

unity3D 重新加载场景时重置时间从0开始

void Update() { //.ToString()以两位数显示累加的时间//此方法可在重新加载场景时,重新计算时间 LastTime.text = Time.timeSinceLevelLoad.ToString("00"); }...