二叉空间分割 BinarySpacePartition 方法生成地图

本文介绍了二叉空间分割(BSP)树在游戏地图生成中的应用。通过选择超平面分割空间,递归创建节点,构建包含Room和Path的数据结构,最终形成均匀分布的房间布局。BSP Tree的实现包括Node组成、Tree生成、Room和Path类的定义,以及关键的corridor生成。通过递归方法确保房间间的通道不形成环路,生成的迷宫结构具有良好的视觉效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BSP(二叉空间分割Binary Space Partitioning)树是另一种类型的空间分割技术,在游戏工业上广泛应用。

目录

一. BSP Tree 生成步骤

二、BSP Tree 怎样实现?

1、Node 组成

2. Tree 生成

3.代码实现

1)Room 类

2)Path 类

3)BinaryPartitonSpace

5)generateWorld

三、总结


一. BSP Tree 生成步骤

1)首先,选择一个超平面和根节点。我们2D选择的是一条线分割空间,3d就是用面来分割空间。

2)用超平面分割初始的空间,分割后两个空间保存为左孩子和右孩子,并将分割后的多边形村住在List中。

3)取出存住List中的多边形,通过迭代或者递归,产生新的节点并加在父节点上。

迭代和递归都可以用于BSP Tree算法,递归更加容易理解。这里递归的Base Case 使用的是产生空间的数量控制,或者是切割最小空间的size控制。

二、BSP Tree 怎样实现?

要和设计一个tree,我们要分析每个node要做什么,由什么组成。在分析树要做什么,base case是什么。下图是我们预期想得到的地图和装饰后的地图:

 

 

 

1、Node 组成

1)parent Node

2)leftChildren Node, rightChildren node

3)node data,在Project3 的case中,node data 是 Room data,Path data

2. Tree 生成

这里Tree生成参考了Dungeon BSP 地图生成算法,当我们Partition 多边形的时候,我们需要什么?

1)这条线横着割还是竖着割

2)在哪里割

3)space长和宽,和位置position

4)如果space中有Room,需要Room 的长和宽,位置Position

5)如果有路径,存储路径path的 List<Point>

6) 相对容易access sbiling node

 我们开一动手实现啦,首先需要两个类。一个是Node Class 一个是Tree Class。下面的伪码展示了如何用递归的方法实现BSP算法构造出Room分布漂亮的地图。

3.代码实现

下面以CS61B Project Build My Own World 建立地图为例。Start Code 看上一篇帖子

1)Room 类

Room 类相对简单容易写:

class Room {
	Point p;//left bottom
	int width;
	int height;

	
	public Room(Point point,int w, int h) {
		p = point;
		width = w;
		height = h;
	}
	
	public int height() {
		return height;
	}
	public int width() {
		return width;
	}
	public Point position() {
		return p;
	}
	
	public Point CenterPoint() {
		int setX = p.x + width/2 ;
		int setY = p.y + height/2 ;
		return new Point(setX, setY);
	}
	public HashSet<Point> roomPoint() {
		HashSet<Point> points = new HashSet<>();
		
		for(int x = 0; x<width-1; x++) {
			for(int y = 0; y< height-1;y++) {
				points.add(new Point(p.x+x, p.y+y)); 
			}
		}
		return points;
	}
	

}

2)Path 类

Path Class 实现从一个点到另外一个点的链接,形状是Z型或者L型。

class Path {
unity中的BSP(Binary Space Partitioning)是一种在游戏开发中常见的空间分割技术。其核心思想是将游戏场景或大型模型划分成一系列的二叉空间分割面,从而方便场景的渲染、碰撞检测、光照计算等。 BSP的基本原理是通过建立一棵二叉树来表示3D空间分割结构。在建树过程中,将空间按照分隔面进行分割,并为每个分割面设置相应的隐式函数。这些分割面可以是平面、球体或其他形状,用于将空间划分为两个子空间,通常分为正面和背面。这样,树的叶子节点将是游戏中的实际几何物体。 使用BSP的优点之一是可以快速进行一些特殊效果的渲染,例如阴影计算和可视化剔除。通过判断相机是否位于BSP的一个子空间中,可以剔除掉不需要渲染的物体,提高渲染性能。另外,BSP也可以用于进行碰撞检测,例如判断一个物体是否与某个子空间相交。 然而,BSP也存在一些限制和挑战。当场景非常复杂时,BSP的构建和维护可能会变得非常耗时,并且需要大量的存储空间。此外,由于BSP是静态的,对于动态场景的更新和改变支持不够灵活。因此,对于大型地图或需要动态变化的场景,可能需要使用其他的空间分割技术。 综上所述,BSP是一种在unity游戏开发中常见的二叉空间分割技术。它通过建立二叉树来表示3D空间分割结构,提高了渲染、碰撞检测和光照计算等方面的效率。然而,BSP也有其局限性,适用性受到场景复杂性和动态性的限制。通过合理的选择和应用,BSP可以为游戏开发带来很大的好处。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值