码迷,mamicode.com
首页 > 其他好文 > 详细

Opengl ES 线的三角化

时间:2016-05-07 11:19:24      阅读:257      评论:0      收藏:0      [点我收藏+]

标签:

 本文主要讨论将线扩展成2d线面的算法

  技术分享

将p0p1这条直线  扩展成面 很简单     

Vec2f line = p1 - p0

Vec2f normal = Vec2f( -line.y, line.x).normalized().

Vec2f a = p0 - thickness * normal;
Vec2f b = p0 + thickness * normal;
Vec2f c = p1 - thickness * normal;
Vec2f d = p1 + thickness * normal;

如果是直线这么处理就可以了,但是如果有多段线们还需要计算交点的地方
技术分享
首先我们先求出 t
Vec2f t = ( (p2-p1).normalized() + (p1-p0).normalized() ).normalized()
其次 在求出m
Vec2f m = Vec2f( -t.y, t.x )
最后再求出d的长度
float d = thickness / miter.dot( normal )

根据上述获得内容就能得到想要的所有顶点,然后根据这些顶点构建三角面片即可

代码大致如下:
void trianglePolyLine( const Vec2f &p0, const Vec2f &p1, const Vec2f &p2, const Vec2f &p3 , PosArray &<span style="font-family:'courier new', courier, monospace;">mesh</span>)
    {
        if(p1 == p2) return;
        
        Vec2f line = (p2 - p1).normalize();
        
        Vec2f normal = Vec2f(-line.Y, line.X).normalize();
        
        Vec2f tangent1 = (p0 == p1) ? line : ((p1-p0).normalize() + line).normalize();
        Vec2f tangent2 = (p2 == p3) ? line : ((p3-p2).normalize() + line).normalize();
        
        Vec2f miter1 = Vec2f(-tangent1.Y, tangent1.X);
        Vec2f miter2 = Vec2f(-tangent2.Y, tangent2.X);
        
        
        float length1 = radius / normal.dotProduct(miter1);
        float length2 = radius / normal.dotProduct(miter2);
        
        if(true) {
            PUSH(p1 - length1 * miter1);
            PUSH(p2 - length2 * miter2 );
            PUSH(p1 + length1 * miter1);
            PUSH(p2 + length2 * miter2 );
        }
    }
调用代码如下
  for(int i = 0;i<vertexes.size();++i) {
                int a = ((i-1) < 0) ? 0 : (i-1);
                int b = i;
                int c = ((i+1) >= vertexes.size()) ? vertexes.size()-1 : (i+1);
                int d = ((i+2) >= vertexes.size()) ? vertexes.size()-1 : (i+2);
                
                trianglePolyLine( vertexes[a], vertexes[b], vertexes[c], vertexis[d],<span style="font-family:'courier new', courier, monospace;">mesh</span> );
            }
vertexes表示多段线,mesh表示构建的顶点数组  讲次数组直接以GL_Lines绘制
效果大致如下
技术分享

请注意 以上过程在两段线夹角比较小的时候出问题,所有请慎用..

Opengl ES 线的三角化

标签:

原文地址:http://blog.csdn.net/tlglove326/article/details/51330550

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!