背景:
在数字地球开发的时候,我们有时候为了方便, 只需要拉取一条折线, 就希望可以进行沟槽,以及其它渠道的自动化生成. 所以,这里首先第一步,就需要能对参数进行实时的建模.
效果图:
但是在生成模型的时候,我们有时会忽略很多细节,导致生成的模型出现各种问题.
问题:
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);
}
}
}
}