当前位置: 首页 > news >正文

天河电子商务网站建设临安网站seo

天河电子商务网站建设,临安网站seo,中国最好的网站器域名统一,wordpress设置固定链接在Unity中,如果将一个模型文件(比如从max里面导出一个fbx文件)导入到编辑器中之后,Unity会把所有在原来在面列表中公用的顶点复制一份,保证每个三角形使用的顶点都是单独的,不与其它三角形共用顶点&#xf…

        在Unity中,如果将一个模型文件(比如从max里面导出一个fbx文件)导入到编辑器中之后,Unity会把所有在原来在面列表中公用的顶点复制一份,保证每个三角形使用的顶点都是单独的,不与其它三角形共用顶点,Unityh这么做应该有他的道理,但我尚未想明白Unity这么做的原因是什么。

        但是考虑到在有些应用中使用共用顶点能够更好的处理一些问题,这里写了一个将Unity中Mesh重叠顶点合并成公用顶点的代码,目的是将位置重叠的顶点去掉,同时也将面列表的内容更新,由一个原来有重叠顶点的Mesh获得一个新的使用公用顶点的Mesh,参考如下:

Mesh GetWeldMesh(Mesh mesh)
{Vector3[] vs = mesh.vertices;int[] ts = mesh.triangles;Debug.Log(ts.Length);Dictionary<Vector3, int> dicVert = new();for (int i = 0; i < ts.Length; i++){bool hasSamePos = false;Vector3 vert = vs[ts[i]];foreach (var kv in dicVert){Vector3 key = kv.Key;if (vert == key){if (kv.Value < ts[i]){ts[i] = kv.Value;}else{dicVert[kv.Key] = ts[i];}hasSamePos = true;break;}}if (!hasSamePos){dicVert.Add(vert, ts[i]);}}List<Vector3> listVertice = new();foreach (var kv in dicVert){listVertice.Add(kv.Key);}Mesh meshNew = new(){vertices = vs,triangles = ts};meshNew.RecalculateNormals();return meshNew;
}

        目前我能想到的这么做的用处有两个,第一个是在一种描边方法中,Shader需要将要描边的物体增加一次渲染,在这次渲染中,Shader会将网格的每个顶点沿着该顶点的法线方向向外挤出一点点,形成一个更大的轮廓,然后反面渲染,这样就形成了原物体的勾边效果,不过这里有个问题,如果使用的Unity默认的Mesh,当物体的光滑组是连续的时候,挤出的效果是没问题的,当光滑组不连续(例如一个Box),顶点挤出后会出现分离问题。你当然可以在类似max这种软件中将Box的光滑组强行编成一组,这样导入Untiy中之后挤出效果倒是没问题了,但是本身显示效果就不是硬边的效果了,这也不对啊。但是如果在使用Shader渲染Mesh的时候,使用的不是原始的Mesh,而是通过上述代码生成的新的Mesh,由于顶点是共用的,就不存在出现挤出分离的问题。关于具体的Shader就不说了,玩过Shader的都懂。

        第二个是查找物体的边界,一般来说查找物体边界的方法是找到不被两个三角形共用的边,但是Unity中Mesh默认所有的顶点都是单独被面列表使用的,根本没有所谓被两个三角形共用的边的情况,这中情况会发现所有的三角形的边都是边界,貌似行不通,所以还是需要上述方法将Unity中Mesh重叠顶点合并再去查找边界。其查找边界的代码参考如下(由于Mesh的编辑可能不止一组,所以用的返回值是List<int[]>,是顶点编号数组的列表):

	List<int[]> GetEdgeIndexes(Mesh mesh){Vector3[] vs = mesh.vertices;int[] ts = mesh.triangles;Dictionary<Edge, int> dicEdge = new();for (int i = 0; i < ts.Length; i += 3){int indexA = ts[i];int indexB = ts[i + 1];int indexC = ts[i + 2];bool hasSameEdge01 = false;bool hasSameEdge02 = false;bool hasSameEdge03 = false;KeyValuePair<Edge, int>[] kvs = dicEdge.ToArray();for (int j = 0; j < kvs.Length; j++){Edge edge = kvs[j].Key;if (edge.IsSame(indexA, indexB)) { hasSameEdge01 = true; dicEdge[edge] += 1; continue; }if (edge.IsSame(indexB, indexC)) { hasSameEdge02 = true; dicEdge[edge] += 1; continue; }if (edge.IsSame(indexC, indexA)) { hasSameEdge03 = true; dicEdge[edge] += 1; continue; }}if (!hasSameEdge01) { dicEdge.Add(new Edge(indexA, indexB), 1); }if (!hasSameEdge02) { dicEdge.Add(new Edge(indexB, indexC), 1); }if (!hasSameEdge03) { dicEdge.Add(new Edge(indexC, indexA), 1); }}List<Edge> edges = new List<Edge>();foreach (var kv in dicEdge){if (kv.Value == 1){edges.Add(kv.Key);}}foreach (var item in edges){Debug.Log(item.a + " , " + item.b);}List<int[]> listEdgeIndexes = new();while (edges.Count > 0){List<int> listTriangle = new(){edges[0].a,edges[0].b};edges.RemoveAt(0);while (true){int indexLast = listTriangle[^1];bool hasAddIndex = false;for (int i = 0; i < edges.Count; i++){Edge edge = edges[i];if (indexLast == edge.a){listTriangle.Add(edge.b);hasAddIndex = true;edges.RemoveAt(i);break;}if (indexLast == edge.b){listTriangle.Add(edge.a);hasAddIndex = true;edges.RemoveAt(i);break;}}if (!hasAddIndex){listEdgeIndexes.Add(listTriangle.ToArray());break;}}}return listEdgeIndexes;}

其中所用到的Edge类代码如下:

public class Edge
{public readonly int a;public readonly int b;public Edge(int a, int b){this.a = a;this.b = b;}public bool IsSame(Edge edge) { return (a == edge.a && b == edge.b) || (a == edge.b && b == edge.a); }public bool IsSame(int a, int b) { return (a == this.a && b == this.b) || (a == this.b && b == this.a); }
}

        下图将一个球体挖了三个洞洞,通过上述方法查找到边界,并用LineRenderer渲染了边界。

http://www.hkea.cn/news/930062/

相关文章:

  • ppt做书模板下载网站有哪些内容国际婚恋网站排名
  • 上海网站建设内容更新网络营销策划目的
  • 重庆市建设信息网站关键词查询网
  • 做哪种网站流量大怎么打广告宣传自己的产品
  • 免费表白网站制作seo网络优化推广
  • 网站建设中可能升级中国科技新闻网
  • 网站制作内容文案网站如何快速被百度收录
  • 淘宝淘宝网页版登录入口免费seo公司
  • 竹溪县县建设局网站短视频营销
  • 好的网站有哪些搜索引擎seo是什么意思
  • 做音乐网站赚钱吗做小程序的公司
  • 坪地网站建设域名流量查询工具
  • 网站建设部署万能推广app
  • 网站的重要性怎么做个网站
  • 做网站的经验百度旗下有哪些app
  • 化工网站开发推广点击器
  • 怎么访问日本竹中建设网站外贸seo推广
  • 惠阳建设局网站引流推广接单
  • 北京通州网站建设公司如何建立公司网站网页
  • 网站换程序301seo优化按天扣费
  • html5 网站自适应长尾关键词挖掘爱站工具
  • 网站设计公司(信科网络)潍坊网站定制模板建站
  • 番禺网站开发报价百度竞价排名软件
  • 做企业网站接单seo网站优化技术
  • 建设网站行业云网络推广理实一体化软件
  • 如何用自己公司网站做邮箱关键字是什么意思
  • 古典网站建设欣赏马鞍山网站seo
  • 商城网站建设报价方案免费建网站软件下载
  • 中国做美国酒店的网站好竞价托管收费标准
  • 网站开发与设计静态网页源代码站长之家app下载