3D空间包围球(Bounding Sphere)的求法

2023-10-27

引言

            在3D碰撞检测中,为了加快碰撞检测的效率,减少不必要的碰撞检测,会使用基本几何体作为物体的包围体(Bounding Volume, BV)进行测试。基本包围体的碰撞检测相对来说便宜也容易的多,所以如果在基本包围体的碰撞检测中都没有通过的话,那么就没有必要进行更加复杂的碰撞检测了。

           而对于不同性质,不同形状的模型,需要根据情况选择不同的包围体,一般来说,包围体分为如下的几种:

            Sphere, AABB, OBB, 8-DOP, Convex Hull这几种常见的。

           接下来将向大家讲述如何使用Sphere包围体。




表示方法

           想要使用包围体,我们就要知道,如何的表示一个包围球体。对于球体来说,表示它很简单,如下所示:

struct Sphere
{
     VECTOR3 center ;
     float radious ;
};

           这样,在有了中点和半径之后,我们就能唯一的确定一个包围球体了。




包围球之间的碰撞检测

            对于包围球之间的碰撞检测,十分的简单,只要判断两个包围球心之间的距离是否小于他们两个的半径之和就可以了。如果小于,那么这两个包围球发生了交叉,没有的话,就相互分离。以下是进行碰撞检测的代码:

int TestSphereSphere(Sphere a, Sphere b)

{

       VECTOR3 d = a.center - b.center ;

       float dist2 = Dot(d, d);

       float radisum = a.radious + b.radious ;

       if(dist2 < radisum * radisum)

             return 1 ;

       else

            return 0 ;

}

             很简单不是嘛!由于进行开平方计算要消耗大量的CPU,所以,我们直接对球心之间距离的平方和他们半径之和的平方进行比较,结果与进行距离和半径之和的比较一致。




包围球体的计算

               球形包围体的计算有很多的算法,在本篇文章中将讲述两种常见的计算方法。如果你使用DirectX,就会知道,DirectX内置了一个D3DXComputBoundingSphere的函数。这里将不会使用这个函数,而是使用我们自己创建的计算方法来进行包围球体的计算。

              首先来介绍第一种包围球体的计算方法。


均值法

              我们知道,在3D模型的表示中,一般都是用一系列的顶点来描述一个模型。所以,要求一个包围球体,我们就必须确定这个包围球体的球心,然后计算每一个顶点与球心的距离,选取最长的距离作为包围球体的半径。这个简单的算法就能够确定一个包围球体了。那么,有一个问题,如果的确定这个模型的球心了?

              我们通过如下的简答方法来计算出这个模型的球心。我们将所有的顶点相加,然后除以顶点数,这样就能得到一个球心的位置了。

               到这里,这个方法的理论就介绍完毕了,很容易不是吗???下面来看看这个方法的代码部分:

void Sphere::computeBoundingSphereAverage(VECTOR3* vertices, unsigned int vertex_num)
{
	//Compute the center point
	VECTOR3 total ;
	total.x = 0 ;
	total.y = 0 ;
	total.z = 0 ;
	for(int i = 0 ; i < vertex_num ; i ++)
	{
		total.x += vertices[i].x ;
		total.y += vertices[i].y ;
		total.z += vertices[i].z ;
	}// end for

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

3D空间包围球(Bounding Sphere)的求法 的相关文章

  • WP7 XNA 显示 3D FBX 模型

    我只是初学者 很抱歉我的愚蠢问题 我的模型看起来像这样 http img265 imageshack us img265 8291 clipboard01ap jpg http img265 imageshack us img265 829
  • 使用 glFrustum 进行离轴投影

    我正在尝试使用 OpenGL 对场景进行离轴投影 并且我阅读了该文档罗伯特 库伊马的离轴投影 http csc lsu edu kooima pdfs gen perspective pdf现在对实际需要做什么有了更好的了解 但仍然有一些部
  • 使用 3d 变换矩阵

    在人工智能课程中 我们有一个机器人 它的手臂有 7 个关节 每个关节可以向不同的方向旋转 我需要知道最后的结局在哪里 我一直在尝试进行 3d 矩阵乘法 它适用于一个关节 但一旦我添加另一个关节 它就与我使用 Java3D api 制作的模型
  • 3D 哪个更快? Perlin 噪声还是 Simplex 噪声?

    好吧 网上有很多 Perlin 噪声和 Simplex 噪声之间的比较 但我真的找不到一个对三个维度进行简单处理时间比较的地方 这是我最感兴趣的 我读过那个流行的PDF http webstaff itn liu se stegu simp
  • 在 Unity 3D 中使用触摸输入在地形上移动相机

    我是 Unity 新手 我正在尝试弄清楚如何使用触摸输入在地图 地形上移动相机 摄像机将以 90 0 0 的旋转角度俯视地形 地形位于第 8 层 我用键盘移动它没有问题 现在我尝试移动到触摸 如果你想在 iOS 上保持预期的使用情况 那就非
  • 如何在 Three.js 中从三角面获取多边形?

    我在网上查了一下是否有人遇到同样的问题 我正在使用 Three js 我有一个 3DObject 其中可能包含孔 面是三角形的 假设我想从上面看到它 我的目标是获得一个代表顶面周长的多边形 这对我来说意味着不再有三角面 而只有 1 个多边形
  • DX11 中的顶点缠绕顺序

    我试图用 dx11 绘制一个简单的正方形 但每个三角形的索引顺序决定了它是否显示 我在光栅化状态下将剔除模式设置为无 但它似乎没有改变任何东西 如果我将第一个三角形的顶点指定为 0 1 2 而不是 2 1 0 则该三角形不会显示 所以我的问
  • 使用 ThreeJS 获取球体纹理上的点击位置

    目前 我有一个带有纹理的球体 它绕 y 轴旋转 我还有在 3D 空间中单击的位置 以及球体上的旋转位置 我认为 目标 获取纹理上的位置 例如 我想获取我点击的图像的哪个方块 参见示例球体和下图 在实践中 我不会使用此图像 但我觉得这将是一个
  • 颜色重新映射 - 使用 3D 网格匹配目标调色板?

    假设我有颜色 FOO 它以 RGB 格式存储 我需要重新着色 FOO 以便它与颜色列表中最接近的颜色匹配 即时执行此操作 我是否无法将每种颜色的 RGB 值视为 3D 网格上的点 r x g y b z 并计算点 FOO 与每个颜色点之间的
  • 判断一个点是否在多面体内部

    我试图确定某个特定点是否位于多面体内部 在我当前的实现中 我正在研究的方法采用我们正在寻找多面体面的数组 在本例中为三角形 但稍后可能是其他多边形 的点 我一直在尝试根据这里找到的信息进行工作 http softsurfer com Arc
  • 使用 C# 截取任何外部应用程序的屏幕截图

    我们有一个 C WPF 应用程序 我们想要在其中截取我们启动的任意应用程序的屏幕截图 即 我们可以引用我们启动的进程 应用程序可能已最小化或位于其他窗口后面 但我们仍然只需要单个应用程序的图像 而不是重叠像素 我知道使用 BitBlt 或的
  • 我应该如何格式化 .dat 文件以便制作 3D 矢量图?

    我正在为大学做这个编程任务 我们必须写一个c 计算 3D 空间中某些线圈的磁场矢量的程序 我已经成功编写了这个程序 并且我认为它运行得很好 不过 我想添加一个特殊的东西 这是我的试卷 所以它必须特别好 我想绘制出向量 我习惯打电话gnupl
  • 如何捕获正在播放的音频?

    有谁知道如何以编程方式捕获正在播放的声音 即来自声卡的所有声音 而不是麦克风等输入设备 假设您正在谈论 Windows 则基本上可以通过三种方法来实现此目的 首先是打开音频设备的主输出作为录音源 这只有在驱动程序支持时才可能实现 尽管现在大
  • GL_CULL_FACE使所有对象消失

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

    我为一个项目制作了一个 3d 类型的菜单 自然 IE 会引起问题 因为 IE10 即使 3d 变换工作 也不支持变换样式 preserve 3d 我尝试了解决方法 通过对 3d 菜单容器的每个子元素应用变换 但至少可以说 动画看起来很糟糕
  • Python3 在 DirectX 游戏中移动鼠标

    我正在尝试构建一个在 DirectX 游戏中执行一些操作的脚本 除了移动鼠标之外 我一切都正常 是否有任何可用的模块可以移动鼠标 适用于 Windows python 3 Thanks I used pynput https pypi or
  • 矩阵乘法 - 视图/投影、世界/投影等

    在 HLSL 中有很多矩阵乘法 虽然我了解如何以及在何处使用它们 但我不确定它们是如何导出的或它们的实际目标是什么 所以我想知道是否有在线资源可以解释这一点 我特别好奇将世界矩阵乘以视图矩阵以及世界 视图矩阵乘以投影矩阵背后的目的是什么 您
  • 如何在 React Native 中渲染自定义 3D 对象

    我已经成功使用 Three js expo Three 和 expo gl 在 React Native 中配置了红色立方体的 3D 渲染 但我想让用户渲染他们自己可能拥有的自定义 3D 对象 obj 或 mtl 扩展名 但我不确定如何让他
  • 用于新 Windows 游戏项目的 OpenGL 或 Direct3D?或者是其他东西?

    我正在 Windows 上启动一个爱好游戏项目 该项目将大量使用 3D 图形效果 它很可能是用 C 编写的 我应该使用 OpenGL 还是 Direct3D 作为我的图形后端 为什么 或者我应该使用现成的图形引擎 例如OGRE 3D htt
  • 判断点是否在截锥体内

    我正在尝试找出确定一个点是否在截锥体内的最佳方法 我有一些工作 但不确定它是否太麻烦 也许我应该有一种更优雅 有效的方法来做到这一点 假设我想查明点 x 是否在截锥体内 一旦我知道了平截头体的 8 个点 4 个近点 4 个远点 的位置 我就

随机推荐

  • solidity经典案例----拍卖

    Solidity经典合约案例 拍卖 1 案例分析 2 具体的代码 pragma solidity 0 6 1 contract aution demo address payable public seller 卖方 address pay
  • 110道python面试笔试题汇总

    看到一篇python 基础面试练习题文章 有必要面试前做一下 转至 https blog csdn net weixin 40907382 article details 80621513 1 一行代码实现1 100之和 利用sum 函数求
  • Less-7(文件读写操作)

    文章目录 OUTFILE注入 实战 1 关卡分析 2 过关斩将 2 1 secure file priv 2 2 注入过程 load file的使用 SQLmap OUTFILE注入 在前面的学习中 我们知道了sql注入中的盲注和双注入是个
  • CentOS 代理 proxy设置方法

    说明 为什么说是http代理 其实这个还不能说是全称走代理 罪名写的区别就是ICMP协议这个设置就无效 只能说是90 的应用都可以使用这个设置来实现代理访问 只有个别不行 比如一些软件根本不走http协议的 那么此种方法绝对不行 下面是讲解
  • 利用VC++编程实现程序自动启动

    摘要 在工作中经常遇到一些程序 当计算机启动时会自动将该程序加载 以实现对计算机的监控等特殊的目的 本文就针对这个问题 阐述了系统加载特定程序的原理和方法 同时利用VC 6 0编程实现这种特定的功能的 并对其中的关键代码进行了分析 工作中经
  • Peewee进阶

    Part1前言 接上篇文章 如果我们想要修改表结构或者字段属性该如何操作呢 带着这个问题 今天我们就一起来了解 peewee 的进阶操作 Part2关于 playhouse peewee 有很多的扩展 这些扩展都集中收录在 playhous
  • 网线分类解析

    网线的类别分几个维度去看 1 屏蔽双绞线 STP 屏蔽双绞线 是一种特殊的网线 它比非屏蔽双绞线多一道工序 网线内部信号线的外面包裹着一层金属网 在屏蔽层外面才是绝缘外皮 屏蔽层可以有效地隔离外界电磁信号的干扰 这种网线多用于布设网线的环境
  • 三维重建工具——pclpy使用教程

    最近试了试用pclpy这个库进行点云处理 在此对pclpy的使用进行一个总结 更全的pclpy教程 代码完全开源 github 欢迎fork star 相关文章 pclpy安装 文章目录 pclpy相关 开发环境 文件结构 I O读取 构造
  • Git基础操作:push提交多个文件成功后如何撤销回退某个文件,回退代码到某次commit

    之前写过类似的一篇文章 Git基础操作 push提交成功后如何撤销回退 回退代码到某次commit 按照那个示例 把期间所有commitid下的文件都会回滚掉 但是如果只想将其中某个文件回滚可以下面的示例来搞 git log OneBean
  • Broyden算法

    代码传送门 https github com taifyang optimization method Python实现 import sympy import numpy as np from numpy import matlib as
  • java毕业设计——基于Java+AI的五子棋游戏设计与实现(毕业论文+程序源码)——五子棋游戏

    基于Java AI的五子棋游戏设计与实现 毕业论文 程序源码 大家好 今天给大家介绍基于Java AI的五子棋游戏设计与实现 文章末尾附有本毕业设计的论文和源码下载地址哦 需要下载开题报告PPT模板及论文答辩PPT模板等的小伙伴 可以进入我
  • expiringmap入门初体验

    功能简介 可设置Map中的Entry在一段时间后自动过期 key过期 value同时会过期 可设置Map最大容纳值 当到达Maximum size后 再次插入值会导致Map中的第一个值过期 可添加监听事件 在监听到Entry过期时调度监听函
  • linux系统中docker服务和普通服务对外访问端口不通的问题

    linux系统中docker服务和普通服务对外访问端口不通的问题 前一段时间 在一个新的centos 7 4 服务器上运行项目 共有四个项目 因为特殊原因 两个是通过docker 运行 另外两个是通过nginx和tomcat 运行 当运行起
  • 电脑配置tomcat环境变量

    Tomcat在使用前需要配制环境变量 这里以Tomcat9为例进行配置 下载Tomcat压缩包 Tomcat8 链接 https pan baidu com s 109DSHjX3 Gk7lVRVre3xxw 提取码 lsro Tomcat
  • 使用maven依赖的方式引入jQuery

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 加入依赖
  • 栈、队列的链式存储结构

    栈 再说链表的实现栈之前 我们先回顾一下什么是栈 栈基本概念 栈 stack 是限定在表尾进行插入和删除操作的线性表 或单链表 只能在一段进行插入和删除 因此不存在 在中间进行插入 栈顶 top 允许插入和删除的一端 而另一端称为栈底 bo
  • 指定CUDA版本失败的解决方案

    新电脑安装的WIN11系统 因为CUDA只有11和12目前能装到WIN11上 所以就装了一个CUDA 11 7 但是编译PBRT失败 所以无奈之下又装了CUDA 12 但是因为我有的代码需要CUDA 11里的函数 这些函数在CUDA12里被
  • python编程:numpy包

    numpy是使用Python进行科学计算的基本软件包 它包含以下内容 强大的N维数组对象 复杂的 广播 功能 集成C C 和Fortran代码的工具 有用的线性代数 傅立叶变换和随机数功能 我们先比较一下numpy和list的运算速度 比如
  • matlab图像处理系列:图片圈数识别+编号标记位置

    matlab图像处理系列 图片圈数识别 编号标记位置 一 app界面介绍 二 实现过程 step1图像二值化 step2 图像close 做差 step3 像素阈值处理 step4 清除小区域 step5 识别联通区域 并在原图上标记 三
  • 3D空间包围球(Bounding Sphere)的求法

    引言 在3D碰撞检测中 为了加快碰撞检测的效率 减少不必要的碰撞检测 会使用基本几何体作为物体的包围体 Bounding Volume BV 进行测试 基本包围体的碰撞检测相对来说便宜也容易的多 所以如果在基本包围体的碰撞检测中都没有通过的