Unity3D网格功能生成球体网格模型

本文实例为大家分享了Unity3D网格功能生成球体网格模型的具体代码,供大家参考,具体内容如下

前面已经讲过怎样使用mesh生成一个自己的网格,那么本文将会讲述怎样将这个网格变换成自己想要的形状,比如一个球体。

我们需要知道一个从平面坐标到球体坐标的映射公式。假设平面坐标是(x,y),球体坐标是(x0,y0,z0),则

球体坐标(x0,y0,z0)可以通过以下代码得到,(x,y) 对应vertices[i].x和vertices[i].y。

 v.x = r * Mathf.Cos(vertices[i].x / width * 2 * Mathf.PI) * Mathf.Cos(vertices[i].y / height * Mathf.PI - Mathf.PI / 2);
 v.y = r * Mathf.Sin(vertices[i].x / width * 2 * Mathf.PI) * Mathf.Cos(vertices[i].y / height * Mathf.PI - Mathf.PI / 2);
v.z = r * Mathf.Sin(vertices[i].y / height * Mathf.PI - Mathf.PI / 2);

完整代码在最后,将完整的脚本绑定到一个空物体上,把棋盘格图案chessboard.jpg放到Assets\Resources下,还要在场景中生成一个sphere作为显示网格顶点的辅助物体。一切就绪后,运行效果如下:

using UnityEngine;
using System.Collections;

public class BallMesh : MonoBehaviour
{

 Mesh mesh;
 Vector3[] vertices;
 Vector2[] uv;
 int[] triangles;
 Vector3[] normals;
 public GameObject sphere;
 GameObject[] spheres;

 void Start()
 {
  gameObject.AddComponent<MeshFilter>();
  gameObject.AddComponent<MeshRenderer>();
  Texture img = (Texture)Resources.Load("tm");
  gameObject.GetComponent<Renderer>().material.mainTexture = img;
  mesh = new Mesh();
  int m = 25; //row
  int n = 50; //col
  float width = 8;
  float height = 6;
  vertices = new Vector3[(m + 1) * (n + 1)];//the positions of vertices
  spheres = new GameObject[(m + 1) * (n + 1)];
  uv = new Vector2[(m + 1) * (n + 1)];
  normals = new Vector3[(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);
   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[1];
   triangles[i * 3 + 2] = triIndex[2];
  }

  int r = 10;
  for (int i = 0; i < vertices.Length; i++)
  {
   spheres[i] = Instantiate( sphere,this.transform) as GameObject;
   Vector3 v ;
   v.x = r * Mathf.Cos(vertices[i].x / width * 2 * Mathf.PI) * Mathf.Cos(vertices[i].y / height * Mathf.PI - Mathf.PI / 2);
   v.y = r * Mathf.Sin(vertices[i].x / width * 2 * Mathf.PI) * Mathf.Cos(vertices[i].y / height * Mathf.PI - Mathf.PI / 2);
   v.z = r * Mathf.Sin(vertices[i].y / height * Mathf.PI - Mathf.PI / 2);
   //v = vertices[i];

   vertices[i] = v;
   spheres[i].transform.localPosition = v;

   normals[i] = new Vector3(0,1,0);
  }

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

 }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Unity3D创建圆柱体的方法

    看到这篇文章你可能好奇unity自带圆柱体组件,直接就可以生成,为什么我们还要用代码生成.其实是最近领导对项目有一个要求,就是我们要在自写编辑器内操作圆管,也就是圆柱体.功能类似3DMax里的拉伸管线.刚开始看到这个要求我内心是拒绝的,mmp我是unity程序员不是图像学程序员啊,这看着有点底层啊.但是心想,这也是自我学习提升的机会,于是我就给领导个面子将它实现吧.我们知道如果想像3Dmax里那样操作管线,就必须用代码创建圆柱体并用代码控制他的顶点位置才能实现我们的需求.所以第一步就是用代码创建

  • Unity3D自定义创建圆锥体

    前言 这几天琢磨着开发个个人作品的时候,发现原来Unity3D官方没有提供圆锥体的创建功能,就自己做了个编辑器扩展.鉴于之前搜索Mesh编程的时候很少有博客把自己的算法讲清楚,这里我抛砖引玉,尽我所能为一些初学者提供参考,当然,算法未必优,如有更好的算法并乐意知会我则不胜感激,我是大龄转行Unity3D开发,一路行来都是自己琢磨,比较辛苦,先行谢过. 软件环境 Win10 + Unity3D 2017.3.0f3 正文 基本思路是以原点为圆锥体底部圆的中心点,以其正上方1单元处的点为圆锥体锥尖顶

  • Unity3D网格功能生成球体网格模型

    本文实例为大家分享了Unity3D网格功能生成球体网格模型的具体代码,供大家参考,具体内容如下 前面已经讲过怎样使用mesh生成一个自己的网格,那么本文将会讲述怎样将这个网格变换成自己想要的形状,比如一个球体. 我们需要知道一个从平面坐标到球体坐标的映射公式.假设平面坐标是(x,y),球体坐标是(x0,y0,z0),则 球体坐标(x0,y0,z0)可以通过以下代码得到,(x,y) 对应vertices[i].x和vertices[i].y. v.x = r * Mathf.Cos(vertice

  • python用sqlacodegen根据已有数据库(表)结构生成对应SQLAlchemy模型

    目录 应用场景 福音 快快使用 模型类效果 注意事项 今天介绍一个后台开发神器,很适合当我们数据库中已存在了这些表,然后你想得到它们的model类使用ORM技术进行CRUD操作(或者我根本就不知道怎么写modle类的时候); 手写100张表的model类? 这是......... 是不可能的,这辈子都不可能的. 因为我们有sqlacodegen神器, 一行命令获取数据库所有表的模型类. 应用场景 1.后台开发中,需要经常对数据库进行CRUD操作: 2.这个过程中,我们就经常借助ORM技术进行便利

  • Unity3D动态生成平面网格

    在编写几何着色器的时候发现默认的Plane无法满足需求,并且顶点顺序未知,于是便写了一个网格生成代码,便于生成指定大小的Plane,且顶点顺序可控. 效果如下: 一个单元格由4个顶点,两个三角面组成. 四个顶点如下图 则生成面的顶点顺序为: 左上三角形:0 -> 1 -> 2 右下三角形:2 -> 3 -> 0 Unity中顺时针绘制为正面,逆时针绘制为反面. 实现脚本如下: //PlaneBuilder.cs using System.Collections; using Sys

  • unity通过Mesh网格绘制图形球体

    本文实例为大家分享了unity通过Mesh网格绘制球体的具体代码,供大家参考,具体内容如下 接着上一篇文章说: 球体 public class 球体 : MonoBehaviour { MeshRenderer meshRenderer; MeshFilter meshFilter; List<Vector3> verts; List<int> indices; int N = 10; void Start() { verts = new List<Vector3>()

  • Python实现的NN神经网络算法完整示例

    本文实例讲述了Python实现的NN神经网络算法.分享给大家供大家参考,具体如下: 参考自Github开源代码:https://github.com/dennybritz/nn-from-scratch 运行环境 Pyhton3 numpy(科学计算包) matplotlib(画图所需,不画图可不必) sklearn(人工智能包,生成数据使用) 计算过程 输入样例 none 代码实现 # -*- coding:utf-8 -*- #!python3 __author__ = 'Wsine' im

  • 游戏开发进阶Unity网格(Mesh\动态合批\骨骼动画\蒙皮)

    目录 一.前言 二.Hello Mesh 三.萌新初识Mesh 1.引擎内置的Mesh 2.Mesh是什么 三.Mesh的创建方式 1.第三方建模软件 2.Unity建模插件:ProBuilder 3.程序动态生成网格 四.Unity中如何显示网格 1.MeshFilter:网格过滤器 2.MeshRenderer:网格渲染器 3.SkinnedMeshRenderer:蒙皮网格渲染器 3.1 骨骼动画 3.2 SkinnedMeshRenderer组件 3.2 使用BakeMesh进行优化 五

  • unity通过Mesh网格绘制图形(三角形、正方体、圆柱)

    一.介绍 Mesh类:通过脚本创建或是获取网格的类,网格包含多个顶点和三角形数组.顶点信息包含坐标和所在面的法线. unity中3D的世界的所有图形全部都是由三角形构成的. 比如unity已经装配好的几种图形我们可以看一下: 我们可以在unity中通过Mesh类来绘制图形. 所以在我们绘制其它图形之前,首先完成一个小目标,画一个三角形. 二.绘制三角形 首先做准备工作: 1.在场景中创建一个空物体,并挂载MeshRenderer和MeshFilter组件.//我们先不考虑碰撞器的问题,所以不添加

  • 分享十三个最佳JavaScript数据网格库

    JavaScript 是一种通常被用在网页开发中的编程语言.它主要是在互联网上的网页浏览器中开发出效果出众且可交互的特效.它是客户端脚本语言中的一种,是被用来作为通过用户的网页浏览器进行处理的源代码.JavaScript 是动态.高级.可解释且无类型的编程语言.JavaScript 主要被用在不是基于 Web 的环境之中,像是特定站点的浏览器,桌面小部件以及 PDF 文件.事实上,JavaScript 还被程序员们用在了视频游戏开发之中. 数据网格可以帮助解决在 HTML 表格上对带有过滤.分页

  • Unity3D实现模型随机切割

    本文实例为大家分享了Unity3D实现模型随机切割的具体代码,供大家参考,具体内容如下 模型切割的效果图如下: 我们都知道,模型是由一个个小三角形面组成的,因此我们不妨将问题简化,先实现个小目标,完成单个三角形的切割,甚至继续细分成求一条线段与某个平面的交点. 三角形与切割平面的位置关系主要有以下三种: 1. 三角形与切割平面有两个交点,一个交点在顶点上,一个交点在边上.这时,原有的三角形将被分成两个三角形,分别为013.042. 2. 三角形与切割平面有两个交点,两个交点都在边上.这时,原有的

  • Unity通过脚本创建网格Mesh的方法

    目录 1.创建一个带Mesh的物体 2.通过脚本创建Mesh 1.创建一个带Mesh的物体 Unity中的网格作为组件不能脱离物体单独存在新建脚本CreateMesh public class CreateMesh: MonoBehaviour { void Start() { //该方法会新建一个名为Mesh的GameObject,该物体上包含一个 MeshFilter 和一个 MeshRenderer GameObject gameObject = new GameObject("Mesh&

随机推荐