2016-12-11 55 views
0

我寫一個團結紙板遊戲,我想檢查我的相機是否正面臨着一個精靈與否。我寫了下面的代碼:檢查攝像機聚焦在精靈

private void GetSphericalCoordinates(Vector3 vector, out float tetta, out float fi) 
{ 
    float r = Mathf.Sqrt(vector.x * vector.x + vector.y * vector.y + vector.z * vector.z); 
    tetta = Mathf.Acos(vector.z/r); 
    fi = Mathf.Atan2(vector.y, vector.x); 
} 

public bool IsLookingAtMe(Vector3 point, Quaternion angle) 
{ 
    Vector3 topLeftPoint = new Vector3(transform.position.x - transform.localScale.x/2, transform.position.y - transform.localScale.y/2); 
    Vector3 topRightPoint = new Vector3(transform.position.x + transform.localScale.x/2, transform.position.y - transform.localScale.y/2); 
    Vector3 bottomLeftPoint = new Vector3(transform.position.x - transform.localScale.x/2, transform.position.y + transform.localScale.y/2); 
    Vector3 bottomRightPoint = new Vector3(transform.position.x + transform.localScale.x/2, transform.position.y + transform.localScale.y/2);   

    float topLeftTetta, topRightTetta, bottomLeftTetta, bottomRightTetta, lookTetta; 
    float topLeftFi, topRightFi, bottomLeftFi, bottomRightFi, lookFi; 
    GetSphericalCoordinates(topLeftPoint - point, out topLeftTetta, out topLeftFi); 
    GetSphericalCoordinates(topRightPoint - point, out topRightTetta, out topRightFi); 
    GetSphericalCoordinates(bottomLeftPoint - point, out bottomLeftTetta, out bottomLeftFi); 
    GetSphericalCoordinates(bottomRightPoint - point, out bottomRightTetta, out bottomRightFi); 
    lookTetta = angle.eulerAngles.x * Mathf.Deg2Rad; 
    lookFi = angle.eulerAngles.y * Mathf.Deg2Rad; 


    if (lookTetta >= topLeftTetta && lookTetta <= bottomRightTetta) 
     return true; 
    return false; 
} 

在我的代碼我找到4角我的精靈,它是一個正方形的,所以我有5個點,使一個金字塔。現在我需要檢查我的相機是否在我的金字塔內。

的問題是,我lookTetta和lookFi從不我的金字塔內。我只是檢查了Tetta。

請幫我一下吧。

回答

0

我已用下面的代碼使用IntersectRay

public bool IsLookingAtMe(Vector3 origin, Vector3 direction) 
{  
    Bounds bounds = GetComponent<Renderer>().bounds;   
    Ray ray = new Ray(origin, direction); 
    return bounds.IntersectRay(ray); 
} 
1

使用WorldToViewportPoint它應該是一個單獨的語句。無需處理手動查看錐體。

項目精靈世界上的地位視口的位置,然後查找,如果它是界限(忽略Z)內。

public bool IsMainCameraLookingAtMe() 
{ 
    Bounds viewportBounds = new Bounds.SetMinMax(Vector2.zero, Vector2.one); 
    return viewportBounds.Contains((Vector2)Camera.main.WorldToViewportPoint(transform.position)); 
} 

可以檢查每精靈角落單獨滿足您的需求。