void FixedUpdate () { // Create particles if( createIt < createItMax ){ // Create random for(int i=0;i<createObjects/createItMax;i++){ GameObject g = Instantiate( PhysicsObjPrefab ); g.transform.position = new Vector3( Random.Range( -worldDimension.x/2f, worldDimension.x/2f ), worldDimension.y/2f, 0 ); //g.transform.position = new Vector3( 0, worldDimension.y/2f, 0 ); PhysicsObjectGraphics obj = g.GetComponent<PhysicsObjectGraphics>(); objects.Add( obj ); obj.World = this; obj.PhysicsObj.setPosition( g.transform.position ); } createIt++; } foreach( PhysicsObjectGraphics obj in objects ){ obj.ApplyPhysics(); } fillHash( hashCapacity, gridDimension ); foreach( PhysicsObjectGraphics obj in objects ){ List<PhysicsObjectGraphics> neighbors = neighborhood( obj, hashCapacity, gridDimension, neighborhoodRadius ); obj.PhysicsObj.Neighbors = neighbors; obj.DensityFactor = obtainDensity( obj.PhysicsObj, neighbors, neighborhoodRadius, 2f ); } }
Vector3 viscosity(PhysicsObjectGraphics neighbor, float deltaSeconds, float neighborhoodRadius) { Vector3 diffSpeed = this.getSpeed() - neighbor.PhysicsObj.getSpeed(); Vector3 diffPosition = this.getPosition() - neighbor.PhysicsObj.getPosition(); float q = diffPosition.magnitude / neighborhoodRadius; if (q < 1) { float u = Vector3.Dot(diffSpeed, diffPosition); if (u > 0) { return((1 - q) * (u * 0.8f + u * u * 0.8f) * diffPosition / deltaSeconds); } } return(new Vector3()); }
List<PhysicsObjectGraphics> neighborhood( PhysicsObjectGraphics objPOG, int _hashCapacity, Vector3 _gridCubeDimension, float radius ){ Vector3 gridPosition = getParticleGridPosition( objPOG.PhysicsObj.getPosition(), _gridCubeDimension ); List<PhysicsObjectGraphics> result = new List<PhysicsObjectGraphics>(); // check neighbor grid cells 2D // TODO check if the cell is inside the radius for( int i = -1; i <= 1; i++ ){ for( int j = -1; j <= 1; j++ ){ Vector3 neighborGridPosition = new Vector3( gridPosition.x+i, gridPosition.y+j, gridPosition.z ); int neighborHash = getParticleGridPositionHash( neighborGridPosition, _hashCapacity ); foreach( PhysicsObjectGraphics obj in hashObjects[ neighborHash ] ){ // in radius? //Debug.Log( hashObjects[ neighborHash ].Count ); if( obj != objPOG && isNeighbor( objPOG.PhysicsObj.getPosition(), obj.PhysicsObj.getPosition(), radius ) && !result.Contains(obj) ){ result.Add( obj ); } } } } return result; }