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. docker容器下安装nccl失败,报错:Failed to init nccl communicator for group,init nccl communicator for group nccl_world_group

    相关内容参考: https://www.cnblogs.com/devilmaycry812839668/p/15022320.html =============================== ...

  2. 从头搭建一个嵌入式web服务器-boa服务器

    一.什么是boa? BOA是一款非常小巧的Web服务器,源代码开放.性能优秀.支持CGI通用网关接口技术,特别适合应用在嵌入式系统中. BOA服务器主要功能是在互联嵌入式设备之间进行信息交互,达到通过 ...

  3. RISC-V全志D1多媒体套件文章汇总

    提示 此开发板的任何问题都可以在我们的论坛交流讨论 https://forums.100ask.net/c/aw/d1/57 文章目录汇总 教程共计14章,下面是章节汇总: 第0章_RISC-V全志D ...

  4. 工作常用SQL

    工作常用SQL Excel生成SQL 这个好用 ="insert into t_gk_mapping(id,gk_project_name,gk_project_code,main_proj ...

  5. PG数据库导致断电/重启无法正常启动问题排查

    PG数据库导致断电/重启无法正常启动问题排查 一.问题 数据库断电后,启动PG数据库后无法正常启动,报"psql: could not connect to server: No such ...

  6. SpringBoot静态文件映射问题

    如果遇到这种情况,检查静态文件(js/css/img)是不是在默认的static路径下,在查看application配置中的 static-path-pattern: 是否和前端映射路径完全相同,要是 ...

  7. OpenTelemetry 实战:从零实现应用指标监控

    前言 在上一篇文章:OpenTelemetry 实战:从零实现分布式链路追踪讲解了链路相关的实战,本次我们继续跟进如何使用 OpenTelemetry 集成 metrics 监控. 建议对指标监控不太 ...

  8. 利用水墨映客图床作为COS服务器

    目录 利用水墨映客作为COS服务器 利用picGo配合typora上传图片 安装PicGo(以Windows为例) 安装lankong插件 在SpringBoot中开发图片上传工具类 设置图片上传请求 ...

  9. OpenFeign深入学习笔记

    OpenFeign 是一个声明式的 Web 服务客户端,它使得编写 Web 服务客户端变得更加容易.OpenFeign 是在 Spring Cloud 生态系统中的一个组件,它整合了 Ribbon(客 ...

  10. a web app for deep learning - deep-learning-training-gui

    安装该项目 ENV: Win11 Anaconda 主要参考 https://www.tensorflow.org/install/pip 1. 安装 python 3.9, 在Anaconda 新建 ...