线 - 3D 世界中的圆相交测试
Line - Circle intersection test in 3d world?
我有一个3D世界,我有几个2D圆圈躺在地面上,面向天空。
如何检查一条线是否会与其中一个自上而下的圆圈相交?
我试图搜索,但我得到的只是这种交叉测试:http://mathworld.wolfram.com/Circle-LineIntersection.html
但这不是我需要的,这是我的意思:http://imageshack.us/m/192/8343/linecircleintersect.png
如果你在一个坐标系中,其中地面由 z = c 给出,表示 c 某个常数,那么你可以简单地计算 z = c 的线的 x、y 坐标。现在,对于原点 x0、y0 和半径为 R 的圆,您只需检查
(x - x0)^2 + (y - y0)^2 <= R^2.
如果这是真的,则直线与圆相交。
在3D意义上,你首先关心的不是圆,而是圆所在的平面。然后你可以找到射线(线)和平面(圆盘)之间的交点。
我喜欢对点、平面和线使用齐次坐标,希望您熟悉矢量点·
和交叉积×
。这是方法:
平面(圆盘)由点向量r=[rx,ry,rz]
和法向向n=[nx,ny,nz]
定义。它们一起形成一个平面W=[W1,W2]=[n,-r·n]
.
线(射线)由两个点向量定义 r_A=[rAx,rAy,rAz]
和 r_B=[rBx,rBy,rBz]
。它们共同构成了一条线L=[L1,L2]=[r_B-r_A, r_A×r_B]
相交点由 P=[P1,P2]=[L1×W1-W2*L2, -L2·W1]
定义,或展开为
P=[ (r_B-r_A)×n-(r·n)*(r_A×r_B), -(r_A×r_B)·n ]
该点的坐标由r_P = P1/P2
找到,其中P1
有三个元素,P2
是标量。
获得坐标后,您可以通过d=sqrt((r_p-r)·(r_p-r))
并检查d<=R
与圆心的距离,其中R
是圆的半径。请注意标量乘法*
和点积·
之间的表示法差异
如果你确定圆圈位于地面上(r=[0,0,0]
)并朝上(n=[0,0,1]
),那么你就可以对上述一般情况进行很多简化。
[参考:采摘坐标]
更新:
当使用地面(+Z向上)作为平面(圆所在的位置)时,使用r=[rx,ry,0]
和n=[0,0,1]
,上述交点简化为
r_p = [ rBy-rAy, rAx-rBx, 0] / (rAy*rBx-rAx*rBy)
您可以检查到圆心的距离。
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 无法将结构注册为增强几何体3D点
- 尽管测试成功,CppUnit测试核心仍被丢弃.为什么
- 数据成员SFINAE的C++17测试:gcc vs clang
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么二进制搜索在我的测试中不起作用
- 从父数组测试用例构造二叉树失败
- OpenGL大的3D纹理(>2GB)非常慢
- 试图对缓存进行跨步测试,但程序并没有结束
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- OpenGL在启用深度测试时不会丢弃我的碎片
- 为测试目标创建具有不同源文件夹的文件
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- VC++本机单元测试,找不到调试符号
- 换位表导致测试失败(但在游戏中运行良好)
- 用于交叉编译和CMake的预处理器宏的单元测试
- 谷歌测试中的期望值存储在哪里
- 3D分离轴定理,测试哪个轴
- 线 - 3D 世界中的圆相交测试