예제 #1
0
        //--------------------------------------------------------------------------------------------------
        public static void SupportEdge(Transform tx, Vec3 e, Vec3 n, out Vec3 aresult, out Vec3 bresult)
        {
            n = Transform.MulT(tx.rotation, n);
            Vec3 absN = Vec3.Abs(n);
            Vec3 a = new Vec3(), b = new Vec3();

            // x > y
            if (absN.x > absN.y)
            {
                // x > y > z
                if (absN.y > absN.z)
                {
                    a.Set(e.x, e.y, e.z);
                    b.Set(e.x, e.y, -e.z);
                }

                // x > z > y || z > x > y
                else
                {
                    a.Set(e.x, e.y, e.z);
                    b.Set(e.x, -e.y, e.z);
                }
            }

            // y > x
            else
            {
                // y > x > z
                if (absN.x > absN.z)
                {
                    a.Set(e.x, e.y, e.z);
                    b.Set(e.x, e.y, -e.z);
                }

                // z > y > x || y > z > x
                else
                {
                    a.Set(e.x, e.y, e.z);
                    b.Set(-e.x, e.y, e.z);
                }
            }

            double signx = Sign(n.x);
            double signy = Sign(n.y);
            double signz = Sign(n.z);

            a.x *= signx;
            a.y *= signy;
            a.z *= signz;
            b.x *= signx;
            b.y *= signy;
            b.z *= signz;

            aresult = Transform.Mul(tx, a);
            bresult = Transform.Mul(tx, b);
        }
예제 #2
0
        //--------------------------------------------------------------------------------------------------
        public static void ComputeIncidentFace(Transform itx, Vec3 e, Vec3 n, ClipVertex[] result)
        {
            n = -Transform.MulT(itx.rotation, n);
            Vec3 absN = Vec3.Abs(n);

            if (absN.x > absN.y && absN.x > absN.z)
            {
                if (n.x > 0)
                {
                    result[0].v.Set(e.x, e.y, -e.z);
                    result[1].v.Set(e.x, e.y, e.z);
                    result[2].v.Set(e.x, -e.y, e.z);
                    result[3].v.Set(e.x, -e.y, -e.z);

                    result[0].f.inI  = 9;
                    result[0].f.outI = 1;
                    result[1].f.inI  = 1;
                    result[1].f.outI = 8;
                    result[2].f.inI  = 8;
                    result[2].f.outI = 7;
                    result[3].f.inI  = 7;
                    result[3].f.outI = 9;
                }

                else
                {
                    result[0].v.Set(-e.x, -e.y, e.z);
                    result[1].v.Set(-e.x, e.y, e.z);
                    result[2].v.Set(-e.x, e.y, -e.z);
                    result[3].v.Set(-e.x, -e.y, -e.z);

                    result[0].f.inI  = 5;
                    result[0].f.outI = 11;
                    result[1].f.inI  = 11;
                    result[1].f.outI = 3;
                    result[2].f.inI  = 3;
                    result[2].f.outI = 10;
                    result[3].f.inI  = 10;
                    result[3].f.outI = 5;
                }
            }

            else if (absN.y > absN.x && absN.y > absN.z)
            {
                if (n.y > 0)
                {
                    result[0].v.Set(-e.x, e.y, e.z);
                    result[1].v.Set(e.x, e.y, e.z);
                    result[2].v.Set(e.x, e.y, -e.z);
                    result[3].v.Set(-e.x, e.y, -e.z);

                    result[0].f.inI  = 3;
                    result[0].f.outI = 0;
                    result[1].f.inI  = 0;
                    result[1].f.outI = 1;
                    result[2].f.inI  = 1;
                    result[2].f.outI = 2;
                    result[3].f.inI  = 2;
                    result[3].f.outI = 3;
                }

                else
                {
                    result[0].v.Set(e.x, -e.y, e.z);
                    result[1].v.Set(-e.x, -e.y, e.z);
                    result[2].v.Set(-e.x, -e.y, -e.z);
                    result[3].v.Set(e.x, -e.y, -e.z);

                    result[0].f.inI  = 7;
                    result[0].f.outI = 4;
                    result[1].f.inI  = 4;
                    result[1].f.outI = 5;
                    result[2].f.inI  = 5;
                    result[2].f.outI = 6;
                    result[3].f.inI  = 5;
                    result[3].f.outI = 6;
                }
            }

            else
            {
                if (n.z > 0)
                {
                    result[0].v.Set(-e.x, e.y, e.z);
                    result[1].v.Set(-e.x, -e.y, e.z);
                    result[2].v.Set(e.x, -e.y, e.z);
                    result[3].v.Set(e.x, e.y, e.z);

                    result[0].f.inI  = 0;
                    result[0].f.outI = 11;
                    result[1].f.inI  = 11;
                    result[1].f.outI = 4;
                    result[2].f.inI  = 4;
                    result[2].f.outI = 8;
                    result[3].f.inI  = 8;
                    result[3].f.outI = 0;
                }

                else
                {
                    result[0].v.Set(e.x, -e.y, -e.z);
                    result[1].v.Set(-e.x, -e.y, -e.z);
                    result[2].v.Set(-e.x, e.y, -e.z);
                    result[3].v.Set(e.x, e.y, -e.z);

                    result[0].f.inI  = 9;
                    result[0].f.outI = 6;
                    result[1].f.inI  = 6;
                    result[1].f.outI = 10;
                    result[2].f.inI  = 10;
                    result[2].f.outI = 2;
                    result[3].f.inI  = 2;
                    result[3].f.outI = 9;
                }
            }

            for (int i = 0; i < 4; ++i)
            {
                result[i].v = Transform.Mul(itx, result[i].v);
            }
        }