diff --git a/Engine/source/T3D/fx/groundCover.cpp b/Engine/source/T3D/fx/groundCover.cpp index 5317f139e..bfc2f7737 100644 --- a/Engine/source/T3D/fx/groundCover.cpp +++ b/Engine/source/T3D/fx/groundCover.cpp @@ -1572,12 +1572,20 @@ void GroundCover::prepRenderImage( SceneRenderState *state ) mShaderConstData.gustInfo.set( mWindGustLength, mWindGustFrequency * simTime, mWindGustStrength ); mShaderConstData.turbInfo.set( mWindTurbulenceFrequency * simTime, mWindTurbulenceStrength ); - + + // Use the camera's forward vector to calculate the camera's right + // and up vectors. This removes any camera banking from affecting + // the ground cover. const MatrixF &camMat = state->getDiffuseCameraTransform(); Point3F camDir, camUp, camRight; camMat.getColumn( 1, &camDir ); - camMat.getColumn( 2, &camUp ); - camMat.getColumn( 0, &camRight ); + mCross( camDir, Point3F::UnitZ, &camRight ); + if ( camRight.magnitudeSafe() == 0.0f ) + { + camRight.set( 0.0f, -1.0f, 0.0f ); + } + camRight.normalizeSafe(); + mCross( camRight, camDir, &camUp ); // Limit the camera up vector to keep the billboards // from leaning too far down into the terrain.