Projected shadows render the actors with a special shadow matrix to produce a shadow on the ground. This would not give you self-shadowing and would only cast the shadow onto the ground, but I think for a sports game such as footbal or soccer this would be fully valid. I think David A. Winter has done it this way in his Maximum Football games, maybe you can find some infos about how he has done it by searching the forums.
The following code will do the trick:
Dim tmpShadowMat, tmpPlayerMat As TV_3DMATRIX Dim tmpPlane As TV_PLANE 'define a new plane tmpPlane.Normal = TV_Globals.Vector(0, 1, 0) 'this plane will be your field so the normal goes up tmpPlane.Dist = 0 'the dist is the height where your field is (in this case 0) tmpPlayerMat = Player.Actor.GetMatrix() 'Get the players matrix 'create a shadow matrix (only one per light), 'vector4 is the light direction (don't know what the 4th entry is for) 'and the plane is your field where the shadow gets cast onto TV_Math.TVMatrixShadow(tmpShadowMat, TV_Globals.Vector4(-1, -1, -1, 0), tmpPlane) TV_Math.TVMatrixMultiply(tmpShadowMat, tmpPlayerMat, tmpShadowMat) 'multiply the players matrix with the shadow matrix Player.Actor.SetMatrix(tmpShadowMat) 'set the new matrix Player.Actor.SetTexture(TV_Globals.GetTex("Black")) 'set a black texture Player.Actor.Render() 'this renders the "shadow" Player.Actor.SetMatrix(tmpPlayerMat) 'set the normal matrix Player.Actor.SetTexture(TV_Globals.GetTex("PlayerTexture")) 'set the normal texture
Of course you can also use a dedicated actor for the shadow rendering, so SetTexture would not be needed.
-By WEst November.10.2007