找回密码
 注册帐号

扫一扫,访问微社区

MemoryC 【MemoryC图形学基础系列】(二)Unity中Mesh的半边数据结构构建(续)

24
回复
1622
查看
[ 复制链接 ]
排名
1347
昨日变化

29

主题

273

帖子

2756

积分

Rank: 9Rank: 9Rank: 9

UID
175038
好友
47
蛮牛币
3350
威望
0
注册时间
2016-10-12
在线时间
634 小时
最后登录
2019-6-19

专栏作家活力之星

2018-12-20 21:00:00 显示全部楼层 阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
【MemoryC图形学基础系列】(二)              

————Unity中Mesh的半边数据结构构建(续)


继上一篇,我们这篇放代码。

1、HalfEdge类



[C#] 纯文本查看 复制代码
    /// <summary>
    /// 半边
    /// </summary>
    public class HalfEdge {
        //
        public int index;//id
        public Vertex FromVertex;//起点
        public Vertex ToVertex;//终点
        public Edge edge;//边
        public Face face;//面
        //法线
        public Vector3 Normal;
        //前、后、反向
        public HalfEdge Previous;
        public HalfEdge Next;
        public HalfEdge Opposite;

        /// <summary>
        /// 构造方法
        /// </summary>
        public HalfEdge(int id) {
            index = id;
        }

        /// <summary>
        ///半边是否在边界上
        /// </summary>
        public bool OnBoundary {
            get {
                return (face==null);
            }
        }
    }

2、Vertex类


[C#] 纯文本查看 复制代码
    /// <summary>
    /// 顶点
    /// </summary>
    public class Vertex {
        //坐标,法线
        public Vector3 Position;
        public Vector3 Normal;
        
        //半边数据
        public HalfEdge halfEdge;//一条离开该顶点的半边
        //private HalfEdgeMesh mesh;
        public int index { private set; get; }//索引

        /// <summary>
        /// 构造方法
        /// </summary>
        /// <param name="position">顶点坐标</param>
        public Vertex(int id,Vector3 position) {
            index = id;
            Position.x = position.x;
            Position.y = position.y;
            Position.z = position.z;

            HalfEdges = new List<HalfEdge>();
        }
        /// <summary>
        /// 构造方法
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <param name="z"></param>
        public Vertex(int id,float x,float y,float z) {
            index = id;
            Position.x = x;
            Position.y = y;
            Position.z = z;

            HalfEdges = new List<HalfEdge>();
        }

        #region AdjacentsOfVertex
        //所有相邻的半边
        public List<HalfEdge> HalfEdges { get;internal set; }
        //以下方式对于边界点不适用,边界点的半边不一定存在Next半边,会导致程序崩溃
        //public IEnumerable<HalfEdge> HalfEdges {
        //    get {
        //        HalfEdge hEdge = this.halfEdge;  
        //        if (hEdge != null) {
        //            do {
        //                yield return hEdge;
        //                hEdge = hEdge.Opposite.Next;
        //            } while (hEdge != this.halfEdge&& hEdge!=null);
        //        }
        //    }
        //}
        //所有相邻的边
        public IEnumerable<Edge> Edges {
            get {
                foreach(HalfEdge hEdge in HalfEdges) {
                    yield return hEdge.edge;
                }
            }
        }
        //所有相邻的面
        public IEnumerable<Face> Faces {
            get {
                foreach (HalfEdge hEdge in HalfEdges) {
                    yield return hEdge.face;
                }
            }
        } 
        /// <summary>
        /// 该顶点的所有相邻顶点
        /// </summary>
        public IEnumerable<Vertex> Vertices {
            get {
                foreach (HalfEdge hEdge in HalfEdges) {
                    yield return hEdge.ToVertex;
                }
            }
        }
#endregion

        /// <summary>
        /// 顶点是否在边界
        /// </summary>
        public bool OnBoundary {
            get {
                if (halfEdge == null) {
                    return true;
                }

                return HalfEdges.Count == Faces.Count();
                //foreach (HalfEdge half in HalfEdges) {
                //    if (half.OnBoundary) {
                //        return true;
                //    }
                //}
                //return false;
            }
        }

    }


3、Face类


[C#] 纯文本查看 复制代码
    /// <summary>
    /// 面
    /// </summary>
    public class Face {
        public int index;//id
        public HalfEdge halfEdge;//半边
        //public Color color;//颜色
        public Vector3 Normal;
        
        public Face(int id) {
            index = id;

            HalfEdges = new List<HalfEdge>();
        }
   
        //所有相邻的半边
        public List<HalfEdge> HalfEdges { get; internal set; }
        //所有相邻的边
        public IEnumerable<Edge> Edges {
            get {
                foreach (HalfEdge hEdge in HalfEdges) {
                    yield return hEdge.edge;
                }
            }
        }
        //所有相邻的面
        public IEnumerable<Face> Faces {
            get {
                foreach (HalfEdge hEdge in HalfEdges) {
                    if (hEdge.Opposite != null && hEdge.Opposite.face != null) {
                        yield return hEdge.Opposite.face;
                    }
                }
            }
        }
        //所有相邻的顶点
        public IEnumerable<Vertex> Vertices {
            get {
                foreach (HalfEdge hEdge in HalfEdges) {
                    yield return hEdge.FromVertex;
                }
            }
        }
        /// <summary>
        ///面是否在边界上
        /// </summary>
        public bool OnBoundary {
            get {
                foreach (HalfEdge hEdge in HalfEdges) {
                    if (hEdge.Opposite.OnBoundary) {
                        return true;
                    }
                }
                return false;
            }
        }

        //更新面法线
        public void UpdateNormal() {
            int i = 0;
            IEnumerable<Vertex> vs = Vertices;
            Vector3[] vt=new Vector3[3];
            foreach (Vertex v in vs) {
                vt[i++] = v.Position;
            }
            Normal = Vector3.Cross(vt[2] - vt[0], vt[1] - vt[0]);
            Normal.Normalize();
        }
    }


4、Edge类


[C#] 纯文本查看 复制代码
    /// <summary>
    /// 边
    /// </summary>
    public class Edge {
        public int index;//id
        public HalfEdge halfEdge;//半边

        public Edge(int id) {
            index = id;
        }
        public Vertex[] TwoVertices {
            get {
                Vertex[] v = new Vertex[2];
                v[0] = halfEdge.ToVertex;
                v[1] = halfEdge.FromVertex;
                return v;
            }
        }

        public List<HalfEdge> TwoHalfEdges {
            get {
                List<HalfEdge> hs = new List<HalfEdge>();
                hs.Add(halfEdge);
                if (halfEdge.Opposite != null) {
                    hs.Add(halfEdge);
                }
                return hs;
            }
        }
        public Face[] TwoFaces {
            get {
                Face[] fs = new Face[2];
                fs[0] = halfEdge.face;
                fs[1] = halfEdge.Opposite.face;
                return fs;
            }
        }
        /// <summary>
        ///边是否在边界上
        /// </summary>
        public bool OnBoundary {
            get {
                return halfEdge.OnBoundary||halfEdge.Opposite.OnBoundary;
            }
        }
    }

5、HalfEdgeMesh类


游客,如果您要查看本帖隐藏内容请回复

6、HalfEdgeStructure类

用于HalfEdgeMesh与Mesh间的快速转化,这个诸位码友可以各显神通去构造一个适合你的工程的转化类。我的参考方案会和前面所有代码一起放到,有需求的自取(评论本帖、签到、大转盘都可以获得积分)





另外,如果转载文章到其他论坛,请注明原文链接和作者




如果本文感动了您,别忘了点文章下方的"支持""评分"哦~



he.png
he.jpg
HalfEdge类.jpg

HalfEdgeStructure.zip

3.87 KB, 下载次数: 2

售价: 8 蛮牛币  [记录]

HalfEdgeStructure

回复

使用道具 举报

排名
1347
昨日变化

29

主题

273

帖子

2756

积分

Rank: 9Rank: 9Rank: 9

UID
175038
好友
47
蛮牛币
3350
威望
0
注册时间
2016-10-12
在线时间
634 小时
最后登录
2019-6-19

专栏作家活力之星

楼主 2018-12-20 21:00:01 显示全部楼层
不知道如何删除错误上传的图片
回复 支持 反对

使用道具 举报

5熟悉之中
688/1000
排名
4965
昨日变化

0

主题

55

帖子

688

积分

Rank: 5Rank: 5

UID
283796
好友
0
蛮牛币
295
威望
0
注册时间
2018-6-1
在线时间
341 小时
最后登录
2019-5-10
2018-12-21 08:51:59 显示全部楼层
看看,学习下
回复

使用道具 举报

7日久生情
2239/5000
排名
2252
昨日变化

0

主题

916

帖子

2239

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
163777
好友
2
蛮牛币
769
威望
0
注册时间
2017-2-27
在线时间
699 小时
最后登录
2019-6-19
2018-12-21 09:00:35 显示全部楼层
马克一下
回复

使用道具 举报

6蛮牛粉丝
1381/1500
排名
1980
昨日变化

0

主题

271

帖子

1381

积分

Rank: 6Rank: 6Rank: 6

UID
68040
好友
0
蛮牛币
2006
威望
0
注册时间
2015-1-13
在线时间
426 小时
最后登录
2019-6-19
2018-12-21 09:36:10 显示全部楼层
支持支持,感谢LZ分享
回复 支持 反对

使用道具 举报

3偶尔光临
200/300
排名
14229
昨日变化

0

主题

100

帖子

200

积分

Rank: 3Rank: 3Rank: 3

UID
246267
好友
0
蛮牛币
141
威望
0
注册时间
2017-9-27
在线时间
42 小时
最后登录
2018-12-22
2018-12-21 09:44:33 显示全部楼层
MemoryC图形学基础系列】(二)Unity中Mesh的半边数据结构构建(续
回复 支持 反对

使用道具 举报

6蛮牛粉丝
1304/1500
排名
2342
昨日变化

0

主题

313

帖子

1304

积分

Rank: 6Rank: 6Rank: 6

UID
119648
好友
3
蛮牛币
1783
威望
0
注册时间
2015-8-25
在线时间
385 小时
最后登录
2019-6-14
QQ
2018-12-21 09:52:51 显示全部楼层
看看,学习下
回复

使用道具 举报

5熟悉之中
562/1000
排名
4165
昨日变化

0

主题

14

帖子

562

积分

Rank: 5Rank: 5

UID
208060
好友
0
蛮牛币
726
威望
0
注册时间
2017-2-23
在线时间
193 小时
最后登录
2019-4-10
2018-12-21 10:36:52 显示全部楼层
{:106: 厉害了
回复

使用道具 举报

4四处流浪
344/500
排名
6253
昨日变化

2

主题

25

帖子

344

积分

Rank: 4

UID
165628
好友
0
蛮牛币
1063
威望
0
注册时间
2016-9-3
在线时间
99 小时
最后登录
2019-5-9
2018-12-21 11:35:02 显示全部楼层
谢谢分享
回复

使用道具 举报

7日久生情
1626/5000
排名
1839
昨日变化

11

主题

288

帖子

1626

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
252607
好友
5
蛮牛币
14235
威望
0
注册时间
2017-11-5
在线时间
595 小时
最后登录
2019-6-19
2018-12-21 14:14:14 显示全部楼层
瞅瞅~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
回复

使用道具 举报

7日久生情
3767/5000
排名
1487
昨日变化

0

主题

2142

帖子

3767

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
219676
好友
1
蛮牛币
3525
威望
0
注册时间
2017-7-12
在线时间
771 小时
最后登录
2019-6-19

活力之星

2018-12-21 14:18:06 显示全部楼层
谢谢分享
回复

使用道具 举报

6蛮牛粉丝
1234/1500
排名
1726
昨日变化

0

主题

145

帖子

1234

积分

Rank: 6Rank: 6Rank: 6

UID
14941
好友
1
蛮牛币
2399
威望
0
注册时间
2014-2-19
在线时间
329 小时
最后登录
2018-12-22
2018-12-22 22:11:52 显示全部楼层

看看,学习下
回复

使用道具 举报

排名
21326
昨日变化

2

主题

19

帖子

83

积分

Rank: 2Rank: 2

UID
247178
好友
0
蛮牛币
74
威望
0
注册时间
2017-10-5
在线时间
39 小时
最后登录
2019-4-22
QQ
2018-12-23 21:26:32 显示全部楼层
想问一下   已知一个模型文件  能否自己绘制三角  然后把这个模型给绘制出来?

点评

【接上条】你可以重写这个函数,然后在里面使用opengl的语法进行绘制。(蛮牛点评系统有字数限制)  发表于 2018-12-23 22:41
可以的,Unity除了MeshRenderer这种集成化的工具,还提供了使用OpenGL直接绘制图形的接口。例如:OnRenderObject()函数会在系统调用该物体的绘制之后执.......  发表于 2018-12-23 22:40
回复 支持 反对

使用道具 举报

排名
21326
昨日变化

2

主题

19

帖子

83

积分

Rank: 2Rank: 2

UID
247178
好友
0
蛮牛币
74
威望
0
注册时间
2017-10-5
在线时间
39 小时
最后登录
2019-4-22
QQ
2018-12-24 10:38:01 显示全部楼层
假如我是贼 发表于 2018-12-23 21:26
想问一下   已知一个模型文件  能否自己绘制三角  然后把这个模型给绘制出来? ...

楼主  能加您个qq吗?   我就是想做一个算法   用三角绘制模型  然后控制这些三角实现分散得效果   但是不知道算法  想请教下

点评

先加***425377188  发表于 2018-12-24 16:18
回复 支持 反对

使用道具 举报

5熟悉之中
517/1000
排名
5641
昨日变化

0

主题

43

帖子

517

积分

Rank: 5Rank: 5

UID
238078
好友
0
蛮牛币
967
威望
0
注册时间
2017-8-17
在线时间
224 小时
最后登录
2019-6-18
2018-12-24 11:11:14 显示全部楼层
看一下怎么写的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则