C# 在3D场景中隐藏遮挡播放器的对象

C# 在3D场景中隐藏遮挡播放器的对象,c#,algorithm,3d,xna,C#,Algorithm,3d,Xna,我正在设计一款3D游戏,它的摄像头与模拟人生中的摄像头并不完全不同,我想防止玩家角色被隐藏在物体后面,包括墙壁、柱子和其他物体 一个简单的方法来处理墙壁的情况是让他们面对内,而不是有另一面,但这不会涵盖所有其他情况 我所计划的是以某种方式检查相对于摄影机在播放器“前面”的对象,并隐藏它们——无论是通过alpha混合还是根本不渲染 我脑子里有一个可能不是很好的主意,那就是从相机到播放器的直线扫描,看看你是否击中了一个非隐藏的物体,一直扫描到你到达播放器。不幸的是,我是一个几乎完全的3D编程新手

我正在设计一款3D游戏,它的摄像头与模拟人生中的摄像头并不完全不同,我想防止玩家角色被隐藏在物体后面,包括墙壁、柱子和其他物体

一个简单的方法来处理墙壁的情况是让他们面对内,而不是有另一面,但这不会涵盖所有其他情况

我所计划的是以某种方式检查相对于摄影机在播放器“前面”的对象,并隐藏它们——无论是通过alpha混合还是根本不渲染

我脑子里有一个可能不是很好的主意,那就是从相机到播放器的直线扫描,看看你是否击中了一个非隐藏的物体,一直扫描到你到达播放器。不幸的是,我是一个几乎完全的3D编程新手


<该墙板遮挡了玩家,因此必须将其隐藏。另一个不相关且已经基本解决的问题是移除那一侧的所有三个墙板,这与这个问题无关,只是由我提出的贴图系统引起的。

一个简单的方法,至少对于原型来说,就是在绘制完场景的其余部分后总是绘制播放器。这将确保在场景中的任何其他内容之上渲染播放器。粗糙但有效

我所计划的是以某种方式检查相对于摄影机在播放器“前面”的对象,并隐藏它们——无论是通过alpha混合还是根本不渲染


这是一个好计划。您需要将某种边界体积合并到播放器上,以便整个播放器(加上一点额外的)始终可见。然后,只需对边界体积的每个角点运行求交算法。

我能想到的最简单的方法是,通过与地面垂直的平面(假设有地面)对所有障碍物进行建模。大致假设所有障碍物都是具有一定高度的墙

将玩家建模为某个点,将相机建模为另一个点。3d中连接这两个点的线位于您特别感兴趣的平面中,因为如果该平面与障碍物高度下方的“障碍物平面”相交,则表示该障碍物挡住了您对玩家点的视线


我希望这有点清楚。要将其转化为一种算法,您必须实现一种确定两个平面相交位置的通用方法(以确定障碍物是否足够高以阻挡视线)。

创建从摄影机到播放器范围的边界体积,确定哪些对象与该体积相交,然后以您想要的任何替代样式渲染它们


也许有一些非常聪明的方法可以做到这一点,但这似乎是一个非常简单的版本,而且不应该有太多的性能影响(无论如何,你可能会在每一帧都进行碰撞…)

在屏幕上找到某个给定点的对象称为拾取。对于你来说,这应该引导你去一个例子。其思想是,从2D点检索游戏中的3D点,然后可以使用标准碰撞检测方法确定哪个对象占用该空间。然后可以选择以不同方式渲染该对象


如果在拾取方法上遇到问题,一种可能就足够了的方法是将角色作为场景的一部分渲染一次,然后在最后以半alpha的方式再次渲染。这样你可以看到整个角色和墙,尽管你看不到墙本身。

你应该阅读BSP树(二进制空间分割)…然后看不,那不行。正如你所说,这对原型设计很有用,但这根本不是我想要的?据我所知,你的回答似乎与我的意思不太接近。在确定要删除哪些曲面或alpha混合时,请考虑在相机和播放器之间画一条直线。然后,每一个碰到那条线的表面都需要改变。但是,如果仅从玩家的中心画一条线,则玩家仍可能部分模糊。在播放器外部添加“缓冲区”将确保整个播放器可见。这是一个有点难以描述没有画一幅画。而且,它不仅是“任何表面击中该线”,但整个模型的表面属于。如果你设置的表面和对象在一个继承人/面向对象的方式,如果你知道你必须隐藏一个表面,只需隐藏父对象拥有该表面。我也不笑。。。不过我相信这里还有其他人。进行搜索,如果结果为空,则开始新问题。:)有趣的是,你提到的第二种方法正是我在同样情况下想到的+1为hivemind。我最终使用了三角形拾取样本,但结果非常好。你赢了。