Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 线跟踪/光线投射如何在游戏引擎中测试交叉点?_C#_C++_Unity3d_Game Engine_Unreal Engine4 - Fatal编程技术网

C# 线跟踪/光线投射如何在游戏引擎中测试交叉点?

C# 线跟踪/光线投射如何在游戏引擎中测试交叉点?,c#,c++,unity3d,game-engine,unreal-engine4,C#,C++,Unity3d,Game Engine,Unreal Engine4,我从事游戏开发有一段时间了,从那以后,这个问题我一直找不到答案 那么,说真的,这种魔法是如何在其基础上发挥作用的呢?例如,当我使用虚幻引擎4时,我可以简单地调用LineTraceByChannel,选择起点和终点,然后引擎将跟踪一条线并返回命中结果。我也能想象它。但我的大脑认为: “好吧,没有像子弹一样射出线段这样的事情,这是一种更简单的可视化方式。这背后一定有大量的数学依据。它如何检测交叉参与者?它是检查所有可用的几何体,还是只检查端点-起点半径内的几何体?那么它是如何检测到这些演员在这个半径

我从事游戏开发有一段时间了,从那以后,这个问题我一直找不到答案

那么,说真的,这种魔法是如何在其基础上发挥作用的呢?例如,当我使用虚幻引擎4时,我可以简单地调用LineTraceByChannel,选择起点和终点,然后引擎将跟踪一条线并返回命中结果。我也能想象它。但我的大脑认为:

“好吧,没有像子弹一样射出线段这样的事情,这是一种更简单的可视化方式。这背后一定有大量的数学依据。它如何检测交叉参与者?它是检查所有可用的几何体,还是只检查端点-起点半径内的几何体?那么它是如何检测到这些演员在这个半径内的呢?为什么不‘那么’贵?”


如果有人能解释线追踪命中测试的背后是什么,我会非常有启发性…谢谢你的时间…

好问题。为了获得类似的简短答案,我想说“光线投射就是这样工作的。”“就这样。重要的是如何优化光线投射和获得的碰撞点,以及它背后的所有数学和软件技巧,使其变得如此便宜。然而,这是太深刻和复杂的东西,我相信在回答中无法解释。这并不意味着我知道答案

一种近似的未优化方法是检查场景的实体。光线只是一条线,所以有两点。然后,获得感兴趣的实体后,将获得最低的z坐标(最靠近光线投射出的摄影机),对于该实体的所有多边形,将检查3d实体模型的所有平面的。同样重要的是如何优化它,使其在计算上非常便宜,并用于例如
Update()

碰撞也会产生同样的问题。在2D中,这并不是那么容易,但是你可以自己构建一个简单的碰撞系统,来检查两个多边形是否发生碰撞,例如检查其中一个多边形的所有点(如果有的话)是否在另一个多边形内部。为了优化效率和/或精度以及边界体积(盒子、球体、胶囊、圆柱体等),使用了获取技术。当你转到3D时,它会失去控制

至于解释,即使是用于碰撞检测和优化的边界体积技术的内容也太大太深,无法在解释游戏引擎中碰撞的答案上进行解释,我相信应该会发生类似的事情来详细解释raycast的工作原理


无论如何,我也很乐意详细阅读关于raycast如何在游戏引擎中工作的任何评论,也许是一些高层次的解释,除了我解释的简单模型示例之外,我不知道它是否实际使用过,它只是一种计算几何方法来实现交点。

问得好。为了得到一个简短的答案“光线投射就像这样工作”,就这样。重要的是如何优化光线投射和获得的碰撞点,以及它背后的所有数学和软件技巧,使其变得如此便宜。然而,这是太深刻和复杂的东西,我相信在回答中无法解释。这并不意味着我知道答案

一种近似的未优化方法是检查场景的实体。光线只是一条线,所以有两点。然后,获得感兴趣的实体后,将获得最低的z坐标(最靠近光线投射出的摄影机),对于该实体的所有多边形,将检查3d实体模型的所有平面的。同样重要的是如何优化它,使其在计算上非常便宜,并用于例如
Update()

碰撞也会产生同样的问题。在2D中,这并不是那么容易,但是你可以自己构建一个简单的碰撞系统,来检查两个多边形是否发生碰撞,例如检查其中一个多边形的所有点(如果有的话)是否在另一个多边形内部。为了优化效率和/或精度以及边界体积(盒子、球体、胶囊、圆柱体等),使用了获取技术。当你转到3D时,它会失去控制

至于解释,即使是用于碰撞检测和优化的边界体积技术的内容也太大太深,无法在解释游戏引擎中碰撞的答案上进行解释,我相信应该会发生类似的事情来详细解释raycast的工作原理


无论如何,我也很乐意详细阅读关于raycast如何在游戏引擎中工作的任何评论,也许是一些高层次的解释,除了我解释的简单模型示例之外,我不知道它是否实际使用过,它只是一种计算几何方法来实现交点。

基本答案是,它对每一个其他几何对象进行命中测试,然后返回距离直线原点最近的一个。现在,在现实中,这其中的大部分被优化为只测试可能被击中的对象,或者对复杂对象执行更快的粗略测试,以确定是否执行更复杂和更慢的测试。我会让其他人详细说明。当我研究这个问题时,课程是针对边界框进行测试,因为AABB(轴对齐边界框)测试相对便宜。如果点击AABB,则可以进行更昂贵的网格测试。基本上,您使用“分层复杂性”(以及大量的汇编程序级优化)来实现“神奇”哇,我将详细介绍AABB和分层复杂性。非常感谢你!基本答案是,它对每一个其他几何对象进行命中测试,然后返回最接近直线原点的一个。现在,在现实中,这其中的大部分是优化的,只测试可能是hi的对象