简单的2D裁剪/遮挡方法
OpenGL- Simple 2D clipping/occlusion method?
我正在制作一个相对较小的2D(俯视图)游戏演示,使用OpenGL作为我的图像。这是一个基于潜行的基本角度,对于我的所有敌人,我都画了一个视线弧线,这样玩家就知道他们在看哪里。
到目前为止,我的一个问题是,当我绘制这个视线弧(作为一个填充多边形)时,它自然地通过屏幕上的任何墙壁显示,因为没有任何东西阻止它:
http://tinyurl.com/43y4o5z我很好奇怎样才能最好地防止这样的事情发生。我已经有了一些代码,可以让我检测与墙壁的线相交等(对于敌人的视线检测),理论上我可以使用它来检测这种情况并相应地绘制多边形,但这可能会非常繁琐和/或低效,所以我想如果有任何内置的OpenGL系统可以为我做这件事,它可能会做得更好。
我试着寻找诸如剪切/闭塞等主题的问题,但我甚至不确定这些是否正是我应该寻找的;我的OpenGL技能有限。似乎任何使用glClipPlanes或glScissor的东西都不适合这种情况,因为有大量的独立墙壁等。
最后,这只是我在业余时间做的一个演示,所以图像并不是我主要担心的。如果有一种(合理的)无痛的方法来做到这一点,那么我希望有人能给我指出正确的方向;
这本质上是一个阴影问题。我是这样做的:
对于你的弧线边缘的每个点,追踪从敌人到该点的(2D)光线,寻找与绿色盒子的交点。如果绿色的方框总是与坐标轴对齐,数学运算就容易多了(寻找Ray-AABB的交集)。将交点渲染为三角形扇形,可以得到圆弧。
正如你所提到的,你已经有了线墙相交的代码,那么只要它能告诉你敌人到墙的距离,那么你就可以使用它来瞄准弧。不要想当然地认为它会太慢——我们不再运行486了。你总是可以减少圆弧边缘的点的数量来加快速度。
OpenGL的内置遮挡处理是为3D任务而设计的,我想不出一个简单的方法来实现你所追求的效果。如果是我,我解决这个问题的方法是使用一个片段着色程序,但要事先警告,这绝对不属于"一个(合理的)无痛的方式来做到这一点"。简单地说,你首先渲染一个二进制的"遮挡图",其中有墙的地方是黑色的,其他地方是白色的。然后你渲染"观看弧",就像你目前正在做的一个片段程序,旨在从查看器搜索到目标位置,搜索闭塞器(黑色像素)。如果它找到一个遮挡物,那么它将"观察弧"的像素渲染为100%透明。总的来说,虽然这是一个"正确"的解决方案,但我肯定地说,这是一个复杂的功能,你似乎没有实现它。
我想如果有任何内置的OpenGL系统可以为我做这件事,它可能会做得更好。
OpenGL是一个绘图API,不是一个几何处理库。
实际上你的交叉测试方法是正确的。然而,为了加快速度,你应该使用空间细分结构。在您的情况下,您需要一个二进制空间分区树。BSP树有一个很好的特性,寻找与墙相交的线的复杂度平均约为O(log n),最坏的情况是O(n log n),换句话说,BSP树是非常有效的。详细信息请参见BSP FAQ http://www.opengl.org//resources/code/samples/bspfaq/index.html
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 枚举环境变量的惯用C++14/C++17方法
- 简单的2D裁剪/遮挡方法