射线_射线检测 - CSDN
  • 35/100发布文章 博文管理我的博客退出 Trash Temp unity3D中点击触发事件以及射线触发事件 Unity新手适合的简单AI Unity新手适合的简单AI Unity新手适合的简单AI unity寻路组件 unity寻路组件 unity中的动画组件A...

    1.鼠标点击触发事件;

    在这里介绍几个函数
    private void OnMouseDown() //在Collider上面点击并且拖拽时候触发
    private void OnMouseDrag() //移入Collider后触发一次
    private void OnMouseEnter() //移出Collider后触发,无论点击或者未点击
    private void OnMouseExit() //在Collider上面放置一直触发
    private void OnMouseOver() //在Collider上面点击抬起后触发
    private void OnMouseUp() //在Collider上面点击并且松手触发

    2.射线触发事件;

    射线是在三维世界中从一个点沿一个方向发射的一条无限长的线。在射线的轨迹上,一旦与添加了碰撞器的模型发生碰撞,将停止发射。我们可以利用射线实现子弹击中目标的检测,鼠标点击拾取物体等功能。
    官方给的格式是:

    public static bool Raycast(Vector3 origin, Vector3 direction, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);
    

    (括弧里分别对着,射线的发射点,射线的方向,射线的最大距离,检测带不带碰撞器,无碰撞器打不着另一个物体)
    其中后三个是可以忽略的(在需要时添加即可);

    Ray:在程序中可以理解为射线,就是以某个位置(origin)朝某个方向(direction)的一条射线;

    RaycastHit,它是用于存储射线碰撞到的第一个物体的信息,所以需要提前创建这个对象,用于信息的碰撞信息的存储;
    ray:射线结构体的信息,包括起点,方向;也就是一条射线
    hitinfo:这条射线所碰撞物体的相关信息;
    maxDistance:这条射线的最大距离;
    这个函数的意思就是:以射线ray经过的maxDistance长度之内,与第一个对象进行的物理碰撞的信息,存储在hitInfo中;如果有碰撞物体,返回true, 反之false;
    基础知识介绍完了 我们开始一个实战吧
    我们可以以射线实现鼠标接触物体触发事件;

    public GameObject Cube;
    public Camera MainCamera = null;
    private void Update()
        {
         Ray r = MainCamera.ScreenPointToRay(Input.mousePosition);//创建射线(从摄像机到鼠标位置)
         RaycastHit HitInformation;//传递参数;
         if(Physics.Raycast (r,out HitInformation, 1000))
            {
                if(HitInformation.collider.tag == "Floor")
                {
                    Destroy(Cube.gameObject);
                }
            }
        }
    

    给上面的MainCamera和Cube赋值
    然后就可以在unity中运行了即可
    我们可以看到 当鼠标移到物体上的时候物体消失

    3.创建降落伞的动画;

    创建动画unity比较基础的知识,大家如果有不懂的可以参考我前面的博客;
    在这里我们创建两个动画 分别是降落伞打开和降落伞关闭
    简单来说就是降落伞体积变大 和变小;

    4.创建物体;

    在这里我们以一个Cube作为下落物体;
    以一个Sphere作为降落伞;
    首先把Sphere设置成为Cube的子物体
    然后添加刚体;
    使这个物体可以自由下落;

    5.降落伞思路

    降落伞我们都知道 是在某一个速度下落
    开伞之后速度降低 起缓冲的作用;
    在unity中我们只能是创建射线 通过改变射线的长度 改变开伞的高度;
    我们让射线接触地面之后就开始减速 并且开伞;
    开伞 就是开伞动画;减速 只要改变rigidbody 的阻力即可
    在物体本身接触地面的时候
    播放关闭伞的动画;

    6.添加脚本

    在这个物体下创建一个脚本 就叫做Down
    我先把代码写出来然后分析;

    public GameObject DownObject;    
     public Animation ani;     
     public Rigidbody rigidbodyObject;     
     private bool isDown = false ;//是否下落在地面上  默认为没有下落在地面
        private float Distance = 10;
          private void Start()
        {
            ani.GetComponent<Animation>();
            rigidbodyObject = GetComponent<Rigidbody>();
        }
        
        private void Update()
        {
            
            Ray DownRay = new Ray(DownObject.transform.position, Vector3.down);
            RaycastHit HitInformation;//碰撞返回的参数;
            if(!isDown)
            {
                if (Physics.Raycast(DownRay, out HitInformation  , Distance))//创建射线,最大距离为Distance=10;
                {
                    if(HitInformation.collider.tag == "envrionment")
                    {
                        Downt();
                    }
                }
            }
        }
        private void Downt()
        {
            isDown = true;//下落在地面
            rigidbodyObject.drag = 8;//阻力为8;
            ani.Play("Open");//开伞动画
        }
        private void OnCollisionEnter()
        {
            ani.Play("Close");//关伞动画;
        }
    

    以上代码就是创建射线;
    private float Distance = 10;
    根据上面我给的介绍 可以知道Distance是这个射线的长度;
    public Animation ani; 这个是声明动画(不清楚的话可以到我前面的博客看);
    注意把地面的标签设置为envrionment;

    7.实现经营类游戏中物体的拖动

    在unity中创建场景中创建Cube
    在他上面添加脚本

        public GameObject Cube;
        public Camera MainCamera;
        private void OnMouseDrag()
        {
            MoveObject();//调用下面函数
        }
        void MoveObject()
        {
            Ray r = MainCamera.ScreenPointToRay(Input.mousePosition);//创建射线
            RaycastHit HitInformation;//传递参数
            if(Physics .Raycast (r,out HitInformation, 1000,1))//检测
            {
             Cube.transform.position = new Vector3(HitInformation.point.x, HitInformation.point.y+0.5f, HitInformation.point.z);
                //让Cube坐标在鼠标的位置上(实现拖动);
                Debug.DrawLine(r.origin, HitInformation.point, Color.red);
            }
        }
    

    基本上所要讲的就是这些 代码注释中基本都写清楚了;
    就这样;
    祝大家学习顺利。

    展开全文
  • 【Unity3D基础知识点】——射线

    千次阅读 2017-05-07 12:16:24
    射线(ray)是指由线段的一端无线延长所形成的直线。射线多用于检测 在 Unity 中描述一个射线一个点加个方向,在与其他物体发生碰撞时将停止发射。 Ray 射线类。 创建一个射线: using UnityEngine; using System...

    射线(ray)是指由线段的一端无线延长所形成的直线。


    射线多用于检测 在 Unity 中描述一个射线一个点加个方向,在与其他物体发生碰撞时将停止发射。

    • Ray 射线类。
      Ray类
      创建一个射线:
    using UnityEngine;
    using System.Collections;
    
    namespace GaoSan{
        public class RayTest : MonoBehaviour
        {
            public Transform ori;//起点位置
            public Transform des;//终点位置
            void Update ()
            {
                // (des.position - ori.position) 终点位置减去 起点位置 等于方向向量
                Ray ray = new Ray(ori.position, (des.position - ori.position));
                // 输出检测
                print(ray);
            }

    RayTest 脚本拖到摄像机中。在 Hierarchy 面板上创建两个 Cube ,Transform组建Reset ,将这两个Cube分别表示 ori 和 des,des Z轴改为10点击运行。运行结果
    为什么输出的 Dir :(0.0, 0.0, 1.0)呢?
    当我们传入一个方向数值时Unity会自动将它转换成一个单位向量

    • 射线看不到,在 Debug 中有两种方法可以让开发者在 Scene 视图中观察到射线。
      1. Debug.DrawLine(Vector3 start, Vector3 end);此方法有四个重载。(传入的是两个顶点)
      2. Debug.DrawRay(Vector3 start, Vector3 dir);此方法有四个重载。(传入的是一个顶点和一个带长度的方向)

    可以在 RayTest 代码中继续写:

     //参数:ray.origin 射线起点;ray.direction * 10 带长度的方向
       Debug.DrawRay(ray.origin, ray.direction * 10);

    运行结果:
    射线



    射线检测

    Physics.Raycast(有16个重载)

    射线检测及投射一条射线在碰到物体时反馈一些信息。检测碰撞是基于 Collider ,射线检测是由物理发射出去的。

    1. bool Physics.Raycast(Vector3 origin, Vector3 direction, float distance, int layerMask)

    在场景中投下可与所有碰撞器碰撞的一条光线。返回值 bool 类型

    2. bool Physics.Raycast(Ray ray, Vector3 direction, RaycastHit out hit, float distance, int layerMask)

    在场景中投下可与所有碰撞器碰撞的一条光线。返回 (RaycastHit) 射到的物体信息(前提是返回 true)

    3. bool Physics.Raycast(Ray ray, out RaycastHit hitInfo, float maxDistance, LayerMask.GetMask(params string[] layerNames))
    在场景中投下可与指定层的所有碰撞器碰撞的一条射线。LayerMask 结构体;GetMask()指定层的名称。

    Parameters:(参数)

    1. origin :——- 在世界坐标,射线的起始点。
    2. direction :— 射线的方向。
    3. distance : —-射线的长度。
    4. hitInfo : ——如果返回 ture ,hitInfo 将包含碰撞器碰撞的信息 。
    5. layerMask : –只选定 LayerMask 层内的碰撞器,其它层内碰撞器忽略。
    out关键字传入一个空的碰撞信息类,然后碰撞后赋值。可以得到碰撞物体的信息。

    小知识

    1. Camera.main.ScreenPointToRay(Vector3 pos);

    创建一条以摄像机的近裁剪面上的一点为起点,经过鼠标对应世界坐标的射线。

    2.Camera.main.ScreenToWorldPoint(Vector3 position );

    将某一个屏幕坐标点转换成摄像机看见的世界坐标位置。传入的Vector3类型参数的z值指定了世界坐标距离摄像机的距离。

    3.Camera.main.ViewportPointToRay(Vector3 pos);

    创建一条以摄像机的近裁剪面上的一点为起点,到摄像机视口之内指定的一个点。

    例题

    在场景的视野中有一些有碰撞器的物体,当鼠标放在物体表面上时,按下鼠标左键,改变该物体的颜色。

    using UnityEngine;
    using System.Collections;
    
    namespace GaoSan{
        public class RaycastTest : MonoBehaviour
        {
            void Update ()
            {
                // 创建一条以摄像机的近裁剪面上的一点为起点,经过鼠标对应世界坐标的射线。
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                RaycastHit hit;
                if (Input.GetMouseButtonDown(0))
                {
                    if (Physics.Raycast(ray,out hit,100,1<<9))
                    {
                        hit.transform.GetComponent<MeshRenderer>().material.color = Color.red;
                    }
                }
            }
        }
    }

    当点击鼠标左键时,从摄像机的近裁剪面上的一点为起点,经过鼠标对应世界坐标的射线。射线长度为100,射线碰撞层级为9,(1<<9表示开启Layer9而0<<9表示关闭Layer9)其它层级忽略。(也就是说只有物体处于层级9才能被射线检测到。)

    层级
    创建三个物体,新建三个层级分别为8,9,10。把Plane、Cube和Sphere三个物体层级分别设置为8,9、10。脚本放到摄像机上点击运行,分别单机这三个物体,会发现只有Cube 会被改变颜色。
    运行后的结果Cube

    http://download.csdn.net/detail/joinl/9835051

    展开全文
  • 今天我就把我自己的思路分享给大家 ... ... OK,先从射线开始 射线的创建和显示 ...Ray射线类和RaycastHit射线投射碰撞信息类是两个最常用的射线工具类。...创建一条射线Ray需要指明射线的起点(origin)和射线...

    我们在使用Unity开发当中,可能会遇到这个问题,如何鼠标点击物体,在物体旁边出现UI呢

    今天我就把我自己的思路分享给大家

    1.鼠标点击,出现射线,用射线判断点击到的物体

    2.将UI设置到鼠标点击到的位置坐标

    效果:
    在这里插入图片描述

    OK,先从射线开始
    射线的创建和显示

    Ray射线类和RaycastHit射线投射碰撞信息类是两个最常用的射线工具类。

    创建一条射线Ray需要指明射线的起点(origin)和射线的方向(direction)。这两个参数也是Ray的成员变量。注意,射线的方向在设置时如果未单位化,Unity 3D会自动进行单位归一化处理。射线Ray的构造函数为 :

    public Ray(Vector3 origin, Vector3 direction);

    RaycastHit类用于存储发射射线后产生的碰撞信息。常用的成员变量如下:collider与射线发生碰撞的碰撞器
    distance 从射线起点到射线与碰撞器的交点的距离
    normal 射线射入平面的法向量
    point 射线与碰撞器交点的坐标(Vector3对象)

    Physics.Raycast静态函数用于在场景中发射一条可以和碰撞器碰撞的射线,相关的API如下:

    **1)public static bool Raycast(Vector3 origin, Vector3 direction, float distance=Mathf.Infinity, intlayerMask=DefaultRaycastLayers);**
         **参数说明:**
         origin            射线起点世界坐标
         direction          射线方向矢量
         distance            射线长度(起点到终点的距离),默认设置为无限长
         layerMask        显示层掩码(只选择层次为layerMask指定层次的碰撞器进行碰撞,其他层次的碰撞器忽略)
         **返回值说明:**
         当射线与碰撞器发生碰撞时返回值为true,未穿过任何碰撞器时返回为false。
    
         **2)public static boolRaycast(Vector3 origin, Vector3 direction, RaycastHit hitInfo, float distance =Mathf.Infinity, int layerMask = DefaultRaycastLayers);**
         这个重载函数定义了一个碰撞信息类**RaycastHit**,在使用时通过out关键字传入一个空的碰撞信息对象。当射线与碰撞器发生碰撞时,该对象将被赋值,可以获得碰撞信息包括transform、rigidbody、point 等。如果未发生碰撞,该对象为空。
    
         **3)public static boolRaycast(Ray ray, float distance = Mathf.Infinity, int layerMask =DefaultRaycastLayers);**
         这个重载函数使用已有的一条射线Ray来作为参数。
    
         **4)public static boolRaycast(Ray ray, RaycastHit hitInfo, float distance = Mathf.Infinity, intlayerMask = DefaultRaycastLayers);**
         这个重载函数使用已有的射线Ray来作为参数并获取碰撞信息RaycastHit。
         在调试时如果想显示一条射线,可以使用Debug.DrawLine来实现。
         **public static void DrawLine(Vector3start, Vector3 end, Color color);**
         只有当发生碰撞时,在Scene视图中才能看到画出的射线。
    
    

    下面是一个小例子

    //设置从哪个摄像机发射射线
    public Camera m_Camera;
    
    void Update()
    {
    if (Input.GetMouseButton(0))
            {
            //从摄像机发出到点击坐标的射线
                Ray ray = m_Camera.ScreenPointToRay(Input.mousePosition);
                RaycastHit hit;
                if (Physics.Raycast(ray, out hit))
                {
                //划出射线,只有在scene视图中才能看到
                    Debug.DrawLine(ray.origin, hit.point);
                }
            }
     }
    

    可以看一下效果,从摄像机位置向鼠标点击的位置发出一条射线

    然后判断碰撞到的物体

    //设置从哪个摄像机发射射线
    public Camera m_Camera;
    
    void Update()
        {
            if (Input.GetMouseButton(0))
            {
                Ray ray = m_Camera.ScreenPointToRay(Input.mousePosition);
                RaycastHit hit;
                if (Physics.Raycast(ray, out hit))
                {
                    Debug.DrawLine(ray.origin, hit.point);
                    GameObject gameobj = hit.collider.gameObject;
                    //注意要将对象的tag设置成collider才能检测到
                    if (gameobj.tag == "collider")
                    {
                        Debug.Log("点击到物体了");
                    }
                }
            }
        }
    

    最后一步,设置UI同步到鼠标点击到的位置,也就是物体的位置

    //设置从哪个摄像机发射射线
    public Camera m_Camera;
    //控制UI
        public GameObject m_UiPanel;
    
        // Use this for initialization
        void Start()
        {
            m_UiPanel.SetActive(false);
        }
    
        // Update is called once per frame
        void Update()
        {
            if (Input.GetMouseButton(0))
            {
                Ray ray = m_Camera.ScreenPointToRay(Input.mousePosition);
                RaycastHit hit;
                if (Physics.Raycast(ray,out hit))
                {
                    Debug.DrawLine(ray.origin, hit.point);
                    GameObject gameobj = hit.collider.gameObject;
                    if (gameobj.tag == "collider")
                    {
                        m_UiPanel.transform.position = Input.mousePosition;
                        m_UiPanel.SetActive(true);
                    }
                }
            }
        }
    

    然后呢,就发现点击物体之后,UI显示在物体正中心的位置,如果想要向旁边挪一下的话可以修改

    m_UiPanel.transform.position = Input.mousePosition;
    

    这一行代码

    m_UiPanel.transform.position = new Vector3(Input.mousePosition.x+100,Input.mousePosition.y+100,Input.mousePosition.z);
    

    OK,结束,有啥不懂的直接留言哦

    展开全文
  • 射线

    2020-09-12 22:32:20
    可调节射线的颜色、发射速度、方向、粗细。

    可调节射线的颜色、发射速度、方向、粗细。

    查看更多精彩图片

    查看更多精彩图片

    查看更多精彩图片

    查看更多精彩图片

    查看更多精彩图片

    展开全文
  • 3D射线拾取算法揭秘

    千次阅读 2017-01-15 15:34:09
    笔者介绍:姜雪伟,IT公司技术合伙人... 射线在现实生活中使用的非常广泛,现实生活中经常使用各种射线检测金属表面的瑕疵。游戏开发或者说虚拟实现开发中也经常使用射线拾取,比如游戏中拾取掉落物品,点击某个建筑物
  • 射线爆发方法简介   射线爆发算法(Rayburst algorithm)是一个经常被用于分析平面或者3D空间中复杂、不规则结构的算法。算法的核心思想很简单,如它的名字所描述的一样:以某一点为中心,向周围爆发出多条射线,...
  • 射线

    2019-12-27 21:33:44
    射线法 这是一个大佬看了都说简单的算法。。。。(甚至觉得没有掌握的必要) QAQ 这个算法是用来判断一个点是否在一个多边形以内。很简单 将这个点沿着x轴的正方向作射线。如果穿过的边数为基数,那么这个点在多边形...
  • Unity射线检测的用法总结

    万次阅读 2018-07-06 14:41:37
    RayCast 射线检测 助力快速理解 Unity 中射线检测的基本用法 本文提供全流程,中文翻译。 Unity 中提供了一种控制方案,用以检测鼠标点在屏幕上后 具体点在了 Unity 场景中,三维世界的哪个点上 用法上多种多样,在...
  • Unity 3D中的射线与碰撞检测

    万次阅读 2016-09-06 22:44:46
    在进行碰撞检测时,我们最常用的工具就是射线,Unity 3D的物理引擎也为我们提供了射线类以及相关的函数接口。本文将对射线的使用进行一个总结。 射线是在三维世界中从一个点沿一个方向发射的一条无限长的线。在射线...
  • 射线与三角形求交

    千次阅读 2017-06-16 21:56:53
    射线与三角形求交 在几何选取、碰撞检测上 经常会用到,在计算机图形学上是最初级的应用。  问题的由来 来自三维场景的鼠标点选,即通过鼠标点击 二维屏幕,对应于三维虚拟相机位置发出的一条射线,与场景中的几何...
  • unity3d射线的原理用法以及一个利用射线实现简单拾取的小例子 最近开始研究U3D,它的强大就不多说了, 今天研究了研究射线相关东西,总结了些东西放上来,一来做个笔记,二来和大家分享分享!嘿嘿~ 如果有不对的...
  • 射线检测算法在游戏中应用

    千次阅读 2017-01-09 15:25:15
    笔者介绍:姜雪伟,IT公司... 射线检测在游戏中使用的非常广泛,我们利用射线开发时,开发者只是调用引擎的接口即可实现,但是我们要了解其内部实现原理,这样我们也可以自己封装射线检测算法,射线检测算法利用程度
  • Unity2D射线出现的问题

    2019-08-16 15:50:28
    Unity2D的射线和3D的不同,他的射线会穿过精灵获取到多个精灵; 最大问题 1.在我目前使用的2017.2.4中2D的射线是无法打到加载2D刚体的精灵的.即.你需要射线打到某物体时,该物体不能有刚体.此问题现在的解决方案博主...
  • unity特殊形状的射线

    2020-06-21 15:00:27
    unity射线检测小弟自己记录学习一:射线的使用1:普通射线2:形状的射线检测二:射线的检查总结 小弟自己记录学习 一:射线的使用 1:普通射线 只检测射线检测的第一个物体 Ray ray = Camera.main.ScreenPointToRay(Input....
  • 什么是α射线、β射线、γ射线 https://www.sohu.com/a/230945619_100124721 1、α射线 放射性核素发生衰变时放出α粒子,产生α射线。α粒子是一个高速运动的氦原子核。对于天然放射系列的核素放出α粒子的...
  • Unity中射线描述

    2018-09-11 16:18:57
    UI的坐标与屏幕的坐标相同,且射线是在摄像机的区域内的,因此射线无法射向UI 要显示射线需添加LineRenderer组件,如添加前物体在UI层上,添加后则会自动到 摄像机的屏幕坐标。   射线的创建和显示 Ray射线类...
  • 射线追踪(ray tracing)

    千次阅读 2017-07-03 10:24:19
    射线追踪(ray tracing) 你未看此花时,此花与汝心同归于寂。你来看此花时,则此花颜色一时明白起来  王阳明的这个思想深刻的揭露了射线追踪的本质,在图形学的发展进程中,一直在追求接近真实事物,而现实的...
  • unity 3d中的射线与碰撞检测

    千次阅读 2018-03-17 12:28:14
    在网上看到一篇对射线简单梳理的文章,觉得对自己很有帮助,特此引用:原文章 射线的创建和显示 Ray射线类和RaycastHit射线投射碰撞信息类是两个最常用的射线工具类。 创建一条射线Ray需要指明射线的起点...
  • 最近开始研究U3D,它的强大就不多说了, 今天研究了研究射线相关东西,总结了些东西放上来,一来做个笔记,二来和大家分享分享!嘿嘿~ 如果有不对的地方希望指出哈 !- _ - 进入正题   射线射线是3D世界中一个点...
  • 射线与平面相交判断

    千次阅读 2019-05-15 14:37:41
    1 射线 定义 在欧几里德几何中,射线的定义如下: 直线上一点和它一旁的部分,由此知射线有两个性质: 1. 有一个端点 2. 一端无线延伸 参数方程 p(t) = p0+ tu p0是射线的起点, u是射线的方向向量,t∈[0,...
1 2 3 4 5 ... 20
收藏数 30,473
精华内容 12,189
关键字:

射线