Questions tagged «raycasting»

一种使用射线确定相交点的技术。常用于照明仿真。

4
投射射线以选择体素游戏中的方块
我正在开发一款具有类似于Minecraft的地形且由块组成的游戏。由于基本渲染和块加载现已完成,因此我想实现块选择。 因此,我需要找出第一人称相机所面对的障碍。我已经听说过要取消整个场景的投影,但是我决定反对,因为它听起来很hacky,而且不准确。也许我可以以某种方式向视图方向投射射线,但是我不知道如何用体素数据中的块检查碰撞。当然,此计算必须在CPU上完成,因为我需要结果才能执行游戏逻辑运算。 那么,如何找出相机前面的哪个块呢?如果可以的话,我该如何投射光线并检查碰撞?

2
如何在体素引擎中实现照明?
我正在创建类似于地形引擎的MC,我曾想过照明会使其看起来更好,但问题是当放置发光块时,这些块未正确照明(请参见底部的屏幕截图)在页面上。 到目前为止,我想实现我的世界的“块状”照明。所以我创建了一个VertexFormat: struct VertexPositionTextureLight { Vector3 position; Vector2 textureCoordinates; float light; public readonly static VertexDeclaration VertexDeclaration = new VertexDeclaration ( new VertexElement(0, VertexElementFormat.Vector3, VertexElementUsage.Position, 0), new VertexElement(sizeof(float) * 3, VertexElementFormat.Vector2, VertexElementUsage.TextureCoordinate, 0), new VertexElement(sizeof(float) * 5, VertexElementFormat.Single, VertexElementUsage.TextureCoordinate, 1) ); public VertexPositionTextureLight(Vector3 position, Vector3 normal, Vector2 textureCoordinate, float light) { …
15 c#  xna  lighting  raycasting 

1
如何在屏幕边缘绘制一个箭头,使其指向屏幕外的对象?
我希望执行本主题中描述的操作: http://www.allegro.cc/forums/print-thread/283220 我尝试了这里提到的各种方法。 首先,我尝试使用Carrus85描述的方法: 只需取两个三角形斜边的比率即可(与另一个三角形无关),我建议将点1和点2作为计算的距离。这将为您提供从较大三角形到角落的三角形的长宽比百分比。然后,您只需将deltax乘以该值即可得到x坐标偏移,然后将deltay乘以该值即可得到y坐标偏移。 但是我找不到一种方法来计算对象离屏幕边缘的距离。 然后,我尝试使用23yrold3yrold建议的射线投射(以前从未做过): 从屏幕中心向屏幕外对象发射光线。计算射线在矩形上的相交位置。有你的座标。 我首先计算了由两点的x和y位置差异形成的三角形的斜边。我用它沿着那条线创建了一个单位向量。我遍历该向量,直到x坐标或y坐标不在屏幕上。然后,两个当前的x和y值形成箭头的x和y。 这是我的光线投射方法的代码(用C ++和Allegro 5编写) void renderArrows(Object* i) { float x1 = i->getX() + (i->getWidth() / 2); float y1 = i->getY() + (i->getHeight() / 2); float x2 = screenCentreX; float y2 = ScreenCentreY; float dx = x2 - x1; float dy = y2 …

3
如何在基于块的2D游戏中实现遮挡照明?
我想要2D照明可以被游戏中的物体阻挡。我的游戏具有自顶向下的视图,所有游戏对象均由矩形描述。 假设我有一个10x10的世界,我在1x1处放置了一个灯光,并在该灯光周围放置了墙壁。我希望能够看到1x1的光源,但看不到其他任何地方,因为它被墙壁挡住了。 我听说过投射光线有效,但实际上如何运作?

1
为什么Unity的OnCollisionEnter不能给我表面法线,最可靠的方法是什么?
Unity的on碰撞事件为您提供了Collision对象,该对象为您提供了有关发生的碰撞的一些信息(包括具有击中法线的ContactPoints列表)。 但是您不会得到的是所命中的对撞机的表面法线。这是说明的屏幕截图。红线来自ContactPoint.normal,蓝线来自RaycastHit.normal。 这是Unity隐藏信息以提供简化API的实例吗?还是标准的3D实时碰撞检测技术只是不收集这些信息? 对于问题的第二部分,确保碰撞产生表面法线的方法是一种肯定有效且相对有效的方法? 我知道射线投射可以为您提供表面法线,但似乎我需要针对所有场景进行多次射线投射才能做到这一点(也许接触点/法线组合在第一次投射时错过了对撞机,或者您可能需要对所有物体进行平均接触点的法线以获得最佳效果)。 我目前的方法: 备份Collision.contacts[0].point其正常命中 对播放正常的否定命中的光线float.MaxValue,Collision.collider 如果失败,请对非负法向重复步骤1和2。 如果失败,请尝试执行步骤1至3 Collision.contacts[1] 重复4,直到成功或直到所有接触点耗尽为止。 放弃,返回Vector3.zero。 这似乎可以捕获所有内容,但是所有这些射线广播都使我感到不安,并且我不确定如何在足够的情况下测试这种方法是否奏效。有没有更好的办法? 编辑 如果这确实是3D冲突的处理方式,那么在一般情况下为什么要概述为什么与Unity特有的东西一样受欢迎。

3
如何处理3D空间中的RTS单击和移动?
如何在完整的3D空间中处理单击和移动?通过简单的射线广播很容易在2D平面上进行处理,但是在3D中却不是这种情况,因为没有用于射线广播的端点可以获取端点。 我有两个想法: 进行光线投射,然后允许玩家通过其他输入(例如,缪斯赫尔)来选择光线的距离。 而不是完整的3D,而是具有多个“高度层”,因此玩家可以在命令移动之前更改高度层。 你怎么看?

1
如何确保Roguelike的视场对称?
我正在研究类似Rogue的游戏,为此,我创建了一个光线跟踪/投射视场(FoV)算法,该算法包括将Bresenham线绘制到实心圆中的每个点。它没有伪影(并且相当有效),但是却缺少我的一个重要要求:对称(如果您可以看到怪物,那么它也必须能够看到您)。 这是我的代码的非对称行为的示例。在左图中,我站在一个角落(红色的“ X”块=墙)。我可以看到右上方的图块。但是,如果我移至其中一个图块(右图),将无法再看到我所来自的图块。 我认为我可能会追求某种形式的“ 允许视野”,但这仅仅是因为Roguebasin的文章建议允许对称。是否存在获取对称性的替代方法?

3
窄相碰撞检测算法
冲突检测分为三个阶段。 Broadphase:在所有可以交互的对象之间循环,如果可以加快循环,则允许误报。 Narrowphase(窄相):确定它们是否碰撞,有时如何碰撞,没有误报 解决方法:解决冲突。 我要问的问题是关于窄相的。有多种算法,复杂度和准确性不同。 Hitbox交集:这是一种后验算法,具有最低的复杂度,但也不太准确, 颜色交集:每个像素的Hitbox交集,后验,像素完美,时间上不准确,复杂度更高 分离轴定理:更常用,对三角形准确,但是a后验,因为它找不到边,考虑到最后一帧,它更稳定 线性射线广播:A先验算法,对半逼真的物理学很有用,它可以找到相交点,甚至比SAT还要精确,但是复杂性更高 样条插值:先验,比线性射线更精确,更复杂。 我可能已经忘记了更多。问题是,何时使用SAT更好,何时使用射线,何时花键以及是否有更好的选择。

2
查找哪些瓷砖与一条线相交,而无需遍历所有瓷砖或跳过任何瓷砖
我已经盯着这个问题几天了。我整理了此图形以帮助我直观地看到问题:( 从图形中我们知道线与[1,1],[1,2],[2,2],[2,3]相交,以[ 3,3]) 我想沿着直线移动到每个网格空间,并检查网格空间的材质是否牢固。我觉得我已经知道所涉及的数学,但是我还不能将其组合在一起。我正在使用它来测试视线并在通过我的寻路算法找到路径后消除节点-我的代理无法看到实体块,因此它们无法通过实体,因此不会从路径中消除该节点,因为它需要导航一个角。 因此,我需要一种算法,该算法将沿着直线移动到它相交的每个网格空间。有任何想法吗? 我看了很多常见的算法,例如布雷森汉姆算法,以及沿着线以预定间隔步进的算法(不幸的是,如果它们与比步长小的楔形相交,则此方法会跳过这些图块)。 我现在用大量floor()和ceil()函数填充我的白板-但是它变得过于复杂,我担心它可能会导致速度变慢。

2
具有两个角的对角线视线
现在,我正在使用Bresenham的线算法来获取视线。问题是我发现了一个边缘情况,玩家可以透过墙壁看。当玩家注视着墙的两个角之间,且在另一侧有特定角度的间隙时发生。 我想要的结果是将两堵墙之间的瓷砖标记为无效。 修改布雷森汉姆线算法以解决此问题的最快方法是什么?如果没有好的解决方案,是否有更合适的算法?任何想法都欢迎。请注意,该解决方案还应该能够支持3d。 编辑:我的简单解决方案是检查直线的x和y坐标更改时两个角是否都闭合。有关完整产品的工作源代码和交互式演示,请参见http://ashblue.github.io/javascript-pathfinding/

2
使用射线投射在二维网格上实现视线的更有效方法?
考虑一个2D的瓷砖网格,以及一个以视线为中心的近似坐标范围(以玩家为中心)。目标是将视线挡在障碍物(即墙)之外。 确定视野中是否有单个单元格是相对简单的:使用布雷森汉姆将光线从玩家投射到目标单元格-如果玩家和目标之间的重叠单元之一是障碍物,则目标单元格不可见。 现在,我的第一个想法是遍历视线中的所有网格单元-但这对我而言似乎效率很低。例如,如果玩家站在墙旁边,并且确定不可见墙外的单元,则可以确定射线之后的所有单元都不可见。 还考虑过将射线投射到视线范围内的每个单元格,然后沿着每个射线迭代每个单元格-但是我将不止一次处理一些单元格。 有更有效的方法吗? 虽然每圈迭代〜50个单元格是一个相对轻量级的计算,但我追求速度-目标是能够在自动播放中每秒循环几圈。因此,我可以做得越高效越好。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.