射线

光线追踪技术 - 第二章 – Phone光照模型、镜像和阴影

萝らか妹 提交于 2020-01-02 15:44:18
光线追踪技术 - 第二章 – Phone光照模型、镜像和阴影 Raytracing Topics & Techniques - Part 2 - Phong, Mirrors and Shadows 原作者:Jacco Bikker 原文地址: http://www.flipcode.com/archives/Raytracing_Topics_Techniques-Part_2_Phong_Mirrors_and_Shadows.shtml 翻译日期:2012年5月24日 引言 在第一章中,我介绍了光线追踪的基础知识:从摄像机发射一系列穿过屏幕到达场景的射线,找出每条射线最近的交点,然后用交点的法线点乘指向光源的向量得出一个简单的漫反射阴影。 在第二章中,我将介绍Phone先生,他的卫生间的镜子和他的背光面:) 主射线 VS 二级射线 考虑下面的这张图: 图一:主射线 这张图展示了第一章中的简单光线跟踪器的射线发射到场景中的情形。一条射线可以与光源或一个物体碰撞,或者什么都没有碰到。这些射线没有反射和折射,它们被称为“主射线”。 除主射线外,你可以使用“二级射线”。下面图片展示了此种情况: 图2:各种各样的二级射线 图中蓝色的线是反射光线。对于反射来说,它简单的从一个平面弹回来。稍后会介绍如何计算它。 绿色的线是折射光线。它比反射光线要难计算一些,但也是可以计算的

相机射线目标检测

梦想的初衷 提交于 2019-12-26 16:24:18
/// <summary> /// 从相机发射射线 返回hitPoint 若未射到物体,返回值为相机forward加rayRange的范围点 /// </summary> /// <param name="rayCamera"> 发射射线的相机</param> /// <param name="rayRange">未射到物体时,返回的射线可达最大范围值</param> /// <returns> 确定瞄准点 </returns> public static Vector3 CameraRayPosition(Camera rayCamera,int rayRange) { RaycastHit hit; Ray ray = new Ray(rayCamera.transform.position, rayCamera.transform.forward); if (Physics.Raycast(ray, out hit, Mathf.Infinity)) { return hit.point; } else { return rayCamera.transform.position + (rayCamera.transform.forward * rayRange); } } 来源: CSDN 作者: ysong0913 链接: https://blog.csdn.net

VRTK射线检测

三世轮回 提交于 2019-12-17 21:25:01
VRTK射线检测回调事件 本人在工作中做VR隐患排查项目开发的时候,有个功能需要做到:按下手柄触摸板发送射线,松开触摸板的时候处理射线最后检测到的那个游戏物体。 功能构思:1、按下触摸板,从手柄上发射射线;      2、当射线停留在某个游戏物体上时,将此游戏物体添加到List列表中;      3、当射线移开此物体,停留在下一个游戏物体时,移除List列表中刚刚检测到的游戏物体(由于射线是一直检测的,所以当你不停的移动射线时,会不停的添加和移除射线检测到的游戏物体);      4、当射线停留在你想处理的某游戏物体上时(此时游戏物体添加到List列表中),松开触摸板,此时可以对此游戏物体进行一系列逻辑处理;      5、逻辑处理完成后,会执行移除List列表中的游戏物体,以便于下次使用射线检测。 获取射线碰撞到的某个物体这一类功能。可以通过VRTK里面的事件回调获取。 想使用VRTK射线检测,首先需要打开unity,导入SteamVR SDK和VRTK插件,在此不做演示。 在VRTK的脚本中,有VRTK_ControllerPointerEvents_ListenerExample和VRTK_DestinationMarker两个脚本。 下面贴上本人代码以供参考: public class Test() {   private VRTK_Pointer

反复横跳的瞄准线!从向量计算说起!基于射线检测的实现!Cocos Creator!

二次信任 提交于 2019-12-17 02:18:05
最近有小伙伴问我瞄准线遇到各种形状该怎么处理?如何实现反复横跳的瞄准线?最近刚好在《Cocos Creator游戏开发实战》中看到物理系统有一个射线检测,于是,基于这个射线检测,写了一个反复横跳的瞄准线效果。一起往下看吧!文章底部获取完整项目! 国际惯例,先上最终效果! 在讲解之前我们需要一些向量的知识,简单的介绍一些吧! 向量的加法, OA AB = OB 向量的点乘,表示一个向量在另一个向量上的投影,是个标量,有正负之分。向量夹角小于 90度 为正数,等于 90度 为 零,大于 90度 为负数。 向量的叉乘,结果为向量,正好垂直于两个向量构成的平面(右手系),也称为法向量。这里暂时没用到,顺便提一下。 接下来进入正题,已知入射向量(单位向量),法向量(单位向量),如何得出反射向量? 我们将反射向量平移至入射向量起点,延长法向量与其相交,这个延长线的长度,刚好是 入射向量在法向量上的投影的相反数的两倍 。再根据投影和向量加法可以推出反射向量的计算公式。 清楚了么?不清楚也没关系,记得最后的公式就可以了,接下来进入 cocos creator 操作环节。 既然是物理系统中的碰撞检测,我们在编辑器里添加的是物理系统中的碰撞器,而不是引擎的碰撞器,不要选错了哦。 不动的刚体类型设为 static ,添加完所有的物理碰撞器后如下所示。 用到物理引擎自然要把物理引擎打开。 cc

Unity3D射线

独自空忆成欢 提交于 2019-12-15 00:45:17
射线 射线分类:线段,球形 如何发射两种射线: 1.发射线段 //射线只能返回第一碰撞物体信息 Ray ray = Camera.main.ScreenToRay(Input.mousePosition); RaycastHit info; if(Physics.Raycast(ray,info,Mathf.Infinity,1<<LayerMask.NameToLayer("Item"))){ Mathf.Infinity 射线长度 无限大 LayerMask.NameToLayer("Item")只能碰撞这些层的物体 } //射线返回所有碰撞物体的信息 Ray ray = Camera.main.ScreenToRay(Input.mousePosition); RaycastHit[] infoArr =Physics.Raycast (ray,Mathf.Infinity,1<<LayerMask.NameToLayer("Item")); 2.发射球形射线 Collider[] collider = Physics.OverlapSphere(发射的位置,发射半径,层); 来源: CSDN 作者: 醉幻d落叶 链接: https://blog.csdn.net/qq_42693717/article/details/100888256

射线与AABB盒相交检测算法(Slabs method)

雨燕双飞 提交于 2019-12-14 23:38:05
一. 射线与平面求交 设射线的起始点为P 0 , 射线方向向量为 ,则射线的任一一点的方程可表示为      设平面的法线向量为 ,则平面上任一点的坐标P满足      意为,坐标原点与平面上任一点的向量 在 上的投影长度为常量d. 由以上射线和平面的方程可知,交点处坐标满足      解得      二.射线相对包围盒的近面与远面 AABB盒一共有6个面,可将其中三个面分为射线的近面,另三个面视为远面.近面和远面不是按离射线起点或离射线某点的距离来定义的,而是看与盒的6个面的法线向量方向 , 与 射线的方向向量方向相同的视为远面,与射线方向向量方向相反的视为近面,即:射线方向向量与近面的法线向量的点乘<0,与远面的法线向量的点乘>0,如果射线与盒的某个面法线向量点乘=0,则射线与盒不会相交。当然,这里不需要会去求射线与各个法线向量的乘积然后再判断哪个为近面哪个为远面,而是直接计算射线与AABB盒同一轴上两个面的交点,然后再利用以下的第3点,来判断哪个是近面交点哪个是远面交点。 如果射线与AABB盒相交,则必会满足如下几点: 如果射线与AABB盒有交点,那么射线就一定会穿过AABB盒 射线必定先与三个近面中的一个相交 根据直线方程和1,2,其在远面交点的t值一定比与近面交点的t值大 对以上三点,1,2都不言自明,对于第三点,想像将AABB盒的每个面进行延展

Unity学习笔记:相机属性

送分小仙女□ 提交于 2019-12-12 14:26:29
clera Flag清除标记 skybox 具备天空盒,清除前面绘制的图形。 solid Color 具备背景图效果,清除前面绘制的图形。 Depth only没有背景和天空盒,不清除前面绘制的图形,清除图像的深度。(图像覆盖) Dont Clear没有背景和天空盒,不清除前面绘制的图形,也不清除图形深度。 清除标记,deepth,剔除遮挡 三个因素共同影响最后摄像机的成像。 优先渲染方法:设置副摄像机,将其clera Flag设置为Depth only然后将渲染的层级Culling Mask设置需要被优先渲染的物体的层级,然后将其优先级Depth设置→大于←主摄像机 代码设置层级: gameObjuct.Camera.cullingMask = LayerMask.GetMask(复数string);根据传入的参数来激活所有与参数名字相同的层级。 gameObjuct.Camera.cullingMask = int;根据传入的数字转换成二进制激活层级。激活第一层为1,一二层为3,一二三层为7,第四层为8,第n层就是2的n-1次方。 Projection切换透视模式和正交模式,正交模式将摄像机矩形投射出去,多用于观察地图。 size(正交)矩阵的大小,值为高度的一般,长度的黄金比例(雾) gameObjuct.Camera.fieldfview返回透视相机广角的角度。

IOI2020第一轮选拔模拟3

冷暖自知 提交于 2019-12-10 01:55:21
到杭州学军中学集训的第一天。 今天比赛当场只能打暴力,改题也只改了一题。(好难啊!!!) T1:首先我们把x轴上方的点向每一座墙的左右端点连射线,然后将这些射线能合并的合并(意思就是算出每一个x轴上方的点的被遮挡区间)。 接着我们计算每一个x轴下方的点的答案。具体做法就是每次都枚举k座墙的左右端点,然后加上经过左端点的在当前点的左侧的射线的数量,减去经过右端点的在当前点的左侧的射线的数量。算出来的就是不能攻击到的点的数量了。 这题思维性很强,题解很难说清楚,还是需要手推一下。 T2:题解待更新。 T3:题解待更新。 来源: CSDN 作者: chiyankuan 链接: https://blog.csdn.net/chiyankuan/article/details/103463437

unity 鼠标拖拽物体(完美版)

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-03 14:53:46
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ModelDrage : MonoBehaviour { private Camera cam;//发射射线的摄像机 private GameObject go;//射线碰撞的物体 public static string btnName;//射线碰撞物体的名字 private Vector3 screenSpace; private Vector3 offset; private bool isDrage = false; void Start() { cam = Camera.main; } void Update() { //整体初始位置 Ray ray = cam.ScreenPointToRay(Input.mousePosition); //从摄像机发出到点击坐标的射线 RaycastHit hitInfo; if(isDrage ==false) { if (Physics.Raycast(ray, out hitInfo)) { //划出射线,只有在scene视图中才能看到 Debug.DrawLine(ray.origin, hitInfo.point); go = hitInfo

1.1 背景知识

随声附和 提交于 2019-12-03 11:10:32
加电场E后,射线由P1点偏到P2,由此可知阴极射线带有负电(e)。再加上一个方向与纸面垂直的磁场H,使束点从P2再回到P1,即使磁力(Hev)和电力(Ee)大小相等、方向相反。可以得出v=E/H。 去掉电场,由于磁场方向与射线运动方向垂直,将使射线构成一圆形轨迹。若此圆形轨迹的半径为r,则射线内的粒子(质量为m)受到的离心力为mv^2/r,它与磁力Hev相平衡。可以得出e/m=E/H^2 r。 e=1.602*10^-19C e是任何客体能携带的最小的电荷量。为什么电荷是量子化的?这是物理学至今仍未解决的一个难题。 me=9.109*10-31kg 至于电子质量为什么是这个数值,今天的物理学尚无法回答。 规范场理论中有没有解释? mp/me=1836.15 这一比值是原子物理学中最重要的无量纲常数之一。就是这个常数,决定了原子物理学的最主要的特征。如果这个比值是1的数量级,那么今天的物理世界将完全变样。至于这个比值为什么是这样的数值而不是那样的数值?我们至今无法回答。今天的物理学还没有能力从第一性原理出发导出这个常数。 我们认为电子与质子的电荷的绝对值是相同的,这一结论只能从实验得出,在当今物理学中,并没有哪个基本原理提出这一要求。 1电子伏(1eV)表示1个带单位电荷(e)的粒子在电位差为1V的电场中加速所得到的能量,它与常用能量单位的关系为: 1eV=1.602*10^-19C