栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > 其他

网格编程01

其他 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

网格编程01

[RequireComponent()]

当使用带有RequireComponent 的脚本添加到 GameObject 时,所需的组件会自动添加到 GameObject上。例如,脚本中始终需要一个刚体,使用 RequireComponent ,会在这个没有刚体的GameObject上添加刚体组件。

使用脚本生成一个正方形
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
public class GenerateMesh_1 : MonoBehaviour
{
    void Start()
    {
        Mesh mesh = new Mesh();

        MeshFilter filter = GetComponent();
        filter.mesh = mesh;
        mesh.name = "CS_01";
        mesh.vertices = GetVertexs();
        mesh.triangles = GetTriangles();
    }

    private Vector3 [] GetVertexs()
    {
        return new Vector3[]  //记录三角形顶点坐标
        {
            new Vector3 (0,0,0),
            new Vector3 (1,0,0),
            new Vector3 (1,1,0),
            new Vector3 (0,1,0),
        };
    }

    private int[] GetTriangles()
    {
        return new int[]
        {
            0,1,2,  //对应Vector3 [] GetVertexs()中数组的下标使三角形按012的顺序生成
            0,2,3,  //顺时针
        };
    }
}

uv坐标和顶点的关系
public class GenerateMesh_1 : MonoBehaviour
{
    void Start()
    {
        Mesh mesh = new Mesh();

        MeshFilter filter = GetComponent();
        filter.mesh = mesh;
        mesh.name = "CS_01";
        mesh.vertices = GetVertexs();
        mesh.triangles = GetTriangles();
        mesh.uv = GetUVs();
    }

    private Vector3 [] GetVertexs()
    {
        return new Vector3[]  //记录三角形顶点坐标
        {
            new Vector3 (0,0,0),
            new Vector3 (1,0,0),
            new Vector3 (1,1,0),
            new Vector3 (0,1,0),
        };
    }

    private Vector2 [] GetUVs()
    {
        return new Vector2[]
        {
            new Vector2 (1,0),
            new Vector2 (0,0),
            new Vector2 (0,1),
            new Vector2 (1,1),
        };
    }

法向量数组
public class GenerateMesh_1 : MonoBehaviour
{
    void Start()
    {
        Mesh mesh = new Mesh();

        MeshFilter filter = GetComponent();
        filter.mesh = mesh;
        mesh.name = "CS_01";
        mesh.vertices = GetVertexs();
        mesh.triangles = GetTriangles();

        mesh.uv = GetUVs();

        mesh.normals = GetNormals();//接受光照需要法向量
    }

    private Vector3 [] GetVertexs()
    {
        return new Vector3[]  //记录三角形顶点坐标xyz
        {
            new Vector3 (0,0,0),
            new Vector3 (1,0,0),
            new Vector3 (1,1,0),
            new Vector3 (0,1,0),
        };
    }

    private Vector2 [] GetUVs()//uv
    {
        return new Vector2[]
        {
            new Vector2 (1,0),
            new Vector2 (0,0),
            new Vector2 (0,1),
            new Vector2 (1,1),
        };
    }

    private Vector3[] GetNormals()
    {
        return new Vector3[]
        {
            Vector3.up,
            Vector3.up,
            Vector3.up,
            Vector3.up,
        };
    }
切线空间

切线空间有TBN三个分别对应XYZ;
切线空间与UV分别对应TB,N是垂直与UV平面的一个量;
法线贴图之所以是蓝色的原因:颜色空间0-1的一个范围这样就和N的范围相符了,法线方向向量转为颜色空间大概在(0.5,0.5,1),找到调色板,将255*0.5约是128,颜色如下图所示。

可以说切线是四维向量(vector4)其中一个向量用于确定uv是否要反转unity中一般是-1

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

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

public class GenerateMesh_1 : MonoBehaviour
{
    public Vector4 Tangent;

    private Mesh mesh;
    void Start()
    {
        mesh = new Mesh();

        MeshFilter filter = GetComponent();
        filter.mesh = mesh;
        mesh.name = "CS_01";
        mesh.vertices = GetVertexs();
        mesh.triangles = GetTriangles();

        mesh.uv = GetUVs();
        mesh.uv2 = GetUV1s();

        mesh.normals = GetNormals();//接受光照需要法向量
        //mesh.RecalculateNormals();
    }

    private void Update()
    {
        mesh.tangents = GetTangent();
    }

    private Vector4[] GetTangent()
    {
        return new Vector4[]
        {
            Tangent ,
            Tangent ,
            Tangent ,
            Tangent ,
        };
    }

    private Vector3 [] GetVertexs()
    {
        return new Vector3[]  //记录三角形顶点坐标
        {
            new Vector3 (0,0,0),
            new Vector3 (1,0,0),
            new Vector3 (1,1,0),
            new Vector3 (0,1,0),
        };
    }

    private Vector2 [] GetUVs()
    {
        return new Vector2[]
        {
            new Vector2 (1,0),
            new Vector2 (0,0),
            new Vector2 (0,1),
            new Vector2 (1,1),
        };
    }

    private Vector2[] GetUV1s()
    {
        return new Vector2[]
        {
            new Vector2 (0,0),
            new Vector2 (0,0),
            new Vector2 (0,0),
            new Vector2 (0,0),
        };
    }

    private Vector3[] GetNormals()
    {
        return new Vector3[]
        {
            Vector3.right ,
            Vector3.right ,
            Vector3.right,
            Vector3.right,
        };
    }


    private int[] GetTriangles()
    {
        return new int[]
        {
            0,1,2,  //对应Vector3 [] GetVertexs()中数组的下标使三角形按012的顺序生成
            0,2,3,  //顺时针
        };
    }
}

自行赋值观察效果

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/901873.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号