SimonH, I'm getting some issues with collisions between the ball and the goalpost/crossbar. Basically I handle the collision like so...
The bounce check is purely to try to force the game to deal with primarily the goalpost collision in one loop rather than deal with a clash between ball, goalpost and goalnet.
However, I'm occasionally seeing the ball change direction two or three times in one collision with the goal frame.
If matchengine.enginestatus <> CENGINESTATUS_REPLAYING ' Don't do collisions during replays Local bounce:Float = 0.0 Local NFx:Float = 0.0 Local NFy:Float = 0.0 Local NFz:Float = 0.0 For Local i:Int = 1 To CountCollisions(mesh) Local myentity:TEntity = CollisionEntity(mesh, i) ' TEntity ' Get the normal of the surface which the entity collided with. Local Nx# = CollisionNX(mesh, i) Local Ny# = CollisionNY(mesh, i) Local Nz# = CollisionNZ(mesh, i) ' Compute the dot product of the entity's motion vector and the normal of the surface collided with. Local VdotN# = vecVelocity.x*Nx# + vecVelocity.y*Ny# + vecVelocity.z*Nz# Select GetEntityType(myentity) Case CTYPE_GOALPOST Applog "Collision GoalPost" bounce = 0.8 ' Calculate the normal force. NFx = -(2.0) * Nx# * VdotN# NFy = -(2.0) * Ny# * VdotN# NFz = -(2.0) * Nz# * VdotN# Case CTYPE_GOALNET Applog "Collision GoalNet" ' Only bounce off net if post wasn't hit If bounce = 0 and (GetZ() > matchengine.GoalLine1 or GetZ() < matchengine.GoalLine2) NFx = -(2.0) * Nx# * VdotN# NFy = -(2.0) * Ny# * VdotN# NFz = -(2.0) * Nz# * VdotN# ' Normal slight bounce bounce = 0.2 EndIf Case CTYPE_WALL Applog "Collision Wall" If bounce = 0 bounce = 0.6 NFx = -(2.0) * Nx# * VdotN# NFy = -(2.0) * Ny# * VdotN# NFz = -(2.0) * Nz# * VdotN# EndIf Case CTYPE_STADIUM Applog "Collision Stadium" If bounce = 0 bounce = 0.6 NFx = -(2.0) * Nx# * VdotN# NFy = -(2.0) * Ny# * VdotN# NFz = -(2.0) * Nz# * VdotN# EndIf End Select Next If bounce > 0 Local mx:Float = ((vecVelocity.x + NFx#) * bounce) Local my:Float = ((vecVelocity.y + NFy#) * bounce) Local mz:Float = ((vecVelocity.z + NFz#) * bounce) vecVelocity.x = mx vecVelocity.y = my vecVelocity.z = mz EndIf EndIf
The bounce check is purely to try to force the game to deal with primarily the goalpost collision in one loop rather than deal with a clash between ball, goalpost and goalnet.
However, I'm occasionally seeing the ball change direction two or three times in one collision with the goal frame.