首页 > 其他分享 >游戏引擎数学库 Plane

游戏引擎数学库 Plane

时间:2024-04-04 20:22:42浏览次数:14  
标签:FReal FVector 游戏 Idx AABB Plane 引擎 mathbf const

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想象为一根一维数轴,投影距离区分正负的。

image
image

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》

标签:FReal,FVector,游戏,Idx,AABB,Plane,引擎,mathbf,const
From: https://www.cnblogs.com/asmurmur/p/18114551

相关文章

  • OpenAI推出VoiceEngine语音引擎技术:让声音更逼真,更富情感
    继openAIGPT3.5免登录后,OpenAI最近推出了一款名为VoiceEngine的语音引擎技术,这技术能通过简单的文本输入和15秒的音频样本,就能生成跟原始说话者声音一模一样的语音,不仅逼真,还充满了情感。这VoiceEngine技术,是在2022年末由OpenAI的大佬们开发出来的。现在,它已经运用到了Ope......
  • 游戏陪玩市场火爆,专业陪玩师成新职业宠儿
    一、行业简述   游戏陪玩行业,是指为玩家提供游戏陪伴、技术指导、互动交流等服务的产业。在快节奏、高压力的现代生活中,越来越多的玩家选择通过游戏陪玩服务来寻找游戏的乐趣和社交体验。游戏陪玩行业的特点在于其高度的互动性和个性化服务,能够满足不同玩家的多样化需求......
  • Java游戏开发基础:从零开始搭建自己的游戏之《人生重开模拟器》简易版
    一、引言人生重开模拟器游戏是一种虚拟角色扮演游戏,玩家通过控制一个虚构的角色,体验与现实生活中不同的选择和结果。玩家的决策将影响角色的生活轨迹,包括他们的职业生涯、社交关系、健康和财富等方面。游戏的乐趣在于提供了一个虚拟的沙盒环境,玩家可以尝试不同的生活选择,而......
  • Mahout的taste推荐系统引擎(视频推荐案例)
    这是一个b站使用推荐引擎推荐的案例:0点赞1收藏2转发<selectid="getAllUserPreference"resultType="com.imooc.bilibili.domain.UserPreference">selectuserId,videoId,sum(caseoperationTypewhen'0'then6......
  • WebKit:探索现代Web浏览器的核心引擎
    在当今数字时代,Web浏览器已经成为我们日常生活不可或缺的工具。无论是在桌面电脑、笔记本电脑还是移动设备上,浏览器都为我们提供了一个通向互联网世界的大门。然而,很少有人真正了解浏览器背后的核心技术——渲染引擎。WebKit就是其中一个广为人知的开源渲染引擎,它为许多流......
  • 搜索引擎-03-搜索引擎原理
    拓展阅读搜索引擎-01-概览搜索引擎-02-分词与全文索引搜索引擎-03-搜索引擎原理Crawlhtmlunit模拟浏览器动态js爬虫入门使用简介Crawljsoup爬虫使用jsoup无法抓取动态js生成的内容CrawlWebMagic爬虫入门使用简介webmagic全网搜索引擎架构与流程如何?全网搜索......
  • 模板引擎 Handlebars.js
    模板引擎Handlebars.js 概述Handlebars.js是一个简单而强大的JavaScript模板引擎。它允许开发者通过定义模板和数据来生成动态的HTML页面。Handlebars.js基于Mustache模板语法,它提供了一些扩展和增强功能。并且开发者可以创建可重用的模板,并通过将数据传递给模板......
  • [c++] 小游戏 斗破苍穹2.7.1 版本 zty出品
    前言大家好,今天带来的是经典版本2.7.1这个版本在斗破苍穹中十分重要您好,欢迎您玩苍穹世界。为了给您更好的游戏体验,zty时不时会优化本游戏,优化后会尽快发布在网上。关于外挂方面,开启外挂的方式是设定勇者姓名时,输入“zty”(不包括双引号)。由于2.6.1版本的bug,我们在2.6.1的......
  • 实验一 密码引擎-2-电子钥匙功能测试
    一、任务详情参考附件中的视频解压"资源"中“龙脉密码钥匙驱动实例工具等”压缩包在Ubuntu中运行龙脉密码钥匙驱动实例工具等\mToken-GM3000\skf\samples\linux_mac中例程,提交运行结果截图加分项:运行龙脉密码钥匙驱动实例工具等\mToken-GM3000\skf\samples\windows中例程......
  • 【洛谷 P8700】[蓝桥杯 2019 国 B] 解谜游戏 题解(字符串+映射+周期性)
    [蓝桥杯2019国B]解谜游戏题目背景题目描述小明正在玩一款解谜游戏。谜题由242424根塑料棒组成,其中黄色塑料棒4......