计算变换球体的 AABB

2024-03-02

我有一个在对象空间中由中心点和半径表示的球体。使用可能包括缩放、旋转和平移的变换矩阵将球体变换为世界空间。我需要为世界空间中的球体构建一个轴对齐的边界框,但我不知道该怎么做。

这是我目前的方法,适用于某些情况:

public void computeBoundingBox() {
    // center is the middle of the sphere
    // averagePosition is the middle of the AABB
    // getObjToWorldTransform() is a matrix from obj to world space
    getObjToWorldTransform().rightMultiply(center, averagePosition);

    Point3 onSphere = new Point3(center);
    onSphere.scaleAdd(radius, new Vector3(1, 1, 1));
    getObjToWorldTransform().rightMultiply(onSphere);

    // but how do you know that the transformed radius is uniform?
    double transformedRadius = onSphere.distance(averagePosition);

    // maxBound is the upper limit of the AABB
    maxBound.set(averagePosition);
    maxBound.scaleAdd(transformedRadius, new Vector3(1, 1, 1));

    // minBound is the lower limit of the AABB
    minBound.set(averagePosition);
    minBound.scaleAdd(transformedRadius, new Vector3(-1,-1,-1));
}

然而,我怀疑这是否总是有效。不均匀缩放不应该失败吗?


一般来说,变换后的球体将是某种椭球体。为其获得精确的边界框并不难;如果你不想完成所有的数学运算:

  • 注意M是你的变换矩阵(缩放、旋转、平移等)
  • 阅读定义S below
  • compute R正如最后所描述的
  • 计算x, y, and z界限基于R正如最后所描述的。

一般二次曲线(包括球体及其变换)可以表示为对称 4x4 矩阵:齐次点p在圆锥曲线内部S when p^t S p < 0。通过矩阵 M 变换空间会按如下方式变换 S 矩阵(下面的约定是点是列向量):

A unit-radius sphere about the origin is represented by:
S = [ 1  0  0  0 ]
    [ 0  1  0  0 ]
    [ 0  0  1  0 ]
    [ 0  0  0 -1 ]

point p is on the conic surface when:
0 = p^t S p
  = p^t M^t M^t^-1 S M^-1 M p
  = (M p)^t (M^-1^t S M^-1) (M p)

transformed point (M p) should preserve incidence
-> conic S transformed by matrix M is:  (M^-1^t S M^-1)

二次曲线的对偶适用于平面而不是点,由 S 的倒数表示;对于平面 q(表示为行向量):

plane q is tangent to the conic when:
0 = q S^-1 q^t
  = q M^-1 M S^-1 M^t M^t^-1 q^t
  = (q M^-1) (M S^-1 M^t) (q M^-1)^t

transformed plane (q M^-1) should preserve incidence
-> dual conic transformed by matrix M is:  (M S^-1 M^t)

因此,您正在寻找与变换的二次曲线相切的轴对齐平面:

let (M S^-1 M^t) = R = [ r11 r12 r13 r14 ]  (note that R is symmetric: R=R^t)
                       [ r12 r22 r23 r24 ]
                       [ r13 r23 r33 r34 ]
                       [ r14 r24 r34 r44 ]

axis-aligned planes are:
  xy planes:  [ 0 0 1 -z ]
  xz planes:  [ 0 1 0 -y ]
  yz planes:  [ 1 0 0 -x ]

要查找与 R 相切的 xy 对齐平面:

  [0 0 1 -z] R [ 0 ] = r33 - 2 r34 z + r44 z^2 = 0
               [ 0 ]
               [ 1 ]
               [-z ]

  so, z = ( 2 r34 +/- sqrt(4 r34^2 - 4 r44 r33) ) / ( 2 r44 )
        = (r34 +/- sqrt(r34^2 - r44 r33) ) / r44

类似地,对于 xz 对齐的平面:

      y = (r24 +/- sqrt(r24^2 - r44 r22) ) / r44

和 yz 对齐的平面:

      x = (r14 +/- sqrt(r14^2 - r44 r11) ) / r44

这为您提供了变换后的球体的精确边界框。

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

计算变换球体的 AABB 的相关文章

  • 编辑器中的 Unity 模糊和像素化精灵(无像素艺术)

    我目前正在 Unity 中制作一款类似移动三消游戏 我已经在 Inkscape 中以 256x256 制作了宝石 用于匹配的对象 的所有图形 并以 90 dpi 导出它们 PNG 文件 也尝试使用 360 但没有任何改变 我的问题是 当我在
  • 在透明 JPanel 上绘画时留下痕迹

    我是一个相对较新的 Java 图形程序员 这是我正在尝试的一个简单程序 这是完整的代码 分为 3 个类 Class 1 import javax swing import java awt import java awt event pub
  • 绘制别名、像素完美的 1px 样条线(特别是 Catmull-Rom)

    简要背景 我正在开发一个基于 Web 的绘图应用程序 需要绘制穿过其控制点的 1px 粗样条线 我正在努力解决的问题是我需要绘制 p1 和 p2 之间的每个像素 就像我使用 1px 铅笔工具一样 因此 没有抗锯齿功能 一次一个像素 这需要手
  • 获取任何给定字符的宽度(以像素为单位)

    我有一个非常棒的想法 但无法找出 NET Framework 中是否有任何类 任何版本 最好是 3 5 或 4 0 允许您传入字符 并获取该字符的宽度 以像素为单位 无论使用哪种字体 字体大小或字体装饰 有人可以指出我正确的方向吗 像这样的
  • 给定焦点和相机主中心,如何创建透视投影矩阵

    我设法使用 OpenCV 获取相机的内在和外在参数 因此我有 fx fy cx 和 cy 我还有屏幕 图像的宽度和高度 但是如何根据这些参数创建 OpenGL 透视投影矩阵呢 glFrustum 展示了如何在给定 Z 近 Z 远以及图像宽度
  • 模拟绘画应用的笔触

    我正在尝试编写一个应用程序 可用于使用模拟笔触创建看起来像绘画的图片 是否有任何好的资源可以提供模拟笔触的简单方法 例如 给定用户拖动鼠标经过的鼠标位置列表 画笔宽度和画笔纹理 如何确定要在画布上绘制的内容 我尝试将画笔纹理倾斜到鼠标移动的
  • 为什么 ActionScript 中没有记录 drawRoundRectComplex() ?

    在研究actionscript 3的图形类时 我遇到了未记录的drawRoundRectComplex 方法 它是一个变种drawRoundRect 但有 8 个参数 最后四个是每个角的直径 x y 宽度 高度 左上 右上 左下 右下 ex
  • 在 Mathematica 中使用图形进行渐变填充

    我如何使用以下内容创建Rectangle in Graphics Using Polygon 你可以 Graphics EdgeForm Black Polygon 0 0 3 0 3 1 0 1 VertexColors gt White
  • 什么是 AABB - 碰撞检测?

    嗨 我正在制作一个体素游戏Java在研究我需要学习的所有不同东西时 我注意到很多游戏都使用AABB用于碰撞检测 然后我记得看到AABB在 我的世界 中也有 但是当我用谷歌搜索什么时AABB也就是说 它只是提出了其他人的代码 或者历史书上的某
  • 适用于 Littler 或 Rscript 的外部图形设备

    我真的很喜欢 Littler 对于使用 R 编写脚本非常有用 但我不知道如何使用 gnuplot 中的外部图形设备 例如使用 Octave 我能够生成所需的图表 但我必须使用 Sys sleep 并且我不想这样做 因为我想以交互方式自行关闭
  • 带有矩形数组的 SDL_RenderCopy

    SDL RenderCopy 仅接受单个输入矩形和单个输出矩形 但是 如果我有很多想要填充的图像 我对 opengl 的了解告诉我 一次绘制所有图像的批量操作可能比每个精灵一次绘制调用要快得多 SDL FillRects 已经有一个计数参数
  • OpenGL 的每个组件 alpha 通道?

    是否可以使用 OpenGL 对每个组件使用一个 alpha 通道 一个用于红色 一个用于绿色 一个用于蓝色 进行混合 如果没有 有哪些可能的解决方法 这不是直接支持的东西 不过 您自己实现起来相当容易 使用 3 通道 alpha 纹理渲染三
  • 合并空间上接近的路径/线段的算法

    我正在寻找一种用于街道地图制图概括的几何算法 名称 在我的地图数据中 我有许多路径 点的有序列表 由线段连接 这些路径彼此靠近且几乎平行 我如何 1 识别这些 相邻路径 即如何找到比某个阈值更接近的路径 以及 2 将它们合并成一条路径 即如
  • 如何在ggplot2中使用希腊符号?

    我的类别需要用希腊字母命名 我在用ggplot2 并且它与数据配合得很好 不幸的是 我无法弄清楚如何将这些希腊符号放在 x 轴上 在刻度线处 并使它们出现在图例中 有什么办法可以做到吗 更新 我看了一下link https github c
  • 将四元数旋转转换为旋转矩阵?

    基本上 给定一个四元数 qx qy qz qw 我如何将其转换为OpenGL旋转矩阵 我也对哪个矩阵行是 向上 向右 向前 等感兴趣 我有一个四元数的相机旋转 我需要在向量中 以下代码基于四元数 qw qx qy qz 其中顺序基于 Boo
  • 如何使用双重调度来分析图形基元的交集?

    我正在分析图形基元 矩形 直线 圆形等 的交互并计算重叠 相对方向 合并等 这被引用为双重调度的一个主要示例 例如维基百科 http en wikipedia org wiki Double dispatch 自适应碰撞算法通常要求 不同的
  • 绘制多边形

    我正在使用 Google Maps API V3 根据路径绘制多边形 该路径是随机未排序坐标点 LatLng 的数组 这会产生以下形状 Polylines intersect Problem 由于多边形的形状取决于路径中点的顺序 因此如何对
  • 在java中使用多个bufferedImage

    我正在 java 小程序中制作游戏 并且正在尝试优化我的代码以减少闪烁 我已经实现了双缓冲 因此我尝试使用另一个 BufferedImage 来存储不改变的游戏背景元素的图片 这是我的代码的相关部分 public class QuizApp
  • 图形界面相互叠加

    我有一个主程序窗口frame https i stack imgur com xQPfo png and a menu https i stack imgur com rCYEU png用于调用计算模块 from tkinter impor
  • 修改 GGplot2 对象

    然而 我很好奇 是否可以添加任何特定的图例或将哪个物种对应于观察到的预期绘图中 以分别知道它是哪个圆圈 我目前使用的是一个名为 finches 的假数据集 该包称为 cooccurr 它创建一个 ggplot 对象 我很好奇如何实际编辑它以

随机推荐

  • 当父状态改变时组件卸载

    我正在使用 React 16 8 2 每当应用程序组件中的状态发生更改时 我都会遇到组件卸载的问题 这是场景 我有 App jsx 一个功能组件 和许多状态变量 useState 其中一些状态变量的设置器通过 Context 提供程序 后代
  • 如何使用 android-ndk-r10d 在 Windows 上编译 ffmpeg-2.5.3

    我正在尝试使用 android ndk 10d 在 Windows 上编译 FFMPEG for android 我已经遵循了许多教程 但无法编译它 任何人都可以帮我编译 FFMPEG 我参考了很多博客和教程 但无法检索到预期的结果 我使用
  • iOS 应用程序中 iTunes 音乐商店的音乐预览 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个有趣的问题 可以在 iOS 应用程序中播放 iTunes 音乐商店中的音乐预览吗 怎么做 我需要你的帮助 是的 你可以这样做
  • 文件大小():特定路径的统计失败 - php

    我正在编写一个简单的文档管理脚本 需要在表中获取文件大小和文件类型 文件或文件夹 不知何故 它无法进入提及目录 如果可能的话请帮忙
  • 在 C# 中使用 Task.FromResult 与 wait

    我是 C 异步编程新手 需要看看以下哪一种是处理 Task 对象的首选方法 我有一个类可以这样做 var value this SomeFunction var innerValue await Task FromResult value
  • Luigi:如何将不同的参数传递给叶任务?

    这是我第二次尝试了解如何在 Luigi 中将参数传递给依赖项 第一个是here https stackoverflow com questions 64837259 luigi how to pass arguments to depend
  • 将 Pajek 数据集读入 Networkx

    我正在寻找将 Pajek 数据集转换为 networkxGraph 数据集来自哥斯达黎加家庭关系 http vlado fmf uni lj si pub networks data esna SanJuanSur htm 我正在使用非常方
  • 如何忽略异常并完成尝试

    所以我一直在奋斗这个问题 https stackoverflow com questions 14885288 io exception error when using serialport open大约一周了 我想我知道这个问题 但我不
  • Twig 和自动转义

    我正在学习 Symfony2 目前 我正在尝试在树枝模板中渲染表单标签 该标签包含一个 html 标签 该标签在我的 twig 文件中未正确呈现 下面是创建表单字段的代码段 builder gt add zipcode integer ar
  • Avalon 中的大写编辑

    我正在使用 AvalonEdit 编写电影脚本编辑器 我扩展了 DocumentLine 类以具有 Type 属性 其值表示 字符 对话行 等 我希望脚本中某种类型的文档行以大写形式编写 例如字符名称 渲染管道中是否有一个扩展点可以让我获取
  • 如何在 zend Framework 2 中返回对象数组?

    我正在 zf2 中进行查询 然后得到一个object Zend Db ResultSet HydratingResultSet 我必须foreach上 以便到达属性 我想默认获得一个对象数组 这是我的一些代码 factory address
  • clang 不编译我的代码,但 g++ 可以

    有人可以帮我解决这个代码吗 include
  • NodeJS 中的 HTTPS 请求

    我正在尝试编写一个 NodeJS 应用程序 它将使用 https 包中的请求方法与 OpenShift REST API 进行通信 这是代码 var https require https var options host openshif
  • 使用 ggforce 创建跳过节点的 Sankey 图

    I would like to use the ggforce package in R to create a Sankey diagram because I prefer the look of the parallel sets p
  • Vertx FileUpload上传不带扩展名的文件

    我在用vertx web并尝试上传文件 这是我的代码 router route handler BodyHandler create setUploadsDirectory some path uploads router post api
  • pandas 计算两个零之间不为零的值的数量

    我有以下数据框 0 0 0 1 0 0 1 1 0 1 1 1 1 1 1 0 0 0 0 1 0 0 1 0 0 0 0 你如何获得一个看起来像这样的数据框 0 0 0 4 0 0 4 3 0 4 3 2 4 3 2 0 0 0 0 2
  • 将tiny int 转换为int 时出错

    该错误看起来是由于在服务器上安装框架 4 5 引起的 尽管该项目的目标仍然是 4 0 4 5 取代了 CLR 看起来它在将tinyint 类型的对象拆箱为 int 方面发生了变化 这在 4 0 中可以工作 但安装 4 5 后就不行了 请在回
  • PHP72 MongoDB 驱动程序与 OSX 上的 Homebrew

    我有一个问题可能表明我对 Homebrew 与 MongoDB 存在误解 我正在 Mac OSX 10 12 6 Sierra 上运行带有 PHP 7 2 1 我想使用 的 XAMPP 版本 我安装了 MongoDB 并创建了配置和数据存储
  • Apache HttpClient 4.3 SocketConfig.getSoTimeout() 与 RequestConfig.getSocketTimeout()

    当建造一个CloseableHttpClient在 Apache HttpClient 4 3 中 我可以使用 SocketConfig custom setSoTimeout soTimeout build 并将其发送至setDefaul
  • 计算变换球体的 AABB

    我有一个在对象空间中由中心点和半径表示的球体 使用可能包括缩放 旋转和平移的变换矩阵将球体变换为世界空间 我需要为世界空间中的球体构建一个轴对齐的边界框 但我不知道该怎么做 这是我目前的方法 适用于某些情况 public void comp