如何在unity3d开始界面制作中制作一个二十面体

查看: 11115|回复: 9
在线时间81 小时性别保密最后登录注册时间主题帖子精华0积分475阅读权限30UID1019221
中级会员, 积分 475, 距离下一级还需 25 积分
钻石0 颗热心度1 威望0 金币53 枚
正十二面体3D模型:
正二十面体3D模型:
我是个新手,我就是做不出如以上网址的正十二面体3D模型、正二十面体3D模型。哪位高手帮帮我,谢谢。
在线时间81 小时性别保密最后登录注册时间主题帖子精华0积分475阅读权限30UID1019221
中级会员, 积分 475, 距离下一级还需 25 积分
钻石0 颗热心度1 威望0 金币53 枚
正二十面体3D模型:
在线时间2504 小时性别保密MSN 最后登录注册时间主题帖子精华0积分18096阅读权限60UID343027
钻石0 颗热心度601 威望33 金币12508 枚
把代码复制到时间轴上运行就可以了。
在线时间81 小时性别保密最后登录注册时间主题帖子精华0积分475阅读权限30UID1019221
中级会员, 积分 475, 距离下一级还需 25 积分
钻石0 颗热心度1 威望0 金币53 枚
我已试过了,但提示多处错误,我是个新手,处理不来。谢谢楼上的朋友的回答。谢谢了。
在线时间81 小时性别保密最后登录注册时间主题帖子精华0积分475阅读权限30UID1019221
中级会员, 积分 475, 距离下一级还需 25 积分
钻石0 颗热心度1 威望0 金币53 枚
正二十面体提示45行有错: 45行代码是spDraw.graphics.lineStyle(4,0×0099ff);
var r:Number = 100;
var mcArr:Array = [];
var f:Number = 400;
var sp:Sprite=new Sprite();
addChild(sp);
sp.x = 275;
sp.y = 200;
var spDraw:Sprite=new Sprite();
addChild(spDraw);
spDraw.x = 275;
spDraw.y = 200;
for (var i:int=0; i&12; i++)
var mc:MovieClip=new MovieClip();
sp.addChild(mc);
mcArr.push(mc);
if (i == 0)
&&mc.x = 0,mc.y =&&-&&r,mc.z = 0;
else if (i==11)
&&mc.x = 0,mc.y = r,mc.z = 0;
else if (i&=5)
&&mc.x = r * Math.cos(26.6 * Math.PI / 180),mc.y =&&-&&r * Math.sin(26.6 * Math.PI / 180),mc.z = 0;
&&mc.x =&&-&&r * Math.cos(26.6 * Math.PI / 180),mc.y = r * Math.sin(26.6 * Math.PI / 180),mc.z = 0;
for (i=1; i&11; i++)
mcArr[i].transform.matrix3D.appendRotation(i*72,Vector3D.Y_AXIS);
addEventListener(Event.ENTER_FRAME,frame);
function frame(e)
spDraw.graphics.clear();
spDraw.graphics.lineStyle(4,0×0099ff);
for (var i=0; i&mcArr. i++)
&&mcArr[i].transform.matrix3D.appendRotation(-(mouseX-275)/50,Vector3D.Y_AXIS);
&&mcArr[i].transform.matrix3D.appendRotation((mouseY-200)/50,Vector3D.X_AXIS);
&&//响应鼠标;
&&mcArr[i].rz = mcArr[i].transform.getRelativeMatrix3D(sp).position.z;
&&mcArr[i].rx = mcArr[i].transform.getRelativeMatrix3D(sp).position.x*(f/(f+mcArr[i].rz));
&&mcArr[i].ry = mcArr[i].transform.getRelativeMatrix3D(sp).position.y*(f/(f+mcArr[i].rz));
&&//利用焦距实现透视
spDraw.graphics.moveTo(mcArr[0].rx,mcArr[0].ry);
spDraw.graphics.lineTo(mcArr[1].rx,mcArr[1].ry);
spDraw.graphics.moveTo(mcArr[0].rx,mcArr[0].ry);
spDraw.graphics.lineTo(mcArr[2].rx,mcArr[2].ry);
spDraw.graphics.moveTo(mcArr[0].rx,mcArr[0].ry);
spDraw.graphics.lineTo(mcArr[3].rx,mcArr[3].ry);
spDraw.graphics.moveTo(mcArr[0].rx,mcArr[0].ry);
spDraw.graphics.lineTo(mcArr[4].rx,mcArr[4].ry);
spDraw.graphics.moveTo(mcArr[0].rx,mcArr[0].ry);
spDraw.graphics.lineTo(mcArr[5].rx,mcArr[5].ry);
spDraw.graphics.lineTo(mcArr[1].rx,mcArr[1].ry);
spDraw.graphics.lineTo(mcArr[2].rx,mcArr[2].ry);
spDraw.graphics.lineTo(mcArr[3].rx,mcArr[3].ry);
spDraw.graphics.lineTo(mcArr[4].rx,mcArr[4].ry);
spDraw.graphics.lineTo(mcArr[5].rx,mcArr[5].ry);
spDraw.graphics.moveTo(mcArr[11].rx,mcArr[11].ry);
spDraw.graphics.lineTo(mcArr[6].rx,mcArr[6].ry);
spDraw.graphics.moveTo(mcArr[11].rx,mcArr[11].ry);
spDraw.graphics.lineTo(mcArr[7].rx,mcArr[7].ry);
spDraw.graphics.moveTo(mcArr[11].rx,mcArr[11].ry);
spDraw.graphics.lineTo(mcArr[8].rx,mcArr[8].ry);
spDraw.graphics.moveTo(mcArr[11].rx,mcArr[11].ry);
spDraw.graphics.lineTo(mcArr[9].rx,mcArr[9].ry);
spDraw.graphics.moveTo(mcArr[11].rx,mcArr[11].ry);
spDraw.graphics.lineTo(mcArr[10].rx,mcArr[10].ry);
spDraw.graphics.lineTo(mcArr[6].rx,mcArr[6].ry);
spDraw.graphics.lineTo(mcArr[7].rx,mcArr[7].ry);
spDraw.graphics.lineTo(mcArr[8].rx,mcArr[8].ry);
spDraw.graphics.lineTo(mcArr[9].rx,mcArr[9].ry);
spDraw.graphics.lineTo(mcArr[10].rx,mcArr[10].ry);
spDraw.graphics.moveTo(mcArr[1].rx,mcArr[1].ry);
spDraw.graphics.lineTo(mcArr[9].rx,mcArr[9].ry);
spDraw.graphics.lineTo(mcArr[2].rx,mcArr[2].ry);
spDraw.graphics.lineTo(mcArr[10].rx,mcArr[10].ry);
spDraw.graphics.lineTo(mcArr[3].rx,mcArr[3].ry);
spDraw.graphics.lineTo(mcArr[6].rx,mcArr[6].ry);
spDraw.graphics.lineTo(mcArr[4].rx,mcArr[4].ry);
spDraw.graphics.lineTo(mcArr[7].rx,mcArr[7].ry);
spDraw.graphics.lineTo(mcArr[5].rx,mcArr[5].ry);
spDraw.graphics.lineTo(mcArr[8].rx,mcArr[8].ry);
spDraw.graphics.lineTo(mcArr[1].rx,mcArr[1].ry);
在线时间81 小时性别保密最后登录注册时间主题帖子精华0积分475阅读权限30UID1019221
中级会员, 积分 475, 距离下一级还需 25 积分
钻石0 颗热心度1 威望0 金币53 枚
正十二面体,提示第7、17行有错误
var mcArr:Array=[];//放五边形的数组
var r:Number=60;//五边形半径
var d:Number=100;//中心到顶点距离
var sp:Sprite=new Sprite();//容器
sp.x=275,sp.y=200;
addChild(sp);
function drawFive(r:Number=60,color:Number=0×0000ff):Sprite { var pointArr:Array=[];
for (var i:int=0; i&5; i++) {
&&var point:Point=new Point();
&&point.x=r*Math.cos(i*Math.PI*2/5);
&&point.y=r*Math.sin(i*Math.PI*2/5);
&&pointArr.push(point);
var sp:Sprite=new Sprite();
sp.graphics.lineStyle(0,0×000000); sp.graphics.beginFill(color,0.9);
sp.graphics.moveTo(pointArr[0].x,pointArr[0].y);
for (i=1; i&=5; i++) {
&&sp.graphics.lineTo(pointArr[i%5].x,pointArr[i%5].y);
sp.graphics.endFill();
//画五边形的函数
for (var i:int=0; i&12; i++) {
var mc:Sprite=drawFive(r,Math.random()*0xffffff);
sp.addChild(mc);
mc.z=- Math.sqrt(d*d-r*r);//所有五边形初始时都与z轴垂直
mcArr.push(mc);
mcArr[6].transform.matrix3D.appendRotation(180,Vector3D.Y_AXIS);//将一个旋转到对面
for (i=1; i&=5; i++) {
mcArr.transform.matrix3D.appendRotation(116.56505,Vector3D.Y_AXIS);//相邻面夹角为116.56505度
mcArr.transform.matrix3D.appendRotation(36-(i-1)*72,Vector3D.Z_AXIS);//绕z轴分布
mcArr[i+6].transform.matrix3D.appendRotation(180+116.56505,Vector3D.Y_AXIS);//从前面转到斜后方
mcArr[i+6].transform.matrix3D.appendRotation(36-(i-1)*72,Vector3D.Z_AXIS);
addEventListener(Event.ENTER_FRAME,frame);
function frame(e) {
for (var i:int=0; i&mcArr. i++) {
&&mcArr.transform.matrix3D.appendRotation(-(mouseX-275)/10,Vector3D.Y_AXIS);
&&mcArr.transform.matrix3D.appendRotation((mouseY-200)/10,Vector3D.X_AXIS);//响应鼠标旋转
mcArr.sortOn(“z”,18);//按z轴排序
for (i=0; i&mcArr. i++) {
&&sp.setChildIndex(mcArr,i);//重新设置层深
在线时间2504 小时性别保密MSN 最后登录注册时间主题帖子精华0积分18096阅读权限60UID343027
钻石0 颗热心度601 威望33 金币12508 枚
本帖最后由 cao4811 于
07:53 编辑
第45行,把0×0099ff的x改成英文状态下输入的x就可以了。第7行、17行也是同样的。
总评分:&金币 + 3&
热心度 + 1&
在线时间399 小时性别保密最后登录注册时间主题帖子精华0积分2589阅读权限50UID903550
支柱会员, 积分 2589, 距离下一级还需 411 积分
钻石0 颗热心度10 威望0 金币1463 枚
好像程序问题较多,没法运行。
http://qinchuanyouran.16789.net/
在线时间17 小时性别保密最后登录注册时间主题帖子精华0积分139阅读权限15UID113977
普通会员, 积分 139, 距离下一级还需 61 积分
钻石0 颗热心度0 威望0 金币26 枚
楼主辛苦了!谢谢!!!
在线时间81 小时性别保密最后登录注册时间主题帖子精华0积分475阅读权限30UID1019221
中级会员, 积分 475, 距离下一级还需 25 积分
钻石0 颗热心度1 威望0 金币53 枚
谢谢“水晶长老”。我已处理成功了。
正20面体:
正12面体:
源码文件:
附件: 你需要才可以下载或查看附件。没有帐号?
部分带宽支持: |更多频道内容在这里查看
爱奇艺用户将能永久保存播放记录
过滤短视频
暂无长视频(电视剧、纪录片、动漫、综艺、电影)播放记录,
使用您的微博帐号登录,即刻尊享微博用户专属服务。
使用您的QQ帐号登录,即刻尊享QQ用户专属服务。
使用您的人人帐号登录,即刻尊享人人用户专属服务。
按住视频可进行拖动
把视频贴到Blog或BBS
当前浏览器仅支持手动复制代码
视频地址:
flash地址:
html代码:
通用代码:
通用代码可同时支持电脑和移动设备的分享播放
收藏成功,可进入查看所有收藏列表
方式1:用手机看
用爱奇艺APP或微信扫一扫,在手机上继续观看:
教你如何制作完美二十面体电阻框架
方式2:一键下载至手机
限爱奇艺安卓6.0以上版本
使用微信扫一扫,扫描左侧二维码,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:&&
设备搜寻中...
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
连接失败!
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
部安卓(Android)设备,请点击进行选择
请您在手机端下载爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:&&
爱奇艺云推送
请您在手机端登录爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
180秒后更新
打开爱奇艺移动APP,点击“我的-扫一扫”,扫描左侧二维码进行登录
没有安装爱奇艺视频最新客户端?
爸爸去哪儿2游戏 立即参与
教你如何制作完美二十面体电阻框架
播放量数据:
593人已订阅
你可能还想订阅他们:
{{#needAdBadge}} 广告{{/needAdBadge}}
&正在加载...
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制
安装爱奇艺视频客户端,
马上开始为您下载本片
5秒后自动消失
&li data-elem="tabtitle" data-seq="{{seq}}"& &a href="javascript:void(0);"& &span>{{start}}-{{end}}&/span& &/a& &/li&
&li data-downloadSelect-elem="item" data-downloadSelect-selected="false" data-downloadSelect-tvid="{{tvid}}"& &a href="javascript:void(0);"&{{pd}}&/a&
选择您要下载的《
色情低俗内容
血腥暴力内容
广告或欺诈内容
侵犯了我的权力
还可以输入
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Unity3D研究院之与根据动态的两个轨迹点绘制面详解(二十)
Unity3D研究院之与根据动态的两个轨迹点绘制面详解(二十)
围观23855次
编辑日期: 字体:
大家应该知道3D世界中任何的面都是由三角形绘制完成的,因为任何无规则的集合图形都可以由三角形来组成。比如四边形,无论是正四边形还是无规则四边形都可以由两个三角形拼接而成。结合本文的标题大家仔细想想,如果需要绘制一个动态无规则面其实只需要得到动态的两个轨迹点即可,那么结合下面的图片大家仔细在想想。
(点击图片,查看大图)
暂时我们先忽略Z轴(这样在平面中看得更清楚),假设Z轴坐标都为0。假设游戏中有两个轨迹点在动态的增加与改变,最后将这两个点改变的轨迹拼接起来就是它们生成的面。如上图所示,第一个点的轨迹是“ 3,4,5,6,7” 第二个点的轨迹是“2,1,10,9,8” 。这两个点的长度是可变的,前提是他们两个的数量必需完全一样。接着,如下图所示,我们将这些点两两相连起来,目前一共形成了8个三角形面(可根据两个动态点的数量而确定整个网格面三角形面的数量)。最后我们将这8个三角形填充上同样的颜色,就可以实现一个完整的立体网格面。
(点击图片,查看大图)
原理很简单,就是这样的我相信大家看到这里大家都能明白,接着我们就学习如何使用代码来实现它。首先创建Unity工程,接着创建一个空的游戏对象,然后给该游戏对象绑定Mesh Filter组件 与 Mesh Renderer组件。
Mesh Filter组件:表示网格面,这个网格面是由我们使用代码将所有三角形拼接起来生成的面。
Mesh Renderer组件:表示表示网格的渲染,可设置一个渲染的材质,它包括贴图与颜色。
如下图所示,我说说里面比较重要的属性。Mesh Renderer中,Materials下拉列表中可设置网格模型的材质,此时我们设置了一个红色的材质。 Mesh Filter:目前为None,也不用再编辑器中为它赋值,因为这个网格模型我们会在代码中生成并且赋值。在下面就是方刚我们设置红色的材质资源,Shader中设置了贴图的属性,目前是GUI/ TextShader。它表示这个材质的渲染级别在GUI上,就是优先级是最一层的。举个例子无论在这个网格模型的前面绘制多少模型,它永远都会在最前面显示。就这个例子而言它的存在并不是必需的,其实Shader的选项还有很多,可透明、不可透明、镜面、反射等等,后期我会向大家详细道来。
OK,现在资源文件都已经准备完毕,下面我们学习如何来绘制一个三角形,从简单的开始。。把下面的代码绑定在摄像机对象当中。
123456789101112131415161718192021222324252627282930313233343536
using UnityEngine;using System.Collections.Generic;using System;&public class Test : MonoBehaviour {& void Start () {
//得到MeshFilter对象,目前是空的。
MeshFilter meshFilter = (MeshFilter)GameObject.Find("face").GetComponent(typeof(MeshFilter));
//得到对应的网格对象
Mesh mesh = meshFilter.mesh;&
//三角形顶点的坐标数组
Vector3[] vertices = new Vector3[3];
//三角形顶点ID数组
int[] triangles&& = new int[3];&
//三角形三个定点坐标,为了显示清楚忽略Z轴
vertices[0] = new Vector3(0,0,0);
vertices[1] = new Vector3(0,1,0);
vertices[2] = new Vector3(1,0,0);&
//三角形绘制顶点的数组
triangles[0] =0;
triangles[1] =1;
triangles[2] =2;&
mesh.vertices = vertices;&
mesh.triangles = triangles;& }&}
代码中有两个非常重要的概念,就是三角形顶点数组与坐标数组。先说说坐标数组,假设需要绘制一个四边形,此时三角形坐标数组的长度应当是4,它保存着四边形四个顶点的坐标。然后是顶点数组,四边形是由两个三角形组成,然而一个三角形是由3个顶点组成,两个三角形就应当是6个顶点组成,无论多少个三角形它们的结构都应当是以此类推。
注解1:这里是将模型的顶点数组与坐标数组赋值给网格模型,还记得刚刚在创建Mesh Filter时,当时没有在编辑器中给网格模型赋值,实际上代码走到这里就会重新为网格模型MeshFilter赋值,接着我们在代码中绘制的三角形就会显示在屏幕当中。
如图所示,三角形已经绘制在屏幕当中。 图中数组 0 1 2 表示该三角形的三个顶点的ID。这个ID对应代码中对应vertices数组索引顶点的坐标。
下面我们修改一下代码,让屏幕中一共绘制4个三角形。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
using UnityEngine;using System.Collections.Generic;using System;&public class Test : MonoBehaviour {&&&&&//网格模型顶点数量 private int VERTICES_COUNT = 6;& void Start () {
//得到MeshFilter对象,目前是空的。
MeshFilter meshFilter = (MeshFilter)GameObject.Find("face").GetComponent(typeof(MeshFilter));
//得到对应的网格对象
Mesh mesh = meshFilter.mesh;&
//三角形顶点的坐标数组
Vector3[] vertices = new Vector3[VERTICES_COUNT];&
//得到三角形的数量
int triangles_count = VERTICES_COUNT - 2;&
//三角形顶点ID数组
int[] triangles&& = new int[triangles_count *3];&
//三角形三个定点坐标,为了显示清楚忽略Z轴
vertices[0] = new Vector3(0,0,0);
vertices[1] = new Vector3(0,1,0);
vertices[2] = new Vector3(1,0,0);
vertices[3] = new Vector3(1,1,0);
vertices[4] = new Vector3(2,0,0);
vertices[5] = new Vector3(2,1,0);&
//三角形绘制顶点的数组
triangles[0] =0;
triangles[1] =1;
triangles[2] =2;
triangles[3] =3;
triangles[4] =2;
triangles[5] =1;&
triangles[6] =2;
triangles[7] =3;
triangles[8] =4;&
triangles[9] =5;
triangles[10] =4;
triangles[11] =3;&&&&&
//绘制三角形
mesh.vertices = vertices;&
mesh.triangles = triangles;& }&}
已知模型的顶点数量,顶点数量减去2就是三角形的数量,三角形的数量在乘以3就是三角形顶点的数量。根据这个公式计算得知,上述代码中共绘制4个三角形,顶点坐标数组应当是6,顶点ID数组应当是12。多个三角形在顶点ID数组中排列方式比较特殊,大家需要仔细记录一下不然无法绘制出正确的三角形。如下图所示,由于我这边没有合适的3D坐标点,就用正三角形拼接出一个正四边形,这个四边形是由6个顶点4个小三角形组成 ,看到这里思路清晰的朋友应当明了无规则四边形的绘制原理和它完全一样。只需要传入适当的3D坐标点即可。
根据上面的逻辑,我们修改一下算法。假设三角形的顶点坐标为任意数量,我们需要更根据顶点坐标数量来计算对应顶点ID的数组内容。在for循环中start =0 与end =3的含义是绘制从顶点坐标数组中索引为0的顶点开始绘制到数组索引为3的顶点,也就说是这里从0到3绘制了3个三角形。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
using UnityEngine;using System.Collections.Generic;using System;&public class Test : MonoBehaviour {&&&&&//网格模型顶点数量 private int VERTICES_COUNT = 6;& void Start () {
//得到MeshFilter对象,目前是空的。
MeshFilter meshFilter = (MeshFilter)GameObject.Find("face").GetComponent(typeof(MeshFilter));
//得到对应的网格对象
Mesh mesh = meshFilter.mesh;&
//三角形顶点的坐标数组
Vector3[] vertices = new Vector3[VERTICES_COUNT];&
//得到三角形的数量
int triangles_count = VERTICES_COUNT - 2;&
//三角形顶点ID数组
int[] triangles&& = new int[triangles_count *3];&
//三角形三个定点坐标,为了显示清楚忽略Z轴
vertices[0] = new Vector3(0,0,0);
vertices[1] = new Vector3(0,1,0);
vertices[2] = new Vector3(1,0,0);
vertices[3] = new Vector3(1,1,0);
vertices[4] = new Vector3(2,0,0);
vertices[5] = new Vector3(2,1,0);&&&&&
//绘制三角形
mesh.vertices = vertices;&
//起始三角形顶点
int start = 0;&
//结束三角形的顶点
int end = 3;&
for(int i = start; i &end; i++)
for(int j = 0; j & 3; j++)
if( i%2 ==0)
triangles[3*i + j] = i +j;
triangles[3*i + j] = i + 2-j;
mesh.triangles = triangles; }}
如下图所示,根据上面的逻辑算法,共绘制了3个三角形,并且顶点坐标ID是由 0 到3 。 说到这里请大家仔细想想本文的标题内容,其实两个动态轨迹的点就是在维护triangles顶点坐标数组。triangles[0]、triangles[2]、triangles[4]……表示一个轨迹点的值,triangles[1]、triangles[3]、triangles[5]……就表示另一个轨迹点的值,最终将它们通过上面的算法将三角形面连接起来那么就是动态的两个点轨迹绘制面了。
Unity3D其实非常好玩,上手虽然很简单,但是想深入其实并没有那么容易,今天这篇文章的思路已经写完,如果还是没能明白的朋友请仔细揣摩三角形与四边形之间的却别,哇咔咔,已经不早了我也得睡觉了,明天还得上班 GOGOGOGOGO加油~希望我们大家可以共同学习,共同进步。
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!1637人阅读
Unity 3D引擎(27)
Mesh类是Unity用脚本创建和修改3D模型的重要脚本类。
本文以自定义编译器菜单的方式,实现了Unity创建正二十面体的功能扩展。
博文首发:
添加了各种Shader材质球+Halo的效果图:
关于Mesh编程相关内容网上有很多资料,这里就不再赘述了。
创建Editor文件夹(若有就不用),将以下源代码保存为MyEditor.cs文件,存入文件夹中。
/// &summary&
/// Mesh网格编程 —— 点击拓展菜单,创建正二十面体
/// Created by 杜子兮()
All Rights Reserved.
/// &/summary&
using UnityE
using UnityE
// 使用编译器类
using System.C
public class MyEditor : EditorWindow {
// 注意:该类继承EditorWindow,只能包含静态成员
static Vector3[] Vs;
// 模型顶点坐标数组
static Vector2[] UVs;
// UV贴图坐标
static Vector3[]
static Vector4[]
static int[] Ts;
// 三角形的点序列
// 添加菜单项,并放置最顶端
[MenuItem(&GameObject/Create Other/正二十面体&, false, -30)]
static void CreateRegular(){
// 先按12个顶点开辟顶点数组
Vs = new Vector3[12];
// 正二十面体顶点公式(度娘可查)
float m = Mathf.Sqrt(50 - 10 * Mathf.Sqrt(5)) / 10;
float n = Mathf.Sqrt(50 + 10 * Mathf.Sqrt(5)) / 10;
// 按公式顺序对顶点坐标赋值
Vs[0] = new Vector3( m, 0, n);
Vs[1] = new Vector3( m, 0,-n);
Vs[2] = new Vector3(-m, 0, n);
Vs[3] = new Vector3(-m, 0,-n);
Vs[4] = new Vector3( 0, n, m);
Vs[5] = new Vector3( 0,-n, m);
Vs[6] = new Vector3( 0, n,-m);
Vs[7] = new Vector3( 0,-n,-m);
Vs[8] = new Vector3( n, m, 0);
Vs[9] = new Vector3(-n, m, 0);
Vs[10] = new Vector3( n,-m, 0);
Vs[11] = new Vector3(-n,-m, 0);
// 正二十面体三角形的点序列
Ts = new int[] {6,4,8, 9,4,6, 6,3,9, 6,1,3, 6,8,1,
8,10,1, 8,0,10, 8,4,0, 4,2,0, 4,9,2,
9,11,2, 9,3,11, 3,1,7, 1,10,7, 10,0,5,
0,2,5, 2,11,5, 3,7,11, 5,11,7, 10,5,7};
// 根据面的顺序,重新创建新的顶点数组,用于计算顶点法线
Vector3[] newVs = new Vector3[Ts.Length];
for (int i = 0; i & newVs.L i++) {
Debug.Log(Vs[Ts[i]]);
newVs[i] = Vs[Ts[i]];
Vs = newVs;
UVs = new Vector2[Vs.Length];
normals = new Vector3[Vs.Length];
tangents = new Vector4[Vs.Length];
// 根据新的点,设置三角面的顶点ID并计算点法线
for (int i = 0; i & Ts.Length - 2; i+=3) {
Vector3 normal = Vector3.Cross(Vs[i + 1] - Vs[i], Vs[i + 2] - Vs[i]);
// 计算点的法线
for (int j = 0; j & 3; j++) {
Ts[i + j] = i +
// 重新设置面的顶点ID
normals[i + j] =
// 点的法线赋值
// 设置每个点的切线和UV
for (int i = 0; i & Vs.L i++) {
tangents[i] = new Vector4(-1, 0, 0, -1);
UVs[i] = new Vector2(Vs[i].x, Vs[i].y);
// 调用创建对象函数
CreateObjectByMesh(&Icosahedron&);
// 创建对象函数(这个功能提出来,方便以后扩展)
static void CreateObjectByMesh(string name) {
GameObject regular = new GameObject();
// 创建游戏对象
regular.name =
// 根据参数命名
regular.AddComponent&MeshFilter&();
// 添加MeshFilter组件
regular.AddComponent&MeshRenderer&();
// 添加MeshRenderer组件
mesh = new Mesh();
// 创建网格
mesh.vertices = Vs;
// 网格的顶点
mesh.triangles = Ts;
// 网格的三角形
mesh.uv = UVs;
// 网格的UV坐标
mesh.normals =
// 网格的法线
mesh.tangents =
// 网格的切线
regular.GetComponent&MeshFilter&().mesh = // 添加网格
在菜单中选择
GameObject -& Create Other -& 正二十面体
创建正二十面体游戏对象。
可根据喜好添加材质,选择Shander以及其他效果。
正二十面体的实现有一个比较特别的地方,就是顶点数组创建了两次。
因为空间上的规律比较难搞,所以第一次是手动录入的。
但是考虑到要计算好多点法线,第二次顶点数组是根据第一次三角形顶点序列自动生成的。
此外,本例的UV坐标和切线没有太多的处理,贴图相关的功能还有待改善。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:91099次
积分:1410
积分:1410
排名:千里之外
原创:41篇
译文:17篇
评论:61条
游戏开发与虚拟现实QQ群:
(4)(1)(1)(2)(8)(3)(3)(6)(3)(3)(5)(3)(2)(2)(4)(4)(1)(1)(1)(1)(1)(1)(1)(1)(1)

我要回帖

更多关于 unity制作开始界面 的文章

 

随机推荐