参数化建模一些经验总结(3DS)

3 篇文章 0 订阅
3 篇文章 0 订阅

背景:

 在数字地球开发的时候,我们有时候为了方便, 只需要拉取一条折线, 就希望可以进行沟槽,以及其它渠道的自动化生成. 所以,这里首先第一步,就需要能对参数进行实时的建模.

效果图:

 但是在生成模型的时候,我们有时会忽略很多细节,导致生成的模型出现各种问题.

问题:

1.

比如说这种: 我只是消减了一个面,就造成了,随着相机视角,其他面显示不全(OPengl 优化渲染的时候,面的遮挡隐藏问题).

 2.优化三角面生成的顺序不一样,也会造成这种情况...

解决方案流程:

1.先看自己的XYZ坐标系,顺着坐标系进行进行三角面片的生成,

  注意: 模型中不需要指定法向,法向是根据你点的绘制顺序自动计算出来的,如果你三角面的顺序是错的,那么法向也会出错.

2.消减面之后, 就出现了盒子,那么如果不做处理,就会出现 问题1中的情况,如何解决呢? 就需要多补一层反向三角面的操作,这样,就正常绘制出来盒子内部如图.(这样面片的数量直接翻一倍....感觉不是很好,面少了还行,多了就成问题了)

关键代码:

/// <summary>
        /// 将四边形,转换成两个三角面片
        /// 注意,从左下角 & 逆时针的 规则  生成的规则,逆时针+先是对角线
        ///  4 3
        ///  1 2  
        /// </summary>
        /// <param name="quadrangle"></param>
        /// <param name="cw"></param>
        /// <returns></returns>
        public static TriangleVertex[] Quadrangle2Triangle(QuadrangleVertex quadrangle, bool ccw = true)
        {
            TriangleVertex[] triangles = new TriangleVertex[2];
            for (int i = 0; i < triangles.Length; i++)
            {
                triangles[i] = new TriangleVertex();
            }

            if(ccw == true)
            {
                //逆时针..
                triangles[0].Index1 = quadrangle.Index1;
                triangles[0].Index2 = quadrangle.Index2;
                triangles[0].Index3 = quadrangle.Index3;

                triangles[1].Index1 = quadrangle.Index1;
                triangles[1].Index2 = quadrangle.Index3;
                triangles[1].Index3 = quadrangle.Index4;
            }
            else
            {
                //顺时针针..默认为逆时针生成三角面片.
                triangles[0].Index1 = quadrangle.Index1;
                triangles[0].Index2 = quadrangle.Index4;
                triangles[0].Index3 = quadrangle.Index3;

                triangles[1].Index1 = quadrangle.Index1;
                triangles[1].Index2 = quadrangle.Index3;
                triangles[1].Index3 = quadrangle.Index2;
            }
            return triangles;
        }

 public static void Quad2Triangles(this GrooveModel groove, bool isTowFace = true)
        {
            groove.TriangleFaces.Clear();
            foreach (var item in groove.QuadFaces)
            {
                if (item.IsBuildTrigles == false) continue;
                foreach (var trigs in QuadrangleVertex.Quadrangle2Triangle(item,true))
                {
                    groove.TriangleFaces.Add(trigs);
                }

                if(isTowFace==true)
                {
                    foreach (var trigs in QuadrangleVertex.Quadrangle2Triangle(item,false))
                    {
                        groove.TriangleFaces.Add(trigs);
                    }
                }
            }

        }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值