隐藏在3D场景中遮挡玩家的物体

时间:2009-12-02 17:52:24

标签: c# algorithm 3d xna

我正在设计一款带有相机的3D游戏,与“模拟人生”完全不同,我希望防止玩家角色隐藏在物体后面,包括墙壁,柱子和其他物体。

处理墙壁案件的一种简单方法是让它们面向内部而不是另一侧,但这根本不会覆盖其他案件。

我计划的是以某种方式检查玩家相对于相机“在前面”的物体,然后隐藏它们 - 无论是通过Alpha混合还是不进行渲染。

我想到的一个可能不太好的想法是从相机直线扫描玩家,看看你是否击中了一个非隐藏的物体,直到你到达玩家。不幸的是,我几乎是3D编程的新手。

Demonstration SVG illustration<墙面板遮挡了玩家,所以必须隐藏它。另一个不相关且几乎已经解决的问题是移除那一侧的所有三个墙板,这与这个问题无关,只是由我提出的映射系统引起的。

5 个答案:

答案 0 :(得分:3)

  

我计划的是以某种方式检查玩家相对于相机“在前面”的物体,然后隐藏它们 - 无论是通过Alpha混合还是不进行渲染。

这是一个很好的计划。你需要在播放器上加入某种类型的边界音量,这样整个播放器(加上一点额外的)都可以随时看到。然后,只需为边界体积的每个角运行交集算法。

答案 1 :(得分:1)

一种简单的方法,至少对于原型制作来说,总是在>之后绘制播放器来绘制场景的其余部分。这将确保播放器呈现在场景中的任何其他内容之上。粗暴但有效。

答案 2 :(得分:1)

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

可能有一些非常聪明的方法可以做到这一点,但这看起来就像是非常简单的版本,并且不应该太多的一击(你可能无论如何都要在每一帧都进行碰撞......)

答案 3 :(得分:1)

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

如果你在拾取方法上遇到问题,那么一个hack可能就足够了,就是将角色渲染一次作为场景的一部分,然后在最后半场再次渲染它。这样你就可以看到整个角色和墙壁,虽然你不会透过墙壁看到它。

答案 4 :(得分:0)

我能想到的最简单的事情应该是相对较好的是通过垂直于地面的平面对所有障碍物进行建模(假设你有一个地面。)粗略地假设所有障碍物都是有一定高度的墙。 / p>

将您的播放器建模为某处的某个点,并将您的相机建模为另一个点。连接这两个点的3d中的线位于一个对您特别感兴趣的平面中,因为如果此平面与障碍物高度下方的“障碍平面”相交,则意味着该障碍物阻挡了您对玩家点的视野

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