【Unity】画出摄像机视椎体

一、Scene窗口利用Gizmos画出摄像机的视椎体

/**
 *Copyright(C) 2019 by Lele Feng
 *All rights reserved.
 *ProductName:  Unity Shaders Book
 *FileName:     GimosCameraRect.cs
 *Author:       Milk
 *Version:      1.0
 *UnityVersion:2017.1.1f1
 *CreateTime:   2019/11/23 10:47:58
 *Description:   
 *History:
*/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GimosCameraRect : MonoBehaviour
{
    private Camera m_MainCamera;
    private Camera MainCamera {
        get
        {
            if (m_MainCamera == null)
            {
                m_MainCamera = Camera.main;
            }
            return m_MainCamera;
        }
    }

    Vector3[] GetCameraVector(float dis)
    {
        Vector3[] vectorArr = new Vector3[4];

        float aspect = MainCamera.aspect;        
        float height = Mathf.Tan(MainCamera.fieldOfView / 2 * Mathf.Deg2Rad) * dis;
        float width = height * aspect;
        Vector3 forward = transform.position + transform.forward * dis;
        Vector3 right = transform.right * width;
        Vector3 top = transform.up * height;

        vectorArr[0] = forward + top - right;//top_left
        vectorArr[1] = forward + top + right;//top_right
        vectorArr[2] = forward - top + right;//bottom_right
        vectorArr[3] = forward - top - right;//bottom_left

        return vectorArr;
    }

    public void OnDrawGizmos()
    {
        Gizmos.color = Color.red;
        Vector3[] farVecArr = GetCameraVector(MainCamera.farClipPlane);
        Vector3[] nearVecArr = GetCameraVector(MainCamera.nearClipPlane);

        Gizmos.color = Color.yellow;

        Gizmos.DrawLine(nearVecArr[0], nearVecArr[1]);
        Gizmos.DrawLine(nearVecArr[1], nearVecArr[2]);
        Gizmos.DrawLine(nearVecArr[2], nearVecArr[3]);
        Gizmos.DrawLine(nearVecArr[3], nearVecArr[0]);

        Gizmos.DrawLine(farVecArr[0], farVecArr[1]);
        Gizmos.DrawLine(farVecArr[1], farVecArr[2]);
        Gizmos.DrawLine(farVecArr[2], farVecArr[3]);
        Gizmos.DrawLine(farVecArr[3], farVecArr[0]);


        Gizmos.color = Color.blue;

        Gizmos.DrawLine(nearVecArr[0], farVecArr[0]);
        Gizmos.DrawLine(nearVecArr[1], farVecArr[1]);
        Gizmos.DrawLine(nearVecArr[2], farVecArr[2]);
        Gizmos.DrawLine(nearVecArr[3], farVecArr[3]);

    }
}

二、在Game窗口画出的摄像机视椎体脚本

/**
 *Copyright(C) 2019 by Lele Feng
 *All rights reserved.
 *ProductName:  Unity Shaders Book
 *FileName:     GimosCameraRect.cs
 *Author:       Milk
 *Version:      1.0
 *UnityVersion:2017.1.1f1
 *CreateTime:   2019/11/23 10:47:58
 *Description:   
 *History:
*/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GimosCameraRect : MonoBehaviour
{
    private Camera m_MainCamera;
    private Camera MainCamera
    {
        get
        {
            if (m_MainCamera == null)
            {
                m_MainCamera = Camera.main;
            }
            return m_MainCamera;
        }
    }

    Vector3[] GetCameraVector(float dis)
    {
        Vector3[] vectorArr = new Vector3[4];

        float aspect = MainCamera.aspect;
        float height = Mathf.Tan(MainCamera.fieldOfView / 2 * Mathf.Deg2Rad) * dis;
        float width = height * aspect;
        Vector3 forward = transform.position + transform.forward * dis;
        Vector3 right = transform.right * width;
        Vector3 top = transform.up * height;

        vectorArr[0] = forward + top - right;//top_left
        vectorArr[1] = forward + top + right;//top_right
        vectorArr[2] = forward - top + right;//bottom_right
        vectorArr[3] = forward - top - right;//bottom_left

        return vectorArr;
    }

    public void Update()
    {
        Vector3[] farVecArr = GetCameraVector(MainCamera.farClipPlane);
        Vector3[] nearVecArr = GetCameraVector(MainCamera.nearClipPlane);

        Debug.DrawLine(nearVecArr[0], nearVecArr[1], Color.yellow);
        Debug.DrawLine(nearVecArr[1], nearVecArr[2], Color.yellow);
        Debug.DrawLine(nearVecArr[2], nearVecArr[3], Color.yellow);
        Debug.DrawLine(nearVecArr[3], nearVecArr[0], Color.yellow);

        Debug.DrawLine(farVecArr[0], farVecArr[1], Color.yellow);
        Debug.DrawLine(farVecArr[1], farVecArr[2], Color.yellow);
        Debug.DrawLine(farVecArr[2], farVecArr[3], Color.yellow);
        Debug.DrawLine(farVecArr[3], farVecArr[0], Color.yellow);

        Debug.DrawLine(nearVecArr[0], farVecArr[0], Color.blue);
        Debug.DrawLine(nearVecArr[1], farVecArr[1], Color.blue);
        Debug.DrawLine(nearVecArr[2], farVecArr[2], Color.blue);
        Debug.DrawLine(nearVecArr[3], farVecArr[3], Color.blue);

    }
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值