面捕与三角剖分

来源:互联网 发布:炫浪网络在线阅读手机 编辑:程序博客网 时间:2024/04/30 06:20




为了减少计算量,通过ABC三点构建一个矩形,遍历矩形内所有像素,如果该像素不在三角形内,则不对其处理。

下列函数如果返回 Vector2.zero 则P点不在三角形ABC内

  Vector2 PointinTriangleDetect(UV A, UV B, UV C, UV P)
    {
        UV v0 = C - A;
        UV v1 = B - A;
        UV v2 = P - A;


        float dot00 = UV.Dot(v0, v0);
        float dot01 = UV.Dot(v0, v1);
        float dot02 = UV.Dot(v0, v2);
        float dot11 = UV.Dot(v1, v1);
        float dot12 = UV.Dot(v1, v2);


        float inverDeno = 1 / (dot00 * dot11 - dot01 * dot01);
        float m= 0;
        m = (dot11 * dot02 - dot01 * dot12) * inverDeno;
        if (m< 0 || m> 1) // if u out of range, return directly
        {
            return Vector2.zero;
        }
        float n=0;
        n= (dot00 * dot12 - dot01 * dot02) * inverDeno;
        if (n< 0 || n > 1) // if v out of range, return directly
        {
            return Vector2.zero;
        }


       
        if (m+ n <= 1)
        {
       
            return new Vector2(m, n);
           
        }


        return Vector2.zero; ;
    }



三角形遍历


1.构建一张texture2D 纹理,纹理像素大小最好和采样纹理像素大小一致,这样不免采样时纹理坐标缩放计算。
2.为了减少计算量,通过ABC三点构建一个矩形,遍历矩形内所有像素,如果该像素不在三角形内,则不对其处理。
3.AP=m*AC+n*AP通过三角剖分的三个点ABCP,计算像素内一点的mn

 

纹理采样

AP=m*AC+n*AB  P-A=m(C-A)+n(B-A)
P=m(C-A)+n(B-A)+A

在采样纹理中与ABC三点对应的A’B’C’,通过m,nA’B’C’计算P’d的坐标
P’.x=m(C’.x-A’.x)+n(B’.x-A’.x)+A’.x ;
P’.y=m(C’.y-A’.y)+n(B’.y-A’.y)+A’.y ;



原创粉丝点击