2016-12-11 12 views
0

Unity에 Cardboard 게임을 쓰고 있는데 카메라가 스프라이트를 향하고 있는지 확인하고 싶습니다. 나는 다음과 같은 코드를 작성했습니다 : 내 코드에서카메라가 스프라이트에 초점을 맞추고 있는지 확인하십시오.

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는 결코 내 피라미드 안에 들어 가지 않습니다. 방금 테타 만 검사 했어.

도와주세요.

답변

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)); 
} 

은 당신의 요구에 맞게 개별적으로 각 스프라이트 코너를 확인할 수 있습니다.