在墙壁(或障碍物)处停止相机移动[关闭]

Posted

技术标签:

【中文标题】在墙壁(或障碍物)处停止相机移动[关闭]【英文标题】:Stop camera Movement at a wall (or obstacle) [closed] 【发布时间】:2012-10-25 05:52:04 【问题描述】:

我刚刚学会了一点 GLUT,已经设置了一个可移动的相机、照明和制作了一个包含一些 3D 表格的class

但现在我希望相机不能穿过这些物体。是否有任何类型的OpenGLglut 命令可以用来检查特定点或实际相机位置是否有障碍物?

【问题讨论】:

您是否使用 gluLookAt 来移动您的相机? 不,我已经可以用鼠标和键盘移动凸轮了,我希望相机的运动在出现时停止。在当前相机的位置绘制一个立方体,这样凸轮将无法穿过立方体。 据我所知,这是一个很难的课题,我自己还没有经验,我正在学习自己。如果您的问题不够复杂,您可以使用简单的蛮力方法。这可能会有所帮助:nehe.gamedev.net/tutorial/collision_detection/17005 和:gamedev.stackexchange.com/questions/13736/… 【参考方案1】:

OpenGL 是一个光栅化 API,它不会为您检查或处理冲突。检测碰撞的常用方法是边界框或边界球。您可以将相机位置视为一个点,并检查它是否在障碍物的包围体内。要获得边界球体的半径,您必须遍历模型中的每个顶点并存储到其中心的距离。您只需要循环一次,而不是每一帧。

【讨论】:

【参考方案2】:

OpenGL 不是场景图,这意味着它没有任何类型的场景或世界的内部表示。 OpenGL 是一个绘图 API,它只是在帧缓冲区上绘制点、线和三角形,一次一个,然后忘记它们。

因此 OpenGL 不会为您进行碰撞检测。 可以使用 OpenGL 实现碰撞检测系统,但这是您的程序所做的事情,而不是 OpenGL。

【讨论】:

我通过使用一个大的 3 维布尔数组 (20000^3) 解决了我的问题,该数组存储了块所在的信息。虽然它很大,但它工作得很好,因为它永远不会读取一次整个数组,每帧只有几个(正好 6 个)元素:D @AndiFaust:为什么不简单地测试与常规场景几何体的碰撞?这肯定不是很困难,而且效率更高。 我不知道该怎么做...你能解释一下吗? 有一本关于这个话题的好书:realtimecollisiondetection.net

以上是关于在墙壁(或障碍物)处停止相机移动[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

我们可以称程序中的潜在障碍吗

cf#382div2

火星探险问题 网络流

P1605 迷宫

P1605 迷宫

luogu 1605 迷宫