bool GetTurnToPosition(out Vec3 turnToPosition)
        {
            if (Instance != this)
            {
                Log.Fatal("PlayerIntellect: GetTurnToPosition: Instance != this.");
            }

            turnToPosition = Vec3.Zero;

            if (ControlledObject == null)
            {
                return(false);
            }

            //CutSceneManager specific
            if (CutSceneManager.Instance != null && CutSceneManager.Instance.CutSceneEnable)
            {
                return(false);
            }

            Vec3 from;
            Vec3 dir;

            if (!fpsCamera)
            {
                from = ControlledObject.Position + new Vec3(0, 0, tpsCameraCenterOffset);
                dir  = lookDirection.GetVector();
            }
            else
            {
                from = ControlledObject.Position +
                       ControlledObject.Type.FPSCameraOffset * ControlledObject.Rotation;
                dir = lookDirection.GetVector();
            }

            //invalid ray
            if (dir == Vec3.Zero || float.IsNaN(from.X) || float.IsNaN(dir.X))
            {
                return(false);
            }

            float distance = 1000.0f;

            turnToPosition = from + dir * distance;

            RayCastResult[] piercingResult = PhysicsWorld.Instance.RayCastPiercing(
                new Ray(from, dir * distance), (int)ContactGroup.CastAll);
            foreach (RayCastResult result in piercingResult)
            {
                WaterPlane waterPlane = WaterPlane.GetWaterPlaneByBody(result.Shape.Body);

                if (waterPlane == null && result.Shape.ContactGroup == (int)ContactGroup.NoContact)
                {
                    continue;
                }

                MapObject obj = MapSystemWorld.GetMapObjectByBody(result.Shape.Body);

                if (obj == ControlledObject)
                {
                    continue;
                }

                if (waterPlane != null)
                {
                    //ignore water from inside
                    if (result.Shape.Body.GetGlobalBounds().IsContainsPoint(from))
                    {
                        continue;
                    }
                }

                Dynamic dynamic = obj as Dynamic;
                if (dynamic != null)
                {
                    if (dynamic.GetParentUnitHavingIntellect() == ControlledObject)
                    {
                        continue;
                    }
                }

                turnToPosition = result.Position;
                break;
            }

            return(true);
        }