3D 线-平面相交

2023-12-03

如果给定一条线(由一个向量或线上的两个点表示),如何找到该线与平面相交的点?我已经找到了大量关于这方面的资源,但我无法理解那里的方程(它们似乎不是标准代数)。我想要一个可以用标准编程语言(我使用的是Java)解释的方程(无论多长)。


下面是一个查找直线和平面交点的 Python 示例。

其中平面可以是点和法线,也可以是 4d 向量(法线形式), 在下面的例子中(提供了两者的代码).

另请注意,此函数计算一个表示该点在线上位置的值(称为fac在下面的代码中)。 您可能也想返回它,因为从 0 到 1 的值与线段相交 - 这可能对调用者有用。

其他细节在代码注释中注明。


注意:此示例使用纯函数,没有任何依赖项 - 以便轻松迁移到其他语言。 与一个Vector数据类型和运算符重载,可以更简洁(包含在下面的示例中)。

# intersection function
def isect_line_plane_v3(p0, p1, p_co, p_no, epsilon=1e-6):
    """
    p0, p1: Define the line.
    p_co, p_no: define the plane:
        p_co Is a point on the plane (plane coordinate).
        p_no Is a normal vector defining the plane direction;
             (does not need to be normalized).

    Return a Vector or None (when the intersection can't be found).
    """

    u = sub_v3v3(p1, p0)
    dot = dot_v3v3(p_no, u)

    if abs(dot) > epsilon:
        # The factor of the point between p0 -> p1 (0 - 1)
        # if 'fac' is between (0 - 1) the point intersects with the segment.
        # Otherwise:
        #  < 0.0: behind p0.
        #  > 1.0: infront of p1.
        w = sub_v3v3(p0, p_co)
        fac = -dot_v3v3(p_no, w) / dot
        u = mul_v3_fl(u, fac)
        return add_v3v3(p0, u)

    # The segment is parallel to plane.
    return None

# ----------------------
# generic math functions

def add_v3v3(v0, v1):
    return (
        v0[0] + v1[0],
        v0[1] + v1[1],
        v0[2] + v1[2],
    )


def sub_v3v3(v0, v1):
    return (
        v0[0] - v1[0],
        v0[1] - v1[1],
        v0[2] - v1[2],
    )


def dot_v3v3(v0, v1):
    return (
        (v0[0] * v1[0]) +
        (v0[1] * v1[1]) +
        (v0[2] * v1[2])
    )


def len_squared_v3(v0):
    return dot_v3v3(v0, v0)


def mul_v3_fl(v0, f):
    return (
        v0[0] * f,
        v0[1] * f,
        v0[2] * f,
    )

如果平面定义为 4d 向量(正常形式),我们需要在平面上找到一个点,然后像以前一样计算交点(参见p_co任务)。

def isect_line_plane_v3_4d(p0, p1, plane, epsilon=1e-6):
    u = sub_v3v3(p1, p0)
    dot = dot_v3v3(plane, u)

    if abs(dot) > epsilon:
        # Calculate a point on the plane
        # (divide can be omitted for unit hessian-normal form).
        p_co = mul_v3_fl(plane, -plane[3] / len_squared_v3(plane))

        w = sub_v3v3(p0, p_co)
        fac = -dot_v3v3(plane, w) / dot
        u = mul_v3_fl(u, fac)
        return add_v3v3(p0, u)

    return None

为了进一步参考,这是从 Blender 中获取并改编为 Python 的。isect_line_plane_v3() in math_geom.c


为了清楚起见,这里是使用的版本数学工具 API (可以针对具有运算符重载的其他数学库进行修改).

# point-normal plane
def isect_line_plane_v3(p0, p1, p_co, p_no, epsilon=1e-6):
    u = p1 - p0
    dot = p_no * u
    if abs(dot) > epsilon:
        w = p0 - p_co
        fac = -(plane * w) / dot
        return p0 + (u * fac)

    return None


# normal-form plane
def isect_line_plane_v3_4d(p0, p1, plane, epsilon=1e-6):
    u = p1 - p0
    dot = plane.xyz * u
    if abs(dot) > epsilon:
        p_co = plane.xyz * (-plane[3] / plane.xyz.length_squared)

        w = p0 - p_co
        fac = -(plane * w) / dot
        return p0 + (u * fac)

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

3D 线-平面相交 的相关文章

  • 绘制 3D 线,matlab

    我的问题非常标准 但找不到解决方案 我有点 x y z 并想绘制最佳拟合线 我正在使用下面给出的函数 和 Thanx Smith LS3DLINE M Least squares line in 3 dimensions Version 1
  • 将点云转换为深度/多通道图像

    我有一个通过使用立体相机扫描平面生成的点云 我已经生成了法线 fpfh 等特征 并使用这些信息我想对点云中的区域进行分类 为了能够使用更传统的 CNN 方法 我想将此点云转换为 opencv 中的多通道图像 我将点云折叠到 XY 平面 并与
  • 使用 PaintComponent 计算两个矩形的交集

    我正在编写一个程序 允许用户将矩形绘制到JLabel 并显示这些矩形的交集和并集 我已经为该类设置了 GUI 但正在努力寻找一种方法来集成矩形类中的交集和并集方法 我知道这些方法在与 GUI 分开使用时是有效的 当我尝试运行该程序时 我不断
  • 如何从sparkContext读取特定行

    您好 我正在尝试使用 Spark 从文本文件中读取特定行 SparkConf conf new SparkConf setAppName appName setMaster master sc new JavaSparkContext co
  • Python:测试空集交集而不创建新集

    我经常发现自己想要测试两个集合的交集而不使用交集的结果 set1 set 1 2 set2 set 2 3 if set1 set2 print Non empty intersection else print Empty interse
  • 如何计算逆运动学[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想知道如何使用逆运动学计算旋转角度 我计划将其用于实时 3D 动画 有人知道一些详细介绍具体解决方案的好文献吗 以下资源调查了逆运动学问题的一些流行
  • 求 3d 中 2 个任意立方体的交集

    所以 我想找出一个函数 可以让您确定两个任意旋转和大小的立方体是否相交 如果立方体的旋转不是任意的 而是锁定到特定的轴 则相交很简单 您可以通过检查它们的边界来检查它们是否在所有三个维度上相交 以查看它们在所有三个维度上是否相交或在彼此之内
  • Python 中的标量场可视化

    我需要在 Python 中可视化几个重叠的标量场 我发现mayavi图书馆做这种情节 问题是我不明白如何为标量字段自定义颜色图 我的想法是为每个字段设置一种颜色的阴影 我尝试采用一个例子 http docs enthought com ma
  • 对一系列点重新采样

    我有一个 3d 点数组 想象一下球的轨迹 有 X 个样本 现在 我想对这些点重新采样 以便我有一个新数组 其中包含 y 个样本的位置 y 可以大于或小于 x 但不能小于 1 始终至少有 1 个样本 将原始数组重新采样为新数组的算法会是什么样
  • 提取给定 2D 图像点、深度图和相机校准矩阵的 3D 坐标

    我有一套2D image输出的关键点OpenCV FAST角点检测功能 使用Asus Xtion I还有一个时间同步的深度图 其中所有相机校准参数都是已知的 使用这些信息我想提取一组3D坐标 点云 在OpenCV 任何人都可以给我任何有关如
  • WPF 3D 旋转球体 GUI

    我一直在尝试在 WPF 中为我的课堂作业制作 3D 用户界面 但遇到了一个问题 现在 2 3 天都无法解决 我尝试用谷歌搜索答案 我查看了一些 stackoverflow 帖子 但还没有一个可以帮助我解决问题 情况是这样的 我有一个 3D
  • 如何在 OpenCV 中绘制图像的 3D 直方图

    更新 我找到更多例子 我现在可以做到 我可以在 3d 中绘制多个直方图吗 https stackoverflow com questions 35210337 can i plot several histograms in 3d 我知道这
  • 如何使用 javascript 将 svg use 元素插入 svg 组?

    我有一个 svg 文件 其中包含一个具有单行元素的组 我可以利用use元素并在我想要的任何位置制作多个参考副本 但是 我想使用 javascript 来添加和删除use动态元素 有没有办法使用javascript插入svguse我的行元素进
  • 可点击的精灵标签?

    我一直在玩精灵文本标签 更具体地说是这个例子 http stemkoski github io Three js Sprite Text Labels html http stemkoski github io Three js Sprit
  • 使用 ThreeJS 获取球体纹理上的点击位置

    目前 我有一个带有纹理的球体 它绕 y 轴旋转 我还有在 3D 空间中单击的位置 以及球体上的旋转位置 我认为 目标 获取纹理上的位置 例如 我想获取我点击的图像的哪个方块 参见示例球体和下图 在实践中 我不会使用此图像 但我觉得这将是一个
  • 判断一个点是否在多面体内部

    我试图确定某个特定点是否位于多面体内部 在我当前的实现中 我正在研究的方法采用我们正在寻找多面体面的数组 在本例中为三角形 但稍后可能是其他多边形 的点 我一直在尝试根据这里找到的信息进行工作 http softsurfer com Arc
  • C++ Irrlicht 程序未链接:“未定义对‘__imp_createDevice’的引用”

    我的 Irrlicht 程序无法链接 我使用的编译器是g Code include
  • 如何创建热图来说明控制发散调色板中心颜色位置的网格差异?

    我有两个人脸 3D 网格 我希望使用热图来说明差异 我想使用红蓝发散色阶 我的数据可以查到here https github com Patricklv How to create heatmap illustraing 3D mesh d
  • 旋转后获取线的新位置

    我需要在一条线上使用 RotateTransform 方法找到旋转后线的新坐标 例如 在这一行之后 line RenderTransform new RotateTransform 25 0 0 line X1其他三个属性不会改变 我找到了
  • GL_CULL_FACE使所有对象消失

    我正在尝试在 openGL3 3 中创建一些简单的多边形 我有两种类型的对象 具有以下属性 对象 1 10 个顶点 按顺序在下面列出 存储在GL ARRAY BUFFER并使用GL TRIANGLE FAN v x y z w v 0 0

随机推荐

  • YouTube 嵌入视频开始/停止事件

    我想知道 通过 iframe 嵌入 YouTube 视频是否会暴露某些事件 例如 onStart 或 onStop 您可以在其中指定一些回调 这是处理启动和停止事件的示例 HTML 文件 index html
  • 如何在 Spring Boot 中将 Json 字节数组转换为 AMQP?

    按照此 我有这个代码 Bean open fun messageConverter om ObjectMapper MessageConverter return Jackson2JsonMessageConverter om Bean o
  • 在 PySpark 2.0 中读取序列文件

    我有一个序列文件 其值如下所示 string value json value 我不关心字符串值 在 Scala 中我可以通过以下方式读取文件 val reader sc sequenceFile String String path va
  • 如何使用 PyGame 计时器事件?如何使用计时器向 pygame 屏幕添加时钟?

    我是 python 新手 因此决定尝试制作一个简单的游戏pygame 我想添加一个计时器 时钟来显示 你已经玩了 生存了多长时间 所以基本上创建了一个时钟 然而 我四处搜寻并得到了time sleep 1 它确实可以作为时钟使用 但它会减慢
  • 将多个 Intent 从单个 Activity 发送到另一个 Activity

    我对 android 很陌生 我正在尝试将用户输入的数据 他们的名字 发送到另一个活动 我过去能够使用意图在活动之间发送单行 但我无法弄清楚如何将两个不同的字符串发送到两个不同的 TextView 这是到目前为止我的 MainActivit
  • 使用 jQuery 解析 JSON

    我正在尝试使用 jQuery 解析以下 JSON 并获取每个 id 值 有人可以建议吗 id 1 name Boat id 2 name Cable 到目前为止我有 each test function i item alert item
  • 在 R 中查找数组中最接近元素的最快方法

    我想找到 R 中最快的方法来识别 Ytimes 数组中最接近给定 Xtimes 值的元素索引 到目前为止 我一直在使用一个简单的 for 循环 但必须有更好的方法来做到这一点 Xtimes lt c 1 5 8 10 15 19 23 34
  • Swift / 如何使用 popViewController 调用委托

    我读过了这个线程 以及类似的其他 从下到上 但它根本不符合我的需求 我有一个UIViewController inside UIPageViewController在一个UINavigationController 导航到第二个 ViewC
  • C# 事件去抖

    我正在监听硬件事件消息 但我需要对其进行反跳以避免太多查询 这是一个发送机器状态的硬件事件 我必须将其存储在数据库中以用于统计目的 有时它的状态会经常变化 闪烁 在这种情况下 我只想存储 稳定 状态 并且我想通过在将状态存储到数据库之前简单
  • Base64 编码的图像未在 Gmail 中显示

    我有一封嵌入的 HTML 电子邮件 其中我使用base64编码图像 通过 Chrome 访问时 图像不会在 Gmail 中显示 但当通过邮件客户端 Mac 上的邮件应用程序 访问相同的邮件时 它工作正常 我已正确设置标题 任何想法 My c
  • 如何从 WCF 中的客户端消息检查器获取标头值

    我正在为我正在处理的某些服务创建一个 Web 测试客户端 作为其要求的一部分 我希望能够显示完整的请求和响应 SOAP 消息 以及向用户显示的 HTTP 标头 我实现了一个 MessageInspector 类实现IClient消息检查器
  • C# 如何在按住鼠标按钮时循环

    你能为我指出正确的方向吗 我试图在按下表单按钮时触发循环 pseudocode While button1 is pressed value1 1 当然 当释放按钮时停止循环 为了避免使用线程 您可以添加Timer表单 控件上的组件 只需在
  • 如何使用Hibernate将初始数据导入数据库?

    在部署应用程序时 我经常使用 Hibernate 的创建数据库模式的功能来简化部署 通过配置 hibernate hbm2ddl auto 属性可以轻松实现这一点 但是 有时我还需要向数据库插入一些初始数据 例如 root 用户 有没有办法
  • 如何从 JSON 对象中删除条目?

    helper to turn PSCustomObject into a list of key value pairs function Get ObjectMembers CmdletBinding Param Parameter Ma
  • Android 获取设备中已安装的默认浏览器

    我能够在启动器的帮助下获取所有应用程序Intent CATEGORY LAUNCHER 因此 为了进行测试 我创建了一个测试活动 该活动包含一个按钮 如果我按下该按钮 它应该显示设备中的应用程序 NOTE it should not dis
  • VB.NET:“MySql.Data.MySqlClient.Replication.ReplicationManager”的类型初始值设定项引发异常

    我不知道可能出了什么问题 但这就是我尝试启动该程序时得到的结果 类型初始值设定项MySql Data MySqlClient Replication ReplicationManager抛出异常 问题似乎来自conn Open 这是我的代码
  • 查找排序数组并集中的第 k 个最小元素

    我正在研究关于在两个排序数组的并集中查找第 k 个最小元素的文章leetcode 我不认为该算法是正确的 有这样一行 我们观察到 当 Ai 对于任何一个人来说 这怎么可能是真的呢 i and j 其次 这句话也让我困惑 我们尝试通过比较 A
  • 安装 RMySQL 会出现错误 RS-MySQL.h:32:19: fatal error: mysql.h: No such file

    我尝试安装 RMySQL 库 R 版本 2 14 2 32 位 WinXP 但收到以下错误消息 install packages D R library RMySQL 0 9 3 tar gz repos NULL type source
  • matplotlib 中是否存在用于在子图中定义子图网格的工具?

    我想使用一个绘图布局 其中 9 个不同的数据簇布置在方形网格上 网格中的每个方框包含 3 个并排布置的箱线图 我最初的想法是 这适合 3x3 子图布局 每个单独的子图本身都分为 3x1 子图布局 我见过这个 在 matplotlib 的子图
  • 3D 线-平面相交

    如果给定一条线 由一个向量或线上的两个点表示 如何找到该线与平面相交的点 我已经找到了大量关于这方面的资源 但我无法理解那里的方程 它们似乎不是标准代数 我想要一个可以用标准编程语言 我使用的是Java 解释的方程 无论多长 下面是一个查找