0 前言

平面的表达方式有很多,常用的就两种。向量形式的点法式,标量形式的平面方程。两者可以互相转化。

\[(\mathbf{p}-\mathbf{p_0})\cdot\mathbf{n}=0
\]
\[Ax + By + Cz + D = 0
\]
\[A = \mathbf{n}.x,\; B = \mathbf{n}.y,\; C = \mathbf{n}.z,\; D = \mathbf{n} \cdot -\mathbf{p_0}
\]

平面方程就是任意一点到平面的垂直投影距离。距离以法线为坐标基。

以点法式来看,平面方程有两种意义:

  1. 任意一点p投影到n上的距离,减去p0投影到n上的距离。

  2. 向量p-p0投影到n上的距离。

可以把n想象为一根一维数轴,投影距离区分正负的。



1 平面的应用 物理碰撞

加abs()是因为要切换包围盒的顶点。

// Test if AABB b intersects plane p
int TestAABBPlane(AABB b, Plane p) {
// Convert AABB to center-extents representation
Point c = (b.max + b.min) * 0.5f; // Compute AABB center
Point e = b.max - c; // Compute positive extents // 此处只有聪明人才能懂为什么加绝对值,这个和unreal的判断异曲同工之妙
float r = e[0]*Abs(p.n[0]) + e[1]*Abs(p.n[1]) + e[2]*Abs(p.n[2]); // Compute distance of box center from plane
float s = Dot(p.n, c) - p.d; // Intersection occurs when distance s falls within [-r,+r] interval
return Abs(s) <= r;
}

2 Unreal Math 平面位置关系

判断正负也是因为要切换包围盒的顶点。

// Copyright Epic Games, Inc. All Rights Reserved.

/*=============================================================================
UnMath.cpp: Unreal math routines
=============================================================================*/ int32 FMath::PlaneAABBRelativePosition(const FPlane& P, const FBox& AABB)
{
// find diagonal most closely aligned with normal of plane
FVector Vmin, Vmax; // Bypass the slow FVector[] operator. Not RESTRICT because it won't update Vmin, Vmax
FVector::FReal* VminPtr = (FVector::FReal*)&Vmin;
FVector::FReal* VmaxPtr = (FVector::FReal*)&Vmax; // Use restrict to get better instruction scheduling and to bypass the slow FVector[] operator
const FVector::FReal* RESTRICT AABBMinPtr = (const FVector::FReal*)&AABB.Min;
const FVector::FReal* RESTRICT AABBMaxPtr = (const FVector::FReal*)&AABB.Max;
const FPlane::FReal* RESTRICT PlanePtr = (const FPlane::FReal*)&P; for(int32 Idx=0;Idx<3;++Idx)
{
if(PlanePtr[Idx] >= 0.f)
{
VminPtr[Idx] = AABBMinPtr[Idx];
VmaxPtr[Idx] = AABBMaxPtr[Idx];
}
else
{
VminPtr[Idx] = AABBMaxPtr[Idx];
VmaxPtr[Idx] = AABBMinPtr[Idx];
}
} // if either diagonal is right on the plane, or one is on either side we have an interesection
FPlane::FReal dMax = P.PlaneDot(Vmax);
FPlane::FReal dMin = P.PlaneDot(Vmin); // if Max is below plane, or Min is above we know there is no intersection.. otherwise there must be one
if (dMax < 0.f)
{
return -1;
}
else if (dMin > 0.f)
{
return 1;
}
return 0;
} bool FMath::PlaneAABBIntersection(const FPlane& P, const FBox& AABB)
{
return PlaneAABBRelativePosition(P, AABB) == 0;
}

X. Reff

  1. https://en.wikipedia.org/wiki/Line–plane_intersection
  2. https://gdbooks.gitbooks.io/3dcollisions/
  3. 《Games Physicks CookBook》

游戏引擎数学库 Plane的更多相关文章

  1. 推荐一些好用的 HTML5 & JavaScript 游戏引擎开发库

    推荐一些好用的 HTML5 & JavaScript 游戏引擎开发库 0. 引言 如果你是一个游戏开发者,并且正在寻找一个可以与 JavaScript 和 HTML5 无缝工作的游戏引擎.那么 ...

  2. 25 个超棒的 HTML5 & JavaScript 游戏引擎开发库

    就像在汽车中,引擎完成主要的工作,使汽车看起来不可思议.游戏引擎同理,游戏开发者完成细节的工作,使游戏看起来真实.吸引人眼球.游戏引擎负责其余的事情.早期,游戏开发者通常从草图做起,花费高昂,且不容易 ...

  3. 游戏引擎架构 (Jason Gregory 著)

    第一部分 基础 第1章 导论 (已看) 第2章 专业工具 (已看) 第3章 游戏软件工程基础 (已看) 第4章 游戏所需的三维数学 (已看) 第二部分 低阶引擎系统 第5章 游戏支持系统 (已看) 第 ...

  4. 转载:[转]如何学好3D游戏引擎编程

      [转]如何学好3D游戏引擎编程 Albert 本帖被 gamengines 从 游戏引擎(Game Engine) 此文为转载,但是值得一看. 此篇文章献给那些为了游戏编程不怕困难的热血青年,它的 ...

  5. 20个免费的 JavaScript 游戏引擎分享给开发者

    这篇文章收集了20个免费的 JavaScript 游戏引擎分享给开发者.这些游戏引擎能够帮助游戏开发人员更快速高效的开发出各种好玩的游戏. 使用 HTML5.CSS3 和 Javascript 可以帮 ...

  6. 第1部分: 游戏引擎介绍, 渲染和构造3D世界

    原文作者:Jake Simpson译者: 向海Email:GameWorldChina@myway.com ---------------------------------------------- ...

  7. 转:高层游戏引擎——基于OGRE所实现的高层游戏引擎框架

    高层游戏引擎——基于OGRE所实现的高层游戏引擎框架 这是意念自己的毕业论文,在一个具体的实践之中,意念主要负责的是物件和GUI之外的其他游戏系统.意念才学疏陋,望众位前辈不吝赐教.由于代码质量不高. ...

  8. 20 款免费的 JavaScript 游戏引擎

    使用 HTML5,CSS3 和 Javascript 可以帮助面向对象开发者开发拥有各种特性的游戏,比如:3D 动画效果,Canvas,数学,颜色,声音,WebGL 等等.最明显的优势在于使用 HTM ...

  9. 【2D游戏引擎】WIP反思

    WIP(Working In Progress)是我初学游戏引擎开发时候开发的一个2D游戏引擎,当时计划为它实现类似Unity一样的编辑器,具有和Unity相似的工作流,但是由于水平不够,走了很多弯路 ...

  10. AI:从游戏引擎--到AI

    原文链接:http://blog.csdn.net/left_la/article/details/6358911#t9 这是我在Gameres上看到的一篇文章,文章很长,全文分为11个部分,看后感觉 ...

随机推荐

  1. Linux系统配置 Samba客户端

    参考: https://blog.csdn.net/m0_63624418/article/details/127856957 本文为局域网中linux和window共享文件方案--samba后续篇. ...

  2. Java学习笔记2--JDK的安装和配置

    一.进入oracle官网,下载jdk oracle官网:Oracle | Cloud Applications and Cloud Platform ps:不同的浏览器,可能进入oracle官网,会只 ...

  3. 什么是淘宝API?

    ​ 淘宝API是淘宝开放平台提供给开发者的一系列应用程序编程接口,它们允许开发者访问和使用淘宝的数据和服务.通过这些API,开发者可以构建应用程序,实现商品信息检索.订单管理.用户行为分析.物流跟踪等 ...

  4. 【Python】之pip安装报错问题:WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None))

    我想安装python第三方库,但是始终报安装失败 经查询得知,需要国内源,有如下地址: 阿里云 http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https: ...

  5. Python 潮流周刊#67:uv 的重磅更新(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  6. hook拼多多客服软件发消息,拼多多客服机器人代码,拼多多发消息代码

    最近由于工作需要,逆向了拼多多客服平台,能调用消息监听.消息发送.根据订单号发起会话,是纯hook实现的,demo包括c++调用demo,c#调用demo.hook 的dll是c++编写的,有需要的人 ...

  7. AI 视觉的应用|ZegoAvatar ⾯部表情随动技术解析

    ​ 一.AI"卷"进实时互动 2021年,元宇宙概念席卷全球,国内各大厂加速赛道布局,通过元宇宙为不同的应用场景的相关内容生态进行赋能.针对"身份"." ...

  8. CTC联结时间分类算法: 连接主义时间分类: 用递归神经网络标记未分割序列数据《Connectionist Temporal Classification: Labelling Unsegmented Sequence Data with Recurrent Neural Networks》(语音、文本识别、RNN端到端训练序列数据的方法)

    11月6号例会汇报. 糊弄的看了一个算法-CTC算法,没有汇报论文,因为没看论文(我导知道后,应该会锤死我...) 当然,汇报完之后,被我导腾讯会议通过网线批了我一顿,PPT做的太烂了!字太多,听不到 ...

  9. frp_v0.37.1内网穿透,内网服务公网用不求人

    前言: 公司内网无法访问,出差又需要用到公司内网进行办公,苦恼了好一阵.这时候想到了内网穿透,这就不得不提到几年前被安利的frp,一看GitHub竟然已经5年了,网上估计大把教程了. 那么什么是frp ...

  10. Angular Material 18+ 高级教程 – CDK Accessibility の Focus

    介绍 CDK Focus 是对原生 DOM focus 的上层封装和扩展. Focus Origin 原生 DOM focus 我们只能知道 element 被 focus 了,但是无法知道它是怎么被 ...