Unity+Hololens学习记录-射线应用

  • 前言
  • 射线介绍:
  • 射线应用元素介绍:
    • Ray
    • RaycastHit
    • Raycast
  • 射线应用实例:
    • 射线碰撞信息获取
    • Camera发出Ray
    • Gaze射线
    • 检测周围物体
  • Hololens部分
    • IFocusable
    • IInputClickHandler
    • IInputHandler
    • Interaction Receiver

前言

最近不断地被要求实现Unity与Holotoolkit上的一些新操作功能,便想着写一下博客记录汇总一下各个方向的操作,也是方便以后的工作进行资料查询。也是作为一个新手结合官网API介绍,码一下自己对于一些系统的理解,希望有大神能够提点一下,让我修正有错误的地方。

射线介绍:

射线(Ray)是Unity系统中用于检测碰撞的一个手段,常用于检测周围是否存在物体,以及利用周围的物体进行判断有不同的响应。
(官网定义: 射线是从原点开始并沿某个方向前进的无限线。)

射线应用元素介绍:

Ray

  • 方向(direction)
  • 原点(origin)
  • GetPoint()
  • ToString()

RaycastHit

  • barycentricCoordinate:击中物体重心坐标
  • collider:击中的碰撞体
  • distance:原点到碰撞点距离
  • lightmapCoord: Vector2 这可用于对光照贴图进行采样并将采样的颜色值设置为移动对象的材质颜色,以使其与烘焙照明大致匹配。
  • normal:射线击中表面的法线
  • point:碰撞点
  • rigidbody:碰撞的刚体
  • textureCoord:uv纹理坐标
  • textureCoord2:uv第二个纹理坐标
  • transform:碰撞体的transform
  • triangleIndex:碰撞体triangle的索引

Raycast

 public static bool Raycast(Vector3 origin, Vector3 direction,float maxDistance = Mathf.Infinity,int layerMask = DefaultRaycastLayers,QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);
  • origin:射线起点
  • direction:射线方向
  • maxDistance:射线最远距离
  • layerMask:用于在投射射线时选择性地忽略碰撞器
  • layers:最常用于相机中仅渲染场景的一部分,并通过灯光仅照亮场景的某些部分。但它们也可以被光线投射用来有选择地忽略colliders或创建碰撞。
  • QueryTriggerInteraction:指定此查询是否应该触发触发器。

射线应用实例:

射线碰撞信息获取

RatcastHit  hit;
Physics.Raycast(ray, out hit) //单个碰撞体
RatcastHit[]  hits;
Hits=Physics.RaycastAll(transform.position,transform.forward,distan)//碰撞体数组

Camera发出Ray

Ray ray=Camera.main.ScreenPointToRay(new Vector3(0, 0, 0));
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{Debug.Log(hit.transform.name);
}

Gaze射线

if (Input.GetMouseButton(0))//鼠标按下发出射线,检测点击
{RaycastHit hit;
if(Physics.Raycast( Camera.main.transform.position,Camera.main.transform.forwrd, out hit, 20.0f, Physics.DefaultRaycastLayers)) { }
}

检测周围物体

Ray rRay = new Ray(transform.position, (transform.position + new Vector3(1f, 0f, 0f) * 20));
RaycastHit rhit;
if (Physics.Raycast(rRay, out rhit, 10))//distance=10
{//if (hit.collider.gameObject.tag == "flizi")if (rhit.collider.gameObject.tag == gameObject.tag)//通过Tag区分物体{//GameObject.Find("outPost").GetComponent<Animation>().Play("Default Take");Debug.Log("same");//同类物体}else if (rhit.collider.gameObject.tag != gameObject.tag){Debug.Log("different");//不同类物体}
}

Hololens部分

理解了射线的原理,进行一些射线的应用操作也相对比较简单了
Holotoolkit-Unity封装了很多API
接下来看一下有关Gaze和Focu的API

IFocusable

IFocusable主要包含了凝视进入和凝视退出两个应用

  • OnFocusEnter()
  • OnFocusExit()
using HoloToolkit.Unity.InputModule;
public class FocusControll : MonoBehaviour, IFocusable
{public void OnFocusEnter(){}public void OnFocusExit(){}
}

IInputClickHandler

处理点击事件

using HoloToolkit.Unity.InputModule;
public class ClickController : MonoBehaviour, IInputClickHandler
{public void OnInputClicked(InputClickedEventData eventData){if (Isinteractable(eventData.selectedObject)){InputClicked(eventData.selectedObject, eventData);}}
}

IInputHandler

处理点击的按下和释放

using HoloToolkit.Unity.InputModule;
public class ClickController : MonoBehaviour, IInputHandler
{public void OnInputDown(InputEventData eventData){if (Isinteractable(eventData.selectedObject)){InputDown(eventData.selectedObject, eventData);}}public void OnInputUp(InputEventData eventData){if (Isinteractable(eventData.selectedObject)){InputUp(eventData.selectedObject, eventData);}}
}

Interaction Receiver

Interaction Receiver是一个方便的构造块,允许你在一个位置处理来自多个对象的事件。
如下图所示,所有的按键相关的物体都被链接到receiver物体上。

Receiver组件图:
interactables上附上所需识别事件的物体

代码功能实现,包括了Focus事件和Input事件

using HoloToolkit.Unity.InputModule;
public class ButtonReceiverExample : InteractionReceiver{protected override void FocusEnter(GameObject obj, PointerSpecificEventData eventData) {Debug.Log(obj.name + " : FocusEnter");}protected override void FocusExit(GameObject obj, PointerSpecificEventData eventData) {Debug.Log(obj.name + " : FocusExit");}protected override void InputDown(GameObject obj, InputEventData eventData) {Debug.Log(obj.name + " : InputDown");}protected override void InputUp(GameObject obj, InputEventData eventData) {Debug.Log(obj.name + " : InputUp");}protected override void InputClicked(GameObject obj, InputClickedEventData eventData){Debug.Log(obj.name + " : InputClicked");}
}


图截于:Hololens官方教程精简版 - 02. Introduction with Device

Unity+Hololens学习记录-射线应用相关推荐

  1. Unity Shader 学习记录(3) —— CG语言和Shader文件

    1 什么是语义 赋给shader的输入输出的字符串,表达了参数的含义.语义告诉shader从哪里获取数据,又把数据输出到哪里. 2 Shader的三种debug方法 1 假色彩图像 2 VStudio ...

  2. unity shader 学习记录

    记录下我学习unity shader的过程,并把我看到过的高质量教程推荐给大家! 借助插件shaderforge来熟悉着色的效果,并对照着shaderforge自动生成的shader代码手工优化和实现 ...

  3. [Unity] GameFramework 学习记录 3

    首先要仿照飞船的创建流程创建一个主角 首先直接导入 Starter Assets - Third Person Character Controller 太爽了 我看看啊 他这个是除了 ThirdPe ...

  4. [Unity] GameFramework 学习记录 1

    下载框架作者的示例工程 https://github.com/EllanJiang/StarForce 移动到 unity 空项目中 然后再下载 Gameframework https://githu ...

  5. Unity Shader学习记录(18) —— Shader动画

    纹理动画 纹理动画在游戏中的应用非常广泛.尤其在各种资源都比较局限的移动平台上,我们往往会使用纹理动画来代替复杂的粒子系统等模拟各种动画效果. 11.2.1序列帧动画 _Time是float4类型, ...

  6. Unity Shader 学习记录(5) —— 实现漫反射光照模型

    1 公式计算 从公式可以看出,要计算漫反射需要知道4 个参数:入射光线的颜色和强度 cgh"材质的漫反射系数mdiuse,表面法线n以及光源方向I. 为了防止点积结果为负值,我们需要使用ma ...

  7. Unity Shader学习记录(6) —— 高光反射光照模型和内置计算函数

    1 高光反射光照模型计算公式 从公式可以看出,要计算高光反射需要知道 4 个参数:入射光线的颜色和强度c,材质的光反射系数 m,视角方向v以及反射方向r.其中,反射方向r可以由表面法线n和光源i计算得 ...

  8. Unity animiator 学习记录【2D角色移动】

    假设已存在一个玩家对象,想让其能完成4方向的移动. 那么需要4方向的动画,及控制4方向动画转变的控制器,改变玩家位置的某种方法. 添加Animator  动画组件 这个组件需要一个控制器文件  创建文 ...

  9. [Unity] GameFramework 学习记录 2

    嗯--要开始尝试做自己的事了 一开始策划给我列了这些 工程仓库搭建 工程程序框架 第三人称相机实现 主角基础移动实现 主角闪避实现 主角战斗实现 主角能量条实现 近战敌人战斗实现 远程敌人战斗实现 U ...

最新文章

  1. vcenter converter 转换xenserver下linux的错误
  2. 北京尚学堂|程序员励志名言
  3. python的垃圾处理机制_Python语法入门之垃圾回收机制
  4. mysql排序分页乱的_Mysql 排序分页混乱
  5. global cache cr request
  6. 【数据结构与算法】之深入解析“分割回文串”的求解思路与算法示例
  7. 支付宝 .NET SDK 报错:RSA签名遭遇异常,请检查私钥格式是否正确。
  8. openjdk 编译_使用OpenJDK 11运行JAXB xjc编译器
  9. OpenCR arduino problem list
  10. 表格占据整个页面_excel转换为pdf6个示例,在多个工作表、表格和空白页中进行选择...
  11. webservice第一篇【介绍、Scoket、http调用、wsimport调用】
  12. angular--Observable总结
  13. Waymo真·无人车将开上加州马路,却不是申请无司机路测第一家
  14. 三维重建笔记_相机标定_求本质矩阵E
  15. scratch课程案例——漫天飞雪
  16. SQL Server中查询ORACLE的数据
  17. python写ppt_python可以写PPT吗
  18. ConfuserEx加密工具
  19. Project(9)——收货地址 -查看列表
  20. 鹰式价差matlab,期权价差

热门文章

  1. 电机滑环配件的最新介绍
  2. 猎豹android studio,小米方盒音箱与猎豹音箱对比
  3. c语言中定义结构体指针的作用,C语言结构体定义,使用及指针(1)
  4. 睿速QQ营销——网上销售领航者!!
  5. 激发创新活力 橙色云让协同研发设计不再高不可攀
  6. 【opencv实战】哈哈镜
  7. cannot open https //centos7.iuscommunity.org/ius-release.rpm. skipping
  8. 苹果开放降级_iOS 彻底不能降级了,凉凉~
  9. 十进制转换为二进制的几种方法
  10. 普通数据改为onehot编码,onehot转换为普通数据