Unity 顶点vertices,uv,与图片贴图,与mesh

这篇具有很好参考价值的文章主要介绍了Unity 顶点vertices,uv,与图片贴图,与mesh。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Unity 顶点vertices,uv,与图片贴图,与mesh,Unity3D,unity,uv,贴图

mesh就是组成3d物体的三角形们。

mesh由顶点组成的三角形组成,三角形的大小 并不 需要一样,由顶点之间的位置决定。

mesh可以是一个或者多个面。

贴图的原点在左下角,uv是贴图的坐标,数量和顶点数一样(不是100%确定,比如前后左右4个面,贴图最终如何封闭,我还不知道),是贴图和顶点的对应关系。

新建空场景,把一下代码放到main camera:

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

using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif

public class codeMesh2 : MonoBehaviour
{
	GUIStyle fontStyle = new GUIStyle();
	string msg = " - - ";
	// Start is called before the first frame update
	Vector3 center = new Vector3();
	GameObject o;
	bool ready = false;
	//int startCalled = 0;
	Camera c;
	string err = "";
	int moveRage = 25; 
	int moveRage2 = 0;
	int moveRage2_1 = 0;
	Mesh mesh = null;

	public int width = 10;
	public int height = 10;
	public Texture aText = null;

	/// <summary>
	/// 上一次更新帧率的时间
	/// </summary>
	private float m_lastUpdateShowTime = 0f;
	/// <summary>
	/// 更新显示帧率的时间间隔
	/// </summary>
	private readonly float m_updateTime = 0.05f;
	/// <summary>
	/// 帧数
	/// </summary>
	private int m_frames = 0;
	/// <summary>
	/// 帧间间隔
	/// </summary>
	//private float m_frameDeltaTime = 0;
	private float m_FPS = 0;
	//private Rect m_fps, m_dtime;

	//顶点数组
	private Vector3[] vertices;
	//顶点法线
	private Vector3[] normals;
	private MeshFilter meshFilter;

	private int i = 0;
	private bool f = false;
	private string test2 = "";
	private int waitCount = 0;
	private void Awake()
	{
		Application.targetFrameRate = 30;
		moveRage2 = moveRage * 2;
		moveRage2_1 = moveRage * 2 - 1;

		fontStyle.normal.background = null;    //设置背景填充
		fontStyle.normal.textColor = Color.red;   //设置字体颜色
		fontStyle.fontSize = 40;
		fontStyle.wordWrap = true;
		c = GetComponent<Camera>();
		msg += " Waiting ";

		Vector3 v1 = new Vector3(5, 5, 5);
		Vector3 v2 = new Vector3(5, 5, 3);

		test2 = (v2 - v1).normalized.ToString();
	}

	void Start()
	{
		try
		{
			o = GenerateMeshTest1();
			center = c.transform.position;
			o.name = "d mesh";
			o.transform.position = new Vector3(-5, -5, 20);
			o.transform.localScale = new Vector3(10.0f, 10.0f, 10.0f);
			o.transform.rotation = Quaternion.Euler(new Vector3(0, 45, 45));
			m_lastUpdateShowTime = Time.realtimeSinceStartup;
			ready = true;
		}
		catch (Exception e)
		{
			err = printException(e);
		}

		aText = Resources.Load("type/two_sizes") as Texture;

		o.GetComponent<MeshRenderer>().material.mainTexture = aText;

#if UNITY_EDITOR
		showNormals();
#endif

	}
	private void OnGUI()
	{
		GUI.color = Color.red;
		msg = "fps=" + m_FPS + "/"+ Application.targetFrameRate +(err.Length>1?(", err=" + err):"")  + " waitCount = " + (ready? waitCount : (waitCount++));

		GUI.Label(new Rect(50, 10, 900, 100), "" + test2, fontStyle);
		GUI.Label(new Rect(100, 100, 900, 100), "[V07]:" + msg, fontStyle);
	}

	// Update is called once per frame
	void Update()
	{
		if (!ready) return;
		int ri = i % (moveRage2);

		float x = ri - moveRage;

		if (!f)
		{
			x = moveRage - ri;
		}

		if (ri == moveRage2_1)
		{
			f = !f;
		}
		//o.transform.position = new Vector3(x, x, 20);
		//Debug.Log(x);
		//o.transform.rotation = Quaternion.Euler(new Vector3(0, 0, 0));

		/*
		Mesh mesh = o.GetComponent<MeshFilter>().mesh;
		//mesh.Clear();
		Vector3[] vertices = mesh.vertices;
		Vector3[] normals = mesh.normals;

		for (var i = 0; i < vertices.Length; i++)
		{
			vertices[i] += normals[i] * Mathf.Sin(Time.time);
		}

		mesh.vertices = vertices;
		*/


		m_frames++;
		if (Time.realtimeSinceStartup - m_lastUpdateShowTime >= m_updateTime)
		{
			m_FPS = m_frames / (Time.realtimeSinceStartup - m_lastUpdateShowTime);
			//m_frameDeltaTime = (Time.realtimeSinceStartup - m_lastUpdateShowTime) / m_frames;
			m_frames = 0;
			m_lastUpdateShowTime = Time.realtimeSinceStartup;
			//Debug.Log("FPS: " + m_FPS + ",间隔: " + m_FrameDeltaTime);
		}
		i++;
	}


	private GameObject GenerateMeshTest1()
	{
		GameObject obj = new GameObject();
		meshFilter = obj.AddComponent<MeshFilter>();
		//创建mesh
		mesh = new Mesh();
		meshFilter.mesh = mesh;
		MeshRenderer renderer = obj.AddComponent<MeshRenderer>();
		//标准材质
		Material mat = new Material(Shader.Find("Legacy Shaders/Transparent/Diffuse"));
		mat.color = Color.white;
		renderer.material = mat;
		
		//创建顶点和UV
		vertices = new Vector3[6];
		Vector2[] uv = new Vector2[6];

		vertices[0] = new Vector3(0, 1, 0);//0
		vertices[1] = new Vector3(1, 1, 0);//1
		vertices[2] = new Vector3(1, 0, 0);//2
		vertices[3] = new Vector3(0, 0, 0);//3
		vertices[4] = new Vector3(0, 0, 1);//4
		vertices[5] = new Vector3(1, 0, 1);//5-
		int k = 0;
		uv[k++%6] = new Vector2(0, 1);
		uv[k++ % 6] = new Vector2(1, 1);
		uv[k++ % 6] = new Vector2(1, 0.5f);
		uv[k++ % 6] = new Vector2(0,0.5f);
		uv[k++ % 6] = new Vector2(0, 0);
		uv[k++ % 6] = new Vector2(1, 0);

		mesh.vertices = vertices;
		mesh.uv = uv;
		//mat.mainTexture = aText;

		int[] triangles = new int[12];
		k = 0;
		triangles[k++] = 3;
		triangles[k++] = 2;
		triangles[k++] = 5;

		triangles[k++] = 3;
		triangles[k++] = 5;
		triangles[k++] = 4; 
		
		triangles[k++] = 0;
		triangles[k++] = 1;
		triangles[k++] = 2;

		triangles[k++] = 0;
		triangles[k++] = 2;
		triangles[k++] = 3;




		mesh.triangles = triangles; //三角面
		mesh.RecalculateNormals();  //计算法线



		/*Vector3[] normals = new Vector3[4];
		normals[0] = Vector3.back;
		normals[1] = Vector3.back;
		normals[2] = Vector3.back;
		normals[3] = Vector3.back;
		mesh.normals = normals;*/



		//mesh.SetIndices
		//mat.SetTexture()

		return obj;
	}

	public static string printException(Exception e)
	{
		return "\n\trs=" + e.HResult + ",\n\tmsg=" + e.Message + ",\n\tstack=" + e.StackTrace + "\n------------------------------------\n";
	}


#if UNITY_EDITOR
	private void showNormals()
	{
		if (mesh != null)
		{
			//当前对象的操做从局部空间转换到世界空间 这样在下面的操作位置即可同步 否则位置是不会同步的
			Handles.matrix = meshFilter.transform.localToWorldMatrix;
			Handles.color = Color.green;

			int vertextCount = mesh.vertices.Length;
			//采用从顶点的位置[法线的起点】到法线的终点位置,既可以显示出当前顶点的法线
			for (int index = 0; index < vertextCount; index++)
			{
				Handles.DrawLine(vertices[index], vertices[index] + normals[index]);
			}
		}
	}
#endif
}

two_sizes.png是一张 宽高比为1:2的图片。

Unity 顶点vertices,uv,与图片贴图,与mesh,Unity3D,unity,uv,贴图

三角形之间的定义顺序不会影响贴图。但单个三角形三个顶点是逆时针,则从外部可以看到贴图,从内部看不到。反之亦然:

Unity 顶点vertices,uv,与图片贴图,与mesh,Unity3D,unity,uv,贴图

(顺时针之后,从内部可见)

如果把图片直接放到场景,则两面都可见。文章来源地址https://www.toymoban.com/news/detail-689735.html

到了这里,关于Unity 顶点vertices,uv,与图片贴图,与mesh的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity场景优化工具:Mesh Baker 基础教程(贴图篇)

    目录 前言 一、Mash Baker是什么? 二、使用步骤 1.打开场景 2.将Texture Baker添加到场景中 3.使用Texture Baker生成贴图集 4.烘焙新的模型并使每个模型独立 总结 模型贴图整合是3D游戏中美术资源优化的重要环节,我们通常把多个模型的贴图集成到一张2048大小的贴图集中,以达到减

    2024年02月02日
    浏览(44)
  • Unity - 导出的FBX模型,无法将 vector4 保存在 uv 中(使用 Unity Mesh 保存即可)

    备忘,便于日后自己索引 为了学习了解大厂项目的效果: 上周为了将 王者荣耀的 杨玉环 的某个皮肤的头发效果还原 所以我想直接抓模型,再还原 shader 我使用的还是以前的老方法: GPA + 夜神模拟器,具体可以查看以前的另一篇教程,具体参考:教你如何使用GPA导出模型,

    2024年02月05日
    浏览(50)
  • Unity3D: Mesh切割算法详解

    Unity3D是一款非常流行的游戏开发引擎,支持多种平台和多种语言。在Unity3D中,Mesh是游戏中最常用的3D模型表示方法,它由一系列的点、线、面组成。在游戏中,我们经常需要对Mesh进行一些特殊的操作,比如切割,这个时候就需要用到Mesh切割算法。本文将详细介绍Mesh切割算

    2024年02月16日
    浏览(43)
  • 【瑞模网】Unity3D基础:贴图与材质球

    一、贴图与材质球 材质(Material):物体的质地,物体看起来是什么做的 贴图(Texture):普通的材质图片 贴图 + 着色器(Shader) = 材质球 所谓着色器(Shader)实际上就是一小段程序

    2023年04月12日
    浏览(69)
  • 【Unity3D】Unity 组件 ① ( 组件 Component 概念 | Transform 组件和 Light 组件 | Mesh Filter 组件和 Mesh Renderer 组件 )

    组件 Component 是 选中 游戏物体 GameObject 后 , 在 Inspector 检查器 窗口 中 , 查看到的内容 ; 组件 Component 代表了 游戏物体 GameObject 的一种功能 ; 空物体 只有 Transform 组件 , 只能提供 坐标 , 旋转角度 , 缩放倍数 功能 ; 平行光源 物体 有 Light 组件 提供光照功能 ; 立方体 物体 有 M

    2024年02月06日
    浏览(49)
  • 【解决】FBX模型导入Unity3D贴图丢失问题

    1、选择“Materials” 2、Location选择“Use External Materials(Legacy)” 3、最后点击“Apply”  

    2024年02月15日
    浏览(60)
  • unity3D中用Mesh Collider创建的碰撞体与物体模型位置有偏差的解决方法

    1.相信很多小伙伴在使用Mesh Collider时都遇到过下面这个情况: 1.解决方法:在这个对象Alpaca下面新建一个空对象Collider,我们把Mesh Collider添加到这个空对象上面就可以调整碰撞体的位置了  3.完成效果:

    2024年02月13日
    浏览(56)
  • unity3d 通过Nav Mesh Agent组件实现敌人巡逻以及有关“SetDestination”报错问题解决

    首先展示效果: 在实现敌人自动巡逻这一块我们可以通过使用unity自带组件Nav Mesh Agent(导航网格代理),在省去冗杂的代码量的同时可便利的实现这一功能。 首先为敌人添加Nav Mesh Agent组件: https://docs.unity.cn/cn/2018.4/Manual/class-NavMeshAgent.html 以上是unity官方手册上关于该组件

    2024年02月01日
    浏览(84)
  • 3dmax uv贴图方法大全

    方法1 / 渲染 材质编辑器 在基本色 漫反射中 选择 位图 image.png 点击查看图像调整要显示区域. image.png 多边形编辑模式选择面. 然后分离出一个单独的面 image.png 把材质拖上去,勾选应用即可 image.png 方法2 uvm贴图 支持多种方式投射贴图 , 支持gizmo缩放 移动调整 ,类似投影仪的效

    2024年02月10日
    浏览(38)
  • UV贴图和展开初学者指南

    在线工具推荐: 3D数字孪生场景编辑器  -  GLTF/GLB材质纹理编辑器  -  3D模型在线转换  -  Three.js AI自动纹理开发包  -  YOLO 虚幻合成数据生成器  -  三维模型预览图生成器  -  3D模型语义搜索引擎 这正是本文的主题——UV贴图——登上舞台的时候。大多数 3D 建模软件在创

    2024年01月22日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包