public OBBBoxCollider(Vector3 center, Vector3 range, Vector3 direction, ColliderChoice colliderChoice, Transform appendTransform = null, CollideFunc collideFunc = CollideFunc.OutsideLimit)
 {
     colliderRead.isOpen         = true;
     OBBposition                 = appendTransform ? appendTransform.InverseTransformPoint(center) : center;
     OBBRotation                 = appendTransform ? appendTransform.rotation * Quaternion.FromToRotation(Vector3.up, direction) : Quaternion.FromToRotation(Vector3.up, direction);
     this.appendTransform        = appendTransform;
     colliderRead.staticRotation = OBBRotation;
     colliderRead.positionOffset = OBBposition;
     colliderRead.boxSize        = new Vector3(Mathf.Abs(range.x * 0.5f), Mathf.Abs(range.y * 0.5f), Mathf.Abs(range.z * 0.5f));
     colliderRead.colliderType   = ColliderType.OBB;
     colliderRead.collideFunc    = CollideFunc.OutsideLimit;
     colliderRead.colliderChoice = colliderChoice;
 }
 public CapsuleCollider(float radius, Vector3 pointHead, Vector3 pointTail, ColliderChoice colliderChoice, Transform appendTransform = null, CollideFunc collideFunc = CollideFunc.OutsideLimit)
 {
     colliderRead.isOpen         = true;
     colliderRead.colliderType   = ColliderType.Capsule;
     colliderRead.collideFunc    = collideFunc;
     colliderRead.colliderChoice = colliderChoice;
     colliderRead.radius         = radius;
     colliderRead.length         = (pointHead - pointTail).magnitude;
     if (appendTransform != null)
     {
         this.appendTransform         = appendTransform;
         colliderRead.staticDirection = Quaternion.Inverse(appendTransform.rotation) * (pointTail - pointHead);
         colliderRead.positionOffset  = appendTransform.InverseTransformPoint(pointHead);
     }
     else
     {
         colliderRead.positionOffset  = pointHead;
         colliderRead.staticDirection = pointTail - pointHead;
     }
 }
 public CapsuleCollider(float radius, float length, Vector3 positionOffset, Vector3 direction, ColliderChoice colliderChoice, Transform appendTransform = null, CollideFunc collideFunc = CollideFunc.OutsideLimit)
 {
     colliderRead.isOpen         = true;
     colliderRead.colliderType   = ColliderType.Capsule;
     colliderRead.collideFunc    = collideFunc;
     colliderRead.colliderChoice = colliderChoice;
     colliderRead.radius         = radius;
     colliderRead.length         = length;
     if (appendTransform != null)
     {
         this.appendTransform         = appendTransform;
         colliderRead.staticDirection = Quaternion.Inverse(appendTransform.rotation) * (direction == Vector3.zero ? Vector3.up : direction);
         colliderRead.positionOffset  = Quaternion.Inverse(appendTransform.rotation) * positionOffset;
     }
     else
     {
         colliderRead.positionOffset  = positionOffset;
         colliderRead.staticDirection = direction == Vector3.zero?Vector3.up:direction;
     }
 }
Пример #4
0
        public OBBBoxCollider(Vector3 center, Vector3 size, Quaternion rotation, ColliderChoice colliderChoice, Transform appendTransform = null, CollideFunc collideFunc = CollideFunc.OutsideLimit)
        {
            colliderRead.isOpen = true;

            this.appendTransform        = appendTransform;
            colliderRead.staticRotation = appendTransform ? appendTransform.rotation * rotation:rotation;
            colliderRead.positionOffset = appendTransform ? appendTransform.InverseTransformPoint(center) : center;
            colliderRead.boxSize        = new Vector3(Mathf.Abs(size.x), Mathf.Abs(size.y), Mathf.Abs(size.z));
            colliderRead.colliderType   = ColliderType.OBB;
            colliderRead.collideFunc    = collideFunc;
            colliderRead.colliderChoice = colliderChoice;
        }
        public SphereCollider(float radius, Vector3 positionOffset, ColliderChoice colliderChoice, Transform appendTransform = null, CollideFunc collideFunc = CollideFunc.OutsideLimit)
        {
            colliderRead.isOpen = true;
            colliderRead.radius = radius;

            colliderRead.colliderType   = ColliderType.Sphere;
            colliderRead.collideFunc    = CollideFunc.OutsideLimit;
            colliderRead.colliderChoice = colliderChoice;
            if (appendTransform != null)
            {
                this.appendTransform        = appendTransform;
                colliderRead.positionOffset = positionOffset;
            }
            else
            {
                colliderRead.positionOffset = positionOffset;
            }
        }
 public OBBBox(Vector3 center, Vector3 range, Vector3 direction, ColliderChoice colliderChoice, Transform appendTransform = null, CollideFunc collideFunc = CollideFunc.Outside)
 {
     OBBposition                 = appendTransform ? appendTransform.InverseTransformPoint(center) : center;
     OBBRotation                 = appendTransform ? appendTransform.rotation * Quaternion.FromToRotation(Vector3.up, direction) : Quaternion.FromToRotation(Vector3.up, direction);
     this.appendTransform        = appendTransform;
     colliderRead.staticNormal   = OBBRotation;
     colliderRead.positionOffset = OBBposition;
     colliderRead.boxSize        = range * 0.5f;
     colliderRead.colliderType   = ColliderType.OBB;
     colliderRead.collideFunc    = CollideFunc.Outside;
     colliderRead.colliderChoice = colliderChoice;
 }
        public SphereCollider(float radius, Vector3 positionOffset, ColliderChoice colliderChoice, Transform appendTransform = null, CollideFunc collideFunc = CollideFunc.Outside)
        {
            colliderRead.radius = radius;

            colliderRead.colliderType   = ColliderType.Sphere;
            colliderRead.collideFunc    = CollideFunc.Outside;
            colliderRead.colliderChoice = colliderChoice;
            if (appendTransform != null)
            {
                this.appendTransform        = appendTransform;
                colliderRead.positionOffset = Quaternion.Inverse(appendTransform.rotation) * positionOffset;
            }
            else
            {
                colliderRead.positionOffset = positionOffset;
            }
        }
 public static PlaneCollider GetPlaneCollider(Vector3 positionOffset, Vector3 normal, Transform appendTransform = null, CollideFunc collideFunc = CollideFunc.Outside)
 {
     return(new PlaneCollider
     {
         colliderType = ColliderType.Plane,
         appendTransform = appendTransform,
         positionOffset = positionOffset,
         collideFunc = collideFunc,
         normal = normal.normalized
     });
 }
 public static PlaneCollider GetPlaneCollider(Vector3 positionOffset, Transform appendTransform = null, CollideFunc collideFunc = CollideFunc.Outside)
 {
     return(GetPlaneCollider(positionOffset, defaultNormal, appendTransform, collideFunc));
 }
 public static ColumnCollider GetColumnCollider(float radiusHead, float radiusTail, float height, Vector3 positionOffset, Quaternion rotaionoffset, Transform appendTransform = null, CollideFunc collideFunc = CollideFunc.Outside)
 {
     return(new ColumnCollider
     {
         colliderType = ColliderType.Column,
         appendTransform = appendTransform,
         positionOffset = positionOffset,
         rotaionoffset = rotaionoffset,
         radiusHead = radiusHead,
         radiusTail = radiusTail,
         height = height
     });
 }
 public static ColumnCollider GetCapsuleCollider(float radiusHead, float radiusTail, Vector3 pointHead, Vector3 pointTail, Transform appendTransform = null, CollideFunc collideFunc = CollideFunc.Outside)
 {
     return(GetColumnCollider(radiusHead, radiusTail, (pointHead - pointTail).sqrMagnitude, (pointHead + pointTail) * 0.5f, Quaternion.FromToRotation(Vector3.up, pointHead - pointTail), appendTransform, collideFunc));
 }
 public static SphereCollider GetSphereCollider(float radius, Vector3 positionOffset, Transform appendTransform = null, CollideFunc collideFunc = CollideFunc.Outside)
 {
     return(new SphereCollider
     {
         colliderType = ColliderType.Sphere,
         collideFunc = collideFunc,
         appendTransform = appendTransform,
         positionOffset = positionOffset,
         radius = radius,
     });
 }
    //normal=(V1-V0)x(V2-V0)
    //Vector3.Cross(pointB - pointA, pointC - pointA);
    //OYM:三角形需要计算法线,这个任务交给jobs完成好了
    //OYM:等下,仔细想一下的话,似乎完全不需要计算很多次,只需要算好一次,然后根据初始的rotation计算坐标就好了

    public static TriangleCollider GetTriangleCollider(Vector3[] point3, Transform appendTransform = null, CollideFunc collideFunc = CollideFunc.Outside)
    {
        TriangleCollider t = new TriangleCollider
        {
            colliderType = ColliderType.Triangle,
            collideFunc  = collideFunc,
            pointA       = point3[0],
            pointB       = point3[1],
            pointC       = point3[2],
        };

        t.GetNormal();
        return(t);
    }
 public static CircleCollider GetCircleCollider(Vector3 positionOffset, Quaternion rotationOffset, float radius, Transform appendTransform = null, CollideFunc collideFunc = CollideFunc.Outside)
 {
     return(GetCircleCollider(positionOffset, rotationOffset * defaultNormal, radius, appendTransform, collideFunc));
 }
 public static CircleCollider GetCircleCollider(Vector3 positionOffset, Vector3 normal, float radius, Transform appendTransform = null, CollideFunc collideFunc = CollideFunc.Outside)
 {
     return(new CircleCollider
     {
         colliderType = ColliderType.Circle,
         collideFunc = collideFunc,
         appendTransform = appendTransform,
         positionOffset = positionOffset,
         normal = normal.normalized,
         radius = radius
     });
 }
Пример #16
0
            void DistributionPower(Vector3 pushout, float radius, PointReadWrite *pReadWritePointA, PointReadWrite *pReadWritePointB, float WeightProportion, float lengthPropotion, float frictionA, float frictionB, CollideFunc collideFunc)
            {
                float sqrPushout = pushout.sqrMagnitude;

                switch (collideFunc)
                {
                case CollideFunc.Outside:
                    if (!(sqrPushout < radius * radius && sqrPushout != 0))
                    {
                        return;
                    }
                    break;

                case CollideFunc.Inside:
                    if (sqrPushout < radius * radius && sqrPushout != 0)
                    {
                        return;
                    }
                    break;

                case CollideFunc.Freeze:
                    break;
                }
                //OYM:把pushout方向多余的力给减掉
                pReadWritePointA->velocity -= pushout * (Vector3.Dot(pushout, pReadWritePointA->velocity) / sqrPushout);
                pReadWritePointB->velocity -= pushout * (Vector3.Dot(pushout, pReadWritePointB->velocity) / sqrPushout);
                pReadWritePointA->velocity *= (1 - frictionA);
                pReadWritePointB->velocity *= (1 - frictionB);

                pushout = pushout * (radius / Mathf.Sqrt(sqrPushout) - 1);
                //  float Propotion = WeightProportion * lengthPropotion / (1 - WeightProportion - lengthPropotion + 2 * WeightProportion * lengthPropotion);
                if (WeightProportion < EPSILON)
                {
                    pReadWritePointA->position += (pushout * (1 - lengthPropotion));
                    pReadWritePointA->velocity += (pushout * (1 - lengthPropotion));
                }
                else
                {
                    lengthPropotion = 1;
                }
                pReadWritePointB->position += (pushout * lengthPropotion);
                pReadWritePointB->velocity += (pushout * lengthPropotion);
            }