这个平面射线相交代码正确吗?

2024-05-15

我的 Plane 类有两个字段:

public Vector3 Norm; //normal vector 
public double Offset; //signed distance to origin

这是我用于交集的代码,不知道是否正确。我加倍 检查了我的方程和所有内容,但我想得到人们的反馈 对此更有经验。

public override Intersection Intersect(Ray ray)
{
    // Create Intersection.
    Intersection result = new Intersection();

    // Find t.
    double t = - (Vector3.Dot(Norm,ray.Start) + Offset) / (Vector3.Dot(Norm, ray.Dir));
    if (t < 0) // the ray does not hit the surface, that is, the surface is "behind" the ray
        return null;

    // Get a point on the plane.
    Vector3 p = ray.Start + t * ray.Dir;

    // Does the ray intersect the plane inside or outside?
    Vector3 planeToRayStart = ray.Start - p;
    double dot = Vector3.Dot (planeToRayStart, Norm);
    if (dot > 0) {
        result.Inside = false;
    } else {
        result.Inside = true;
    }

    result.Dist = t;
    return result;
}

另外,我不知道如果t接近0该怎么办?我应该检查 epsilon 以及有多大吗 epsilon 应该是?我也不确定是否正确检查光线是否与平面相交 从内还是外?

Thanks


您的代码看起来大部分都很好,请参阅这张幻灯片 http://www.cs.princeton.edu/courses/archive/fall00/cs426/lectures/raycast/sld017.htm。由于您的平面本质上被定义为从特定点(封装在偏移参数中)开始并且与法向量正交的一组光线,因此您只需将视图光线上的点的定义插入到为了确定视线上的哪个点定义了这样一条正交光线。

问题在于您的视线是否在平面上。在这种情况下,观察光线和法线光线将是正交的,因此它们的点积将为 0,并且您将得到除以 0 的异常。您需要提前检查这一点:如果观察向量与法线的点积为 0,则意味着观察光线与平面平行,因此要么不存在交点,要么存在无限数量的交点。相交(射线在平面内)。不管怎样,我认为对于光线追踪,你通常会说没有交点(即没有任何可渲染的东西),因为在后一种情况下,你正在正面看着一个二维平面,所以你不会什么也看不见。

我不认为你有任何理由需要专门处理“接近 0”​​。光线要么与平面平行且无需渲染,要么不平行且与平面恰好相交于一点。最终您会遇到浮点舍入错误,但这只是渲染中的一个小错误源,无论如何,它只是场景的近似值。只要保持尺寸相当大,浮点误差就应该很小。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

这个平面射线相交代码正确吗? 的相关文章

  • 在 spritekit 中模拟水/使精灵“漂浮”在水面上

    我正在努力为我的比赛加水 除了背景颜色不同之外 没有什么其他的 不过 我想要player sprite漂浮在它的顶部 或一半 如果玩家只是从下面走进水中 我希望他浮到上面 如果他摔倒了 我希望他能慢慢改变方向并浮起来 当他在水中时 我尝试将
  • Unity 中的物理对象在低速时无法正确弹跳

    我遇到一个问题 当启用物理功能的球缓慢移动时 它无法正确地从物体上弹开 我做了一个视频来说明问题 https youtu be 9T1hkir7sCo 基本上 球应该撞到静止的球 静止的球应该弹开 当速度足够快时 这种方法有效 但低于阈值时
  • 随机运动pygame

    我正在尝试制作一个简单的生活模拟器 我需要 细胞 在屏幕上几乎随机移动 有一些规则 但问题是 一段时间后 它们往往会聚集在屏幕的左上角 我尝试改变很多事情 比如完全跳过规则并让它们完全随机移动 但它们仍然聚集在一起 我的代码中是否存在一些明
  • Java 砖块碰撞 [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我一直在开发一款 Breakout 游戏 除了砖块碰撞之外 几乎所有的事情都完成了 球在墙壁和桨上弹跳得很好 但当它碰到砖块时 它会直接穿过它们 我很确定问题出在主类的 chec
  • 当光线从嵌套对象内部开始时如何处理折射

    我正在构建一个简单的光线追踪器用于教育目的 并希望为对象添加折射 使用斯内尔斯定律 我能够在交点处递归地创建新射线 光线追踪器当前仅支持球体 我使用的场景中有多个球体嵌套在彼此内部 具有不同的折射率 如果我从球体外部发出光线 一切看起来都很
  • 无法创建物理体 - Swift

    我有一个名为 ChainsawMaker swift 的 Swift 文件 我想用它在整个游戏中创建链锯 当我调用此实例并将其添加到我的游戏中时 电锯及其物理主体会完美地添加到游戏中 除了控制台中弹出的错误 物理主体 无法创建物理主体 以下
  • 平稳的飞行运动,如飞翔的小鸟或喷气背包的重力和加速度欢乐之旅

    我正在开发一个简单的游戏 当您点击 单击屏幕时 角色就会飞翔 继续点击角色就会飞起来 有些类似于飞翔的小鸟和喷气背包 然而 就像喷气背包一样 运动一点也不顺畅 这是我的代码示例 变量初始化 maxSpeedLimit spriteHeigh
  • 如何保存类的实例列表?

    我正在用 C 编写光线跟踪器 需要能够检查场景中每个对象的交集 稍后会进行优化 为此 我需要保留类实例的运行列表 创建新实例时更新的指针列表将不起作用 因为据我所知 在初始化后无法增加数组的大小 如果有的话 我真的很想要一个内置的 C 解决
  • Pygame:key.get_pressed() 与事件队列不一致

    我正在尝试使用 Python 中的 pygame 为应用程序制定简单的控件 我已经掌握了基础知识 但我遇到了奇怪的困难 我使用箭头键来控制我的角色 如果我按住一个箭头键 然后按住另一个箭头键 对角线移动 角色将按预期移动 但是 如果我释放s
  • 用于光线/网格相交的 DirectX 11 计算着色器

    我最近将使用 D3DXIntersect 查找光线 网格交点的 DirectX 9 应用程序转换为 DirectX 11 由于 D3DXIntersect 在 DX11 中不可用 我编写了自己的代码来查找交点 该代码仅循环网格中的所有三角形
  • 确定点是否在 3D 三角形内部

    我正在寻求对我对确定点是否位于 3D 三角形内部的方法的看法的认可 给定一条 R t e td 形式的射线和一组三个点 T V0 V1 V2 它们在三维空间中形成一个三角形 我知道如何找到该平面的参数方程三点形成以及如何确定射线是否与该平面
  • 如何正确钳位贝克曼分布

    我正在尝试实现 Microfacet BRDF 着色模型 类似于 Cook Torrance 模型 但我在使用本文中定义的贝克曼分布时遇到了一些问题 https www cs cornell edu srm publications EGS
  • AndEngine游戏优化

    我在我的游戏中使用 java AndEngine 在游戏过程中我遇到了一些卡顿 我查找了信息并找到了一些如何优化游戏性能的步骤 避免GC 垃圾收集器 在游戏的主要动作中调用 a 游戏时不要创建物体 b 不要创建不必要的对象 优化重复次数较多
  • SKPhysicsContact有什么方法可以确定A和B哪个物体?

    在 SpriteKit 中 我们在 didBeginContact 方法中检测到 但这看起来有点愚蠢做这样的事情 func didBeginContact 联系人 SKPhysicsContact if let contactA conta
  • Unity函数可以立即从3D管道访问2D盒子吗?

    在 Unity 中 假设你有一个 3D 对象 当然 获得 AABB 很简单 Unity 有直接的函数 您可能必须以通常的方式 添加渲染器的所有边界框 没有问题 因此 Unity 确实有一个直接功能 可以在每一帧的内部网格 渲染管道之外立即为
  • 为什么光线追踪器将球体渲染为椭圆形?

    在过去的几天里 我第一次破解了光线追踪器 然而 有一些怪癖困扰着我 我真的不知道如何锻炼 从一开始就存在的一个是场景中球体的形状 渲染时 它们实际上看起来像椭圆形 当然 场景中有透视 但最终的形状仍然显得奇怪 我附上了渲染示例 我遇到的问题
  • Unity3D,“击倒”类型的灯光对象?

    在 Unity 场景中 想象一下 一个大型滑动物体 可能是 集装箱 或 沙发 由于某种原因滑动 路上有一些2m高的轻质木棍轻轻地插在地上 在现实生活中 木棍会站在那里 首先 这在 PhysX 中实际上很难实现 当大物体击中它们时 大物体将是
  • 传递Physics2DShapeQueryParameters 层进行检查

    我目前正在为我的 2D 自上而下游戏开发一个构建系统 最后一步是检查是否有任何物体 例如树或玩家 阻碍了物品的放置 经过一些研究后 我发现使用Physics2DShapeQueryParameters 是正确的方法 我唯一的问题是我不知道如
  • 快速移动的球与鼠标控制的球拍的碰撞检测问题

    在统一中 我有一个应该击球的球拍 并且球拍直接由鼠标控制 即鼠标使用鼠标轴移动球棒并使用 translate 函数移动球拍 我预计 Unity3d 的物理特性不会直接通过鼠标正确地转换球拍的运动并相应地影响球 我必须编写一些自定义的内容 结
  • Phong 着色问题

    我正在根据以下内容编写着色器冯模型 http en wikipedia org wiki Phong reflection model 我正在尝试实现这个方程 其中 n 是法线 l 是光线方向 v 是相机方向 r 是光反射 维基百科文章中更

随机推荐