Example #1
0
    public void Explore()
    {
        this.anim.speed = 0.8f;
        this.anim.Play("Explore");
        this._noise.Frequency = _noiseFrequency;
        this._noise.Step();
        Quaternion current_rot = this.transform.rotation;

        ObstacleAvoidInfo obs_info = this.GetObstacleAvoidInfo();
        //Vector3 ex_pos = this.transform.position;

        float      delta = this._stepFrequency * Time.deltaTime;
        Quaternion target_rot;

        if (obs_info.is_hit)
        {
            target_rot = Quaternion.LookRotation(obs_info.dir);
            this.transform.rotation = Quaternion.Slerp(current_rot, target_rot, obs_info.turning_rate);
        }
        else
        {
            target_rot = this._noise.Rotation(0, 90f, 360f, 90f);
            this.transform.rotation = Quaternion.Slerp(current_rot, target_rot, delta);
        }
        this.transform.position += this.transform.forward * delta;

        //Debug.DrawLine(ex_pos, this.transform.position, Color.blue);
        //Debug.Log("rot: " + this.transform.rotation.eulerAngles);
    }
Example #2
0
    private ObstacleAvoidInfo GetObstacleAvoidInfo()
    {
        ObstacleAvoidInfo obs_info = new ObstacleAvoidInfo();

        obs_info.dir = Vector3.zero;
        RaycastHit hit;
        float      hit_distance = float.MaxValue;

        if (Physics.Raycast(this.transform.position, this.transform.forward,
                            out hit, this._obstacle_detecting_distance))
        {
            if (hit.transform != transform)
            {
                Debug.DrawLine(this.transform.position, hit.point, Color.red);
                obs_info.is_hit = true;
                obs_info.dir    = hit.normal;
                hit_distance    = Mathf.Min(hit_distance, Vector3.Distance(this.transform.position, hit.point));
            }
        }

        //Debug.Log("extends: " + this.bodyObj.GetComponent<Renderer>().bounds.extents);
        Vector3 leftR        = this.transform.localPosition;
        Vector3 rightR       = this.transform.localPosition;
        float   wingDistance = this.bodyObj.GetComponent <Renderer>().bounds.extents.x;

        leftR.x  -= wingDistance;
        rightR.x += wingDistance;
        //Left
        if (Physics.Raycast(leftR, this.transform.forward, out hit,
                            this._obstacle_detecting_distance))
        {
            if (hit.transform != transform)
            {
                Debug.DrawLine(leftR, hit.point, Color.red);
                obs_info.is_hit = true;
                obs_info.dir    = hit.normal;
                hit_distance    = Mathf.Min(hit_distance, Vector3.Distance(this.transform.position, hit.point));
            }
        }
        //Right
        if (Physics.Raycast(rightR, this.transform.forward, out hit,
                            this._obstacle_detecting_distance))
        {
            if (hit.transform != transform)
            {
                Debug.DrawLine(rightR, hit.point, Color.red);
                obs_info.is_hit = true;
                obs_info.dir    = hit.normal;
                hit_distance    = Mathf.Min(hit_distance, Vector3.Distance(this.transform.position, hit.point));
            }
        }
        if (0 < hit_distance && hit_distance < this._obstacle_detecting_distance)
        {
            //Has obstacle objects in the distance
            obs_info.turning_rate = Util.Remap(hit_distance,
                                               0, this._obstacle_detecting_distance, 1, 0); //0~obs -> 1~0
            //Debug.Log("d: " + hit_distance + ", obstacle_dist: " + this._obstacle_detecting_distance + ", turning_rate: " + turning_rate);
        }
        else
        {
            //No obstacle objects
            obs_info.turning_rate = Time.deltaTime;
        }

        return(obs_info);
    }