Rolling ball spherical terrain relative controls - C#

Ok I takes everything from the beginning.
I have a camera following my player (a rolling ball) around a planet with a gravity script. Everything works fine, except for the controls. Depending on where I am on the planet directions are reversed, they do anything ...
Below the script controller. I tried all full of things, nothing works. The controls are not related to the camera .... How to do that?
Thanks for your help.
 using UnityEngine;
 using System.Collections;
 using UnityStandardAssets.CrossPlatformInput;
 
 public class PlayerController : MonoBehaviour
 {
 
     PhotonView view;
     public Ball ball;
 
     private Transform cam; // A reference to the main camera in the scenes transform
     private Vector3 camForward; // The current forward direction of the camera
     private bool jump; // whether the jump button is currently pressed
     private Vector3 move; // the world-relative desired move direction, calculated from the camForward and user input.
 
     private void Awake()
     {
         // Set up the reference.
         ball = GetComponent<Ball>();
 
         // get the transform of the main camera
         if (Camera.main != null)
         {
             cam = Camera.main.transform;
 
             //cam = cam.transform;
         }
         else
         {
             Debug.LogWarning(
                 "Warning: no main camera found. Ball needs a Camera tagged \"MainCamera\", for camera-relative controls.");
             // we use world-relative controls in this case, which may not be what the user wants, but hey, we warned them!
         }
     }
 
     // Use this for initialization
     void Start()
     {
         view = GetComponent<PhotonView>();
     }
 
     // Update is called once per frame
     void Update()
     {
         if (view.isMine)
         {
             // Get the axis and jump input.
 
             float h = CrossPlatformInputManager.GetAxis("Horizontal");
             float v = CrossPlatformInputManager.GetAxis("Vertical");
             jump = CrossPlatformInputManager.GetButton("Jump");
 
 
             // calculate move direction
             if (cam != null)
             {
                 // calculate camera relative direction to move:
 
 
 
                 camForward = Vector3.Scale(cam.forward, new Vector3(3, 0, 1)).normalized;
                 move = (v * camForward + h * cam.right).normalized;
                 //move = (v * Vector3.forward + h * Vector3.right).normalized;
             }
             else
             {
                 // we use world-relative directions in the case of no main camera
                 //move = (v * Vector3.forward + h * Vector3.right).normalized;
                 Debug.Log("no camera");
             }
 
             Vector3 movement = new Vector3(h, 0.0f, v);
             movement = Camera.main.transform.TransformDirection(movement);
 
             ball.Move(move, jump);
             jump = false;
         }
 
     }
 
     void FixedUpdate()
     {
        
 
     }
 }
 
 
               And The ball script :
 using System;
 using UnityEngine;
 using UnityStandardAssets.CrossPlatformInput;
 
 public class Ball : MonoBehaviour
     {
         [SerializeField]
         private float m_MovePower = 5; // The force added to the ball to move it.
         [SerializeField]
         private bool m_UseTorque = false; // Whether or not to use torque to move the ball.
         [SerializeField]
         private float m_MaxAngularVelocity = 25; // The maximum velocity the ball can rotate at.
         [SerializeField]
         private float m_JumpPower = 2; // The force added to the ball when it jumps.
 
         private const float k_GroundRayLength = 1f; // The length of the ray to check if the ball is grounded.
         private Rigidbody m_Rigidbody;
 
 
         private void Start()
         {
             m_Rigidbody = GetComponent<Rigidbody>();
             // Set the maximum angular velocity.
             GetComponent<Rigidbody>().maxAngularVelocity = m_MaxAngularVelocity;
         }
 
 
         public void Move(Vector3 moveDirection, bool jump)
         {
             // If using torque to rotate the ball...
             if (m_UseTorque)
             {
                 // ... add torque around the axis defined by the move direction.
                 m_Rigidbody.AddTorque(new Vector3(moveDirection.z, 0, -moveDirection.x) * m_MovePower);
          
         }
             else
             {
             // Otherwise add force in the move direction.
             
             m_Rigidbody.AddForce(moveDirection * m_MovePower);
             }
 
             // If on the ground and jump is pressed...
             if (Physics.Raycast(transform.position, -Vector3.up, k_GroundRayLength) && jump)
             {
                 // ... add force in upwards.
                 m_Rigidbody.AddForce(Vector3.up * m_JumpPower, ForceMode.Impulse);
             }
         }
     }
 
 
              You forgot to include the question. What are you not able to do? What's not working?
Can't help you if we don't know what you need help with.
-_- Yes it's not clever. I tried to explain better my problem. Thank you
Your answer
 
             Follow this Question
Related Questions
how can i make drag and release (like billiard games) ball control 1 Answer
NPC Wandering Intervals/Gaps Help! 0 Answers
Unity Mobile Touch Control ! 2 Answers
Rotate ball in camera's direction.... 0 Answers
Camera as collider 2D 0 Answers