如何确保对象不会超出可见范围->opengl->c
Posted
技术标签:
【中文标题】如何确保对象不会超出可见范围->opengl->c【英文标题】:How to make sure an object doesn't get out of visible range ->opengl->c 【发布时间】:2011-01-06 00:46:36 【问题描述】:假设您在屏幕中心有一些多边形(假设是一个正方形,考虑到 2D 世界),并且您有一个函数可以从中心点重绘该多边形。 每次您在键盘上按下向上、向下、向左或向右时,都会根据按下的键重新绘制形状(向上或向下将更新 y 坐标,左右将更新坐标)。 考虑到你有: glutInitWindowSize(400,400); glutInitWindowPosition(400,200);
而且我正在使用 glMatrixMode(GL_MODELVIEW),如何防止形状退出相机视线?
PS:到现在为止我只能防止不从左下角退出,我在重绘时在坐标刷新时测试y或x是否为负(如果是,形状将在同一位置重绘) ,但我无法对窗口的右边缘和上边缘做同样的事情。
【问题讨论】:
【参考方案1】:听起来您需要将相机的远剪辑平面设置为更大的距离,或者确保您的对象不会超出相机的远剪辑属性。
【讨论】:
这可能是答案,不过,我使用的是标准相机,所以我不太确定它的剪切限制到底是多少 您可以尝试使用 glFrustum() 或 gluPerspective() 函数设置这些属性 :) 您正在寻找 zNear 和 zFar 剪切平面。 zNear 必须 > 0 fyi。编码愉快! 似乎成功了(尝试了一些 glFrustum),我可以找到获得相机限制的方法。非常感谢您的回答【参考方案2】:在阅读了您的 cmets 到另一个答案后,我有了一个想法。我不确定它是否合适,但它可能会有所帮助。
据我了解,您可以看到玩家控制的飞机,并且当玩家在设置内移动飞机时,您确实希望飞行器相对于玩家拥有的视图移动,但是您不希望它退出视图。我的假设是整个视图随着飞行器向前飞行而移动(这可能是错误的)。
我的想法是,你总是让视野以随着飞机远离视野中心而增加的速度向飞行器中心移动。随着飞船离中心足够远以接近边缘,摄像头重新回到飞船上的速度将会增加(并且摄像头移动的速度限制大于飞机)。当相机靠近飞机时,它会放慢速度。 (是的,这听起来很像狭义相对论)
你应该能够跟上飞机与中心的距离,首先要知道它最初是居中的,并且知道你对它做了什么变换。您可以更新一个与您应用到飞机的运动保持一致的变换矩阵,并且在每次更新时,您可以计算一个逆运算,将相机移回相机视图的中心,然后将该矩阵乘以标量 1 /2,并以此转换整个场景。如果您不希望相机随着飞机的方向旋转,那么您就不要将转弯放入跟上该方向的矩阵中。每次更新要移动多少相机(在我的示例中为 1/2)取决于您。我选择了 1/2,因为你应用的部分和你为下次更新保存的部分是一样的。
我已经很久没有做任何 openGL 了,但我记得能够从 引擎 中读取矩阵,但这很容易让你自己跟上。
这可能根本不是您想要的,但看起来它可能会有所帮助。
【讨论】:
这也是一个非常有用的提示!从来没有想过这一点(尽管它是有道理的)。我会确保我把这个放在我的书上【参考方案3】:听起来好像您需要跟踪图形对象的宽度和高度,然后使用一些减法来计算允许的最大 x 和 y 位置。
顺便说一句,这是学校作业吗?
【讨论】:
事实上是一个CG分配项目,涉及创建一个带有飞机的游戏,我必须确保玩家的飞机不会出现在屏幕上。问题是,屏幕可以调整大小,所以我真的不知道如何获取这些值来进行比较(如果您有任何使用固定大小窗口并将对象保留在其中的示例,那将是一个好的开始)。 opengl 中的屏幕尺寸(我用谷歌搜索“opengl 获取屏幕尺寸”,不带引号找到此链接)opengl.org/discussion_boards/… 我的问题与这个问题有些相似,但提供的 asnwer 并没有给出完整的答案(如问题海报所述)。除非我以错误的方式测试这个以上是关于如何确保对象不会超出可见范围->opengl->c的主要内容,如果未能解决你的问题,请参考以下文章
如何配置 UIScrollView 使可见区域永远不会超出背景图像?