Unity之Quaternion学习一

using UnityEngine;
using System.Collections;

public class SinDemo : MonoBehaviour {

    public GameObject gameobj1;
	
    
    
    // Use this for initialization
	void Start () {
        //CalueAngel();
        
	}
	

	// Update is called once per frame
	void Update () {
        CalueForward();
	}

    void CalueAngel()
    {
        Vector3 vec1 = transform.position;
        Vector3 vec2 = gameobj1.transform.position;


        float y = vec2.z - vec1.z;
        float x = vec2.x - vec1.x;

        float tan = y / x;
        float angel = tan * 180 / Mathf.PI;

        Debug.LogError("tan"  +  tan  +  "  angel is " + angel);
        Debug.DrawLine(vec1, vec2, Color.red);
    }

    void CalueForward()
    {
        float dis = 5f;
        float angel = 45;
        Quaternion qua1 = transform.rotation;
        Vector3 pos1 = (transform.position + (qua1 * Vector3.forward) * dis);
        Debug.DrawLine(transform.position, pos1, Color.red);


        Quaternion qua2 = Quaternion.Euler(transform.eulerAngles.x, transform.eulerAngles.y - angel, transform.eulerAngles.z);
        Quaternion qua3 = Quaternion.Euler(transform.eulerAngles.x, transform.eulerAngles.y + angel, transform.eulerAngles.z);

        Vector3 pos2 = (transform.position + (qua2 * Vector3.forward) * dis);
        Vector3 pos3 = (transform.position + (qua3 * Vector3.forward) * dis);

        Debug.DrawLine(transform.position, pos2, Color.green);
        Debug.DrawLine(transform.position, pos3, Color.green);

        Debug.DrawLine(pos1, pos2, Color.red);
        Debug.DrawLine(pos1, pos3, Color.red);

        Vector3 point = gameobj1.transform.position;

        if (IsInTriangle(point, transform.position, pos2, pos1) || IsInTriangle(point, transform.position, pos1, pos3))
        {
            Debug.LogError("is in");
        }
        else
        {
            Debug.LogError("is not in " + transform.position);
        }
    }


    bool IsInTriangle(Vector3 point,Vector3 v1, Vector3 v2, Vector3 v3)
    {
        Vector2 tPoint = new Vector2();
        tPoint.x = point.x;
        tPoint.y = point.z;

        Vector2 tv1 = new Vector2();
        tv1.x = v1.x;
        tv1.y = v1.z;

        Vector2 tv2 = new Vector2();
        tv2.x = v2.x;
        tv2.y = v2.z;

        Vector2 tv3 = new Vector2();
        tv3.x = v3.x;
        tv3.y = v3.z;

        float area = GetAreaOfTirangle(tv1, tv2, tv3);
        //物体对象和已知几点所形成的几个三角形
        float subArea = GetAreaOfTirangle(tv1, tv2, tPoint) + GetAreaOfTirangle(tv1, tPoint, tv3) + GetAreaOfTirangle(tPoint, tv2, tv3);
        if (Mathf.Abs(area - subArea) <= 0.01f)
        {
            return true;
        }
        return false;
    }

    /// <summary>
    /// 求出三角形的面积 三角形面积公式
    /// </summary>
    /// <param name="v1"></param>
    /// <param name="v2"></param>
    /// <param name="v3"></param>
    /// <returns></returns>
    float GetAreaOfTirangle(Vector2 v1,Vector2 v2,Vector2 v3)
    {
        //设A(x1,y1),B(x2,y2),C(x3,y3) 
        //S=(1/2)*(x1y2+x2y3+x3y1-x1y3-x2y1-x3y2)
        float area = (v1.x * v2.y + v2.x * v3.y + v3.x * v1.y) - (v1.x * v3.y + v2.x * v1.y + v3.x * v2.y);
        area = Mathf.Abs(area / 2);
        return area;
    }

}

你可能感兴趣的:(unity,面向,Quaternion)