public void Awake() { initialPosition = transform.position; tmpX = transform.position.x; tmpY = transform.position.y; tmpZ = transform.position.z; Collider[] otherThings = FindObjectsOfType <Collider>(); otherColliders = new List <SimpleRigidbody3D>(); staticColliders = new List <BoxCollider>(); foreach (SimpleRigidbody3D rigi in FindObjectsOfType <SimpleRigidbody3D>()) { if (rigi == this) { continue; } otherColliders.Add(rigi); } for (int i = 0; i < otherThings.Length; i++) { if (otherThings[i].GetComponent <BoxCollider>() != null) { staticColliders.Add(otherThings[i].GetComponent <BoxCollider>()); } } time = FindObjectOfType <SimplePhysics>(); radius = transform.localScale.x / 2.0f; }
public bool FixCollisions() { bool fixedSomething = false; for (int i = 0; i < otherColliders.Count; i++) { SimpleRigidbody3D other = otherColliders[i]; float colX, colY, colZ; float normX, normY, normZ; if (SphereSphereCollision(this, other, out colX, out colY, out colZ, out normX, out normY, out normZ)) { fixedSomething = true; float newVelX, newVelY, newVelZ; SimplePhysics.VectorAfterNormalForce(velocityX, velocityY, velocityZ, normX, normY, normZ, out newVelX, out newVelY, out newVelZ); float lostVelX = velocityX - newVelX; float lostVelY = velocityY - newVelY; float lostVelZ = velocityZ - newVelZ; float otherNewVelX, otherNewVelY, otherNewVelZ; SimplePhysics.VectorAfterNormalForce(other.velocityX, other.velocityY, other.velocityZ, -normX, -normY, -normZ, out otherNewVelX, out otherNewVelY, out otherNewVelZ); float otherLostVelX = other.velocityX - otherNewVelX; float otherLostVelY = other.velocityY - otherNewVelY; float otherLostVelZ = other.velocityZ - otherNewVelZ; float avgLostVelX = (lostVelX + otherLostVelX) / 2.0f; float avgLostVelY = (lostVelY + otherLostVelY) / 2.0f; float avgLostVelZ = (lostVelZ + otherLostVelZ) / 2.0f; velocityX = newVelX * time.friction + avgLostVelX; velocityY = newVelY * time.friction + avgLostVelY; velocityZ = newVelZ * time.friction + avgLostVelZ; other.velocityX = otherNewVelX * time.friction + avgLostVelX; other.velocityY = otherNewVelY * time.friction + avgLostVelY; other.velocityZ = otherNewVelZ * time.friction + avgLostVelZ; float dx = colX - tmpX; float dy = colY - tmpY; float dz = colZ - tmpZ; float dist = Mathf.Sqrt(dx * dx + dy * dy + dz * dz); float moveOffsetX = normX * (radius - dist); float moveOffsetY = normY * (radius - dist); float moveOffsetZ = normZ * (radius - dist); tmpX += moveOffsetX; tmpY += moveOffsetY; tmpZ += moveOffsetZ; other.tmpX -= moveOffsetX; other.tmpY -= moveOffsetY; other.tmpZ -= moveOffsetZ; } } for (int i = 0; i < staticColliders.Count; i++) { BoxCollider other = staticColliders[i]; float colX, colY, colZ; float normX, normY, normZ; if (SphereBoxCollision(this, other, out colX, out colY, out colZ, out normX, out normY, out normZ)) { fixedSomething = true; float newVelX, newVelY, newVelZ; SimplePhysics.VectorAfterNormalForce(velocityX, velocityY, velocityZ, normX, normY, normZ, out newVelX, out newVelY, out newVelZ); velocityX = newVelX * time.friction; velocityY = newVelY * time.friction; velocityZ = newVelZ * time.friction; float dx = colX - tmpX; float dy = colY - tmpY; float dz = colZ - tmpZ; float dist = Mathf.Sqrt(dx * dx + dy * dy + dz * dz); float moveOffsetX = normX * (radius - dist); float moveOffsetY = normY * (radius - dist); float moveOffsetZ = normZ * (radius - dist); tmpX += moveOffsetX; tmpY += moveOffsetY; tmpZ += moveOffsetZ; } } return(fixedSomething); }