射线

Unity 使用物理射线(Physics.Raycast),实现扇形区域碰撞检测三种方法(借鉴大神,仅作为笔记用)

若如初见. 提交于 2019-12-03 05:04:48
Unity 使用物理射线(Physics.Raycast),实现扇形(Fan-Shaped)区域碰撞检测。 参考之前的制作简单AI: Unity 有限状态机(Finite State Machine)的理解 与 实现简单的可插拔(Pluggable)AI脚本对象。 源码:GentleTank/PluggableAI/Scripts/Decision/LookDecision.cs 方法一: 实现原理:(lookAngle / 2) / lookAccurte   很简单,就是射多几条角度平均的射线。可以设置角度,精度(射线数量),来调节扇形区域的检测。每条射线夹角是总夹角处于2,再除于精度。    1. 默认是射出一条向前的射线,精度为0。 2. 设置角度为90,精度为1,就会多出两条相对正前方45度的射线。 3.设置精度为2。 实现代码 // // LookDecision // //放射线检测 private bool Look(StateController controller) { var defaultStats = controller.defaultStats; //一条向前的射线 if (LookAround(controller, Quaternion.identity, Color.green)) return true; //多一个精确度就多两条对称的射线

unity+射线检测

匿名 (未验证) 提交于 2019-12-02 23:26:52
private Camera aRCamera; Ray ray; RaycastHit hit; aRCamera = GameObject.Find("RenderCamera").GetComponent<Camera>(); if (Input.GetMouseButtonDown(0)) { startPos = Input.mousePosition; ray = aRCamera.ScreenPointToRay(startPos); Debug.DrawRay(ray.origin, ray.direction, Color.red);// 1.射线可视 //if(Physics.Raycast(ray,out hit2,int.MaxValue,1<<LayerMask.NameToLayer("Anim"))&&!EventSystem.current.IsPointerOverGameObject())// 2.UI穿透问题,命名空间:using UnityEngine.EventSystems; //if(Physics.Raycast(ray,out hit2,int.MaxValue,1<<LayerMask.NameToLayer("Anim")))// 3.选择层 if(Physics.Raycast(ray,out hit)) { if (hit

Unity 常用射线检测方法

匿名 (未验证) 提交于 2019-12-02 23:26:52
1.普通射线检测(一般用于检测某一个物体) Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 1 2 3 4 5 6 7 2.直线射线检测多个物体 1 2 3 4 5 6 7 8 9 10 3.球形射线检测(一般用于检测周边物体) 1 2 3 4 5 6 7 8 9 画出球形检测范围方法,可用 private void OnDrawGizmos() 版权声明:本文为博主原创文章,转载请附上博文链接! 文章来源: https://blog.csdn.net/Snailsnail_Smails/article/details/89682611

threejs点击事件

醉酒当歌 提交于 2019-11-29 06:37:06
本文链接:https://blog.csdn.net/ithanmang/article/details/80897888 示例浏览地址:https://ithanmang.gitee.io/threejs/home/201807/20180703/02-raycasterDemo.html 双击鼠标左键选中模型并显示信息。 首先,解释一下三种坐标系的概念:场景坐标系(世界坐标系)、屏幕坐标系、视点坐标系。 场景坐标 通过three.js构建出来的场景,都具有一个固定不变的坐标系(无论相机的位置在哪),并且放置的任何物体都要以这个坐标系来确定自己的位置,也就是(0,0, 0)坐标。例如我们创建一个场景并添加箭头辅助。 屏幕坐标 在显示屏上的坐标就是屏幕坐标系。 如下图所示,其中的clientX和clientY的最值由,window.innerWidth,window.innerHeight决定。 视点坐标 视点坐标系就是以相机的中心点为原点,但是相机的位置,也是根据世界坐标系来偏移的,webGL会将世界坐标先变换到视点坐标,然后进行裁剪,只有在视线范围(视见体)之内的场景才会进入下一阶段的计算 如下图添加了相机辅助线. 射线检测 若想获取鼠标点击的物体,name就需要把屏幕坐标系转换为three.js中的三维坐标系。 three.js提供了一个类THREE

Unity-点击屏幕进行移动

给你一囗甜甜゛ 提交于 2019-11-27 06:40:01
Unity中实现点击屏幕进行移动 1,首先获取点击事件 是在void Update里每帧都要监测 Input.GetMouseButton(0) 是输入鼠标抬起事件 0鼠标左键 1鼠标右键 2鼠标中键 Input.touchCount==1 移动平台 如手指触摸屏幕 1个手指1 2个手指2 3个手指3 2,点击事件在什么位置 1>首先在Hierarchty面板创建一个空物体起名Road(路) 在它的底下在建一个空物体改名叫Ground(地面),再在它的下面建一个平面Plane给名叫Ground,将 Mesh Rendere r 勾掉 它是渲染的意思 但是另一个 Mesh Collider 适用于碰撞检测的 2>做发先从摄像机发出射线和地面碰撞,碰到的点就是移动的点 Ray ray =Camera.main.ScreenpointToRay(Input.mouseposition) 射线 主摄像机 摄像机到屏幕一个点 鼠标位置 上面这张图是射线转换图 摄像机到屏幕一个点 ScreenPointToRay 屏幕转换为视窗 ScreenToViewportPoint 屏幕转换为世界 ScreenToWorldPoint 视窗转换为屏幕 ViewToScreenPoint 3>定义一个光线碰撞投射信息 RayCastHit hitInfo 4>有了射线就要进行碰撞 if(Physics

Unity 射线检测中的LayerMask

我是研究僧i 提交于 2019-11-27 05:49:27
mask翻译过来:遮罩 Unity中有32个Layer,LayerMask,这个参数,是用来决定,这32层中,哪些层需要检测,哪些层不与光线进行检测, 代码示例如下: LayerMask mask1 = 1 << 5; //只检测第五层 LayerMask mask2 = ~(1 << 7); //除了第七层都检测 LayerMask mask3 = (1 << 5)|(1 << 6 ); //只检测第五层和第六层 ...... if(Physics,Raycast(ray,out hit, mask1)) { Debug.Log("Test1 with mask1"); } 来源: https://blog.csdn.net/alexhu2010q/article/details/99459851

关于calibration(零星)

倾然丶 夕夏残阳落幕 提交于 2019-11-26 20:49:12
结构光深度检测的原理,本质就是双目视觉。用projector替代一个camera,投影的pattern就是双目视觉所需的其中一张图片。需要对camera和projector进行calibration。 以camera为例说一下自己对calibration的理解。 先将practical camera看做一个pin hole camera model,像平面与pin hole的距离为d。首先是要明确两个坐标系,一个是camera coordinate system(下边计为{C}),或者说是world coordinate system,以(calibrate出来的camera的)光心,也就是pin hole为{C}的origin,垂直于像平面指向外为z正半轴;第二个是image coordinate system(下边计为{I}),像平面的某个角为{I}的origin。原则上{I}是一个2D coordinate system,不过也可以看成3D的。 如上图所示,从左往右看过去,场景左上方的物体会通过光心O投射到像平面右下方,将像平面关于原点对称重新构造后,物体像就会在左上方,也就是我们通常见到保存好的图像,因此通常图像处理所涉及的坐标系原点在左上角。有一点要注意的是,这个像平面并不是实际的camera的像平面,并且可以看到这个像平面的一些特别之处,如{C}与{I}的坐标轴分别平行

Unity 3D中的射线与碰撞检测

一个人想着一个人 提交于 2019-11-26 03:11:13
在我们的游戏开发过程中,有一个很重要的工作就是进行碰撞检测。例如在射击游戏中×××是否击中敌人,在RPG游戏中是否捡到装备等等。在进行碰撞检测时,我们最常用的工具就是射线,Unity 3D的物理引擎也为我们提供了射线类以及相关的函数接口。本文将对射线的使用进行一个总结。 射线是在三维世界中从一个点沿一个方向发射的一条无限长的线。在射线的轨迹上,一旦与添加了碰撞器的模型发生碰撞,将停止发射。我们可以利用射线实现×××击中目标的检测,鼠标点击拾取物体等功能。 Ray射线类和RaycastHit射线投射碰撞信息类是两个最常用的射线工具类。 创建一条射线Ray需要指明射线的起点(origin)和射线的方向(direction)。这两个参数也是Ray的成员变量。注意,射线的方向在设置时如果未单位化,Unity 3D会自动进行单位归一化处理。射线Ray的构造函数为 : public Ray(Vector3 origin, Vector3 direction); RaycastHit类用于存储发射射线后产生的碰撞信息。常用的成员变量如下:collider与射线发生碰撞的碰撞器 distance 从射线起点到射线与碰撞器的交点的距离 normal 射线射入平面的法向量 point 射线与碰撞器交点的坐标(Vector3对象) Physics