unity 通过图片信息制作地形图
来源:互联网 发布:江恩正方软件 编辑:程序博客网 时间:2024/06/05 01:57
using System.Collections;using System.Collections.Generic;using UnityEngine;public class testTerrain : MonoBehaviour {public Material diffuseMap;public Texture2D heightMap;//顶点、uv、索引信息private Vector3[] vertives;private Vector2[] uvs;private int[] triangles;//生成信息private Vector2 size;//长宽private float minHeight = -10;private float maxHeight = 10;private Vector2 segment;private float unitH;//面片meshprivate GameObject terrain;// Use this for initializationvoid Start(){//默认生成一个地形,如果不喜欢,注销掉然后用参数生成SetTerrain();}/// <summary>/// 生成默认地形/// </summary>public void SetTerrain(){SetTerrain(100, 100, 50, 50, -10, 10);}/// <summary>/// 通过参数生成地形/// </summary>/// <param name="width">地形宽度</param>/// <param name="height">地形长度</param>/// <param name="segmentX">宽度的段数</param>/// <param name="segmentY">长度的段数</param>/// <param name="min">最低高度</param>/// <param name="max">最高高度</param>public void SetTerrain(float width, float height, uint segmentX, uint segmentY, int min, int max){Init(width, height, segmentX, segmentY, min, max);GetVertives();DrawMesh();}/// <summary>/// 初始化计算某些值/// </summary>/// <param name="width"></param>/// <param name="height"></param>/// <param name="segmentX"></param>/// <param name="segmentY"></param>/// <param name="min"></param>/// <param name="max"></param>private void Init(float width, float height, uint segmentX, uint segmentY, int min, int max){size = new Vector2(width, height);maxHeight = max;minHeight = min;unitH = maxHeight - minHeight;segment = new Vector2(segmentX, segmentY);if (terrain != null){Destroy(terrain);}terrain = new GameObject();terrain.name = "plane";}/// <summary>/// 绘制网格/// </summary>private void DrawMesh(){Mesh mesh = terrain.AddComponent<MeshFilter>().mesh;terrain.AddComponent<MeshRenderer>();if (diffuseMap == null){Debug.LogWarning("No material,Create diffuse!!");diffuseMap = new Material(Shader.Find("Diffuse"));}if (heightMap == null){Debug.LogWarning("No heightMap!!!");}//terrain.renderer.material = diffuseMap;//给mesh 赋值mesh.Clear();mesh.vertices = vertives;//,pos);mesh.uv = uvs;mesh.triangles = triangles;//重置法线mesh.RecalculateNormals();//重置范围mesh.RecalculateBounds();}/// <summary>/// 生成顶点信息/// </summary>/// <returns></returns>private Vector3[] GetVertives(){int sum = Mathf.FloorToInt((segment.x + 1) * (segment.y + 1));float w = size.x / segment.x;float h = size.y / segment.y;int index = 0;GetUV();GetTriangles();vertives = new Vector3[sum];for (int i = 0; i < segment.y + 1; i++){for (int j = 0; j < segment.x + 1; j++){float tempHeight = 0;if (heightMap != null){tempHeight = GetHeight(heightMap, uvs[index]);}vertives[index] = new Vector3(j * w, tempHeight, i * h);index++;}}return vertives;}/// <summary>/// 生成UV信息/// </summary>/// <returns></returns>private Vector2[] GetUV(){int sum = Mathf.FloorToInt((segment.x + 1) * (segment.y + 1));uvs = new Vector2[sum];float u = 1.0F / segment.x;float v = 1.0F / segment.y;uint index = 0;for (int i = 0; i < segment.y + 1; i++){for (int j = 0; j < segment.x + 1; j++){uvs[index] = new Vector2(j * u, i * v);index++;}}return uvs;}/// <summary>/// 生成索引信息/// </summary>/// <returns></returns>private int[] GetTriangles(){int sum = Mathf.FloorToInt(segment.x * segment.y * 6);triangles = new int[sum];uint index = 0;for (int i = 0; i < segment.y; i++){for (int j = 0; j < segment.x; j++){int role = Mathf.FloorToInt(segment.x) + 1;int self = j + (i * role);int next = j + ((i + 1) * role);triangles[index] = self;triangles[index + 1] = next + 1;triangles[index + 2] = self + 1;triangles[index + 3] = self;triangles[index + 4] = next;triangles[index + 5] = next + 1;index += 6;}}return triangles;}private float GetHeight(Texture2D texture, Vector2 uv){if (texture != null){//提取灰度。如果强制读取某个通道,可以忽略Color c = GetColor(texture, uv);float gray = c.grayscale;//或者可以自己指定灰度提取算法,比如:gray = 0.3F * c.r + 0.59F * c.g + 0.11F * c.b;float h = unitH * gray;return h;}else{return 0;}}/// <summary>/// 获取图片上某个点的颜色/// </summary>/// <param name="texture"></param>/// <param name="uv"></param>/// <returns></returns>private Color GetColor(Texture2D texture, Vector2 uv){Color color = texture.GetPixel(Mathf.FloorToInt(texture.width * uv.x), Mathf.FloorToInt(texture.height * uv.y));return color;}/// <summary>/// 从外部设置地形的位置坐标/// </summary>/// <param name="pos"></param>public void SetPos(Vector3 pos){if (terrain){terrain.transform.position = pos;}else{SetTerrain();terrain.transform.position = pos;}}}
阅读全文
0 0
- unity 通过图片信息制作地形图
- ArcGis制作三维地形图教程
- 3dmax制作三维地形图
- 3dmax制作三维地形图
- Unity角色血条等信息制作
- 如何用global mapper制作地形图
- 如何制作3dmax三维地形图
- 3D MAX 三维地形图制作
- 3DMAX三维制作地形图教程
- 通过ExifInterface 读取图片信息
- 通过ExifInterface 读取图片信息
- Unity CustomFont (怎么制作图片文字)
- Unity通过Php上传图片分享
- Unity Spine 换图(通过外部图片)
- 【Unity】Unity中通过纹理截屏将图片保存到本地
- IOS 小技能 通过颜色制作图片
- 通过ffmpeg包制作GIF图片
- JS制作简单图片轮播--通过调整margin制作
- JavaScript移动
- 什么是原子操作?Linux下有哪些原子操作API
- 程序28
- vector,map和set笔记
- 巧妙利用豆瓣,布局长尾关键词的暴
- unity 通过图片信息制作地形图
- 一键将Excel中的零0值快速隐藏不仅适用于当前表和当前区域
- jquery阻止事件冒泡及解决办法 live
- 剑指offer——二维数组的查找
- Excel工作表默认都是手动一个个表的修改内容如何批量一次性修改
- 程序29
- 那些问题的神回复(一)
- android 笔迹重绘 demo
- 牛客网---2016---搜狗矩阵元素相乘