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; } }
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 }); }
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); }