我一直在使用目标c和OpenGL进行游戏。我知道如何创建对象以及如何使其按照我想要的方式移动,但我无法将它保留在窗口内。你如何将物体放在窗户内?在OpenGL中保存一个对象在一个窗口内
-3
A
回答
0
“观看”相机是一种非常方便的技术,可让观看者跟踪物体(因此,无论物体还是相机点移动,物体都会保持在屏幕上)。请参阅'gluLookAt'以获取常用的实现,大多数3d助手代码库都会有一个。你给它一个期望的相机点,感兴趣的对象和'向上向量',它会创建一个适当的世界(相机转换)矩阵。
否则,如果你在控制对象,只是不要将它移动到最初的平截头体之外。
1
OpenGL的常见问题,section 8.070: How can I automatically calculate a view that displays my entire model?:
以下是由Dave Shreiner一张贴在建立基本 观察系统:
首先,计算为场景中的所有对象边界球。这个 应该为您提供两位信息: 球体的中心(let(c.x,c.y,c.z)是该点)及其直径(称为 “直径”)。
接下来,选择zNear剪裁平面的值。一般指导 是选择大于,但接近1.0的东西。所以,让我们说 设置:
zNear = 1.0; zFar = zNear + diam;
结构化你的矩阵调用顺序(对于正投影):
GLdouble left = c.x - diam; GLdouble right = c.x + diam; GLdouble bottom c.y - diam; GLdouble top = c.y + diam; glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(left, right, bottom, top, zNear, zFar); glMatrixMode(GL_MODELVIEW); glLoadIdentity();
这种做法应该在窗口和拉伸的中间居中的对象他们适合(即,它假设您使用的纵横比为1.0的 窗口)。如果你的窗口不是正方形,计算 左,右,下,和顶部,如上述,并把下面的逻辑 调用glOrtho()之前:
GLdouble aspect = (GLdouble) windowWidth/windowHeight; if (aspect < 1.0) { // window taller than wide bottom /= aspect; top /= aspect; } else { left *= aspect; right *= aspect; }
上面的代码应定位对象适当地在你的场景中。如果您打算操作(即旋转等),您需要向其添加查看转换。
一个典型的观看变换会在模型视图矩阵,可能 是这样的:
gluLookAt(0., 0., 2.*diam, c.x, c.y, c.z, 0.0, 1.0, 0.0);
相关问题
- 1. 如何在Scala中保留一个对象在内存中?
- 2. 在另一个wpf窗口内部有一个wpf窗口
- 3. OpenCV在一个窗口中检测多个对象 - 未绘制
- 4. 在一个窗口中设置两个对象 - VTK
- 5. 在PyQt的一个窗口中显示另一个窗口
- 6. 在Java/SWT中保存一个窗口的状态
- 7. 如何关闭一个openGL窗口
- 8. 用OpenGL环境打开一个窗口
- 9. 在主窗口中绑定一个对象
- 10. 如何判断一个窗口存在?
- 11. 如何在一个对象内创建一个javascript对象?
- 12. 在另一个COM对象内创建一个COM对象
- 13. 如何在一个对象内创建一个对象c#
- 14. 保持在另一个窗口上方的窗口
- 15. 保持X11窗口在另一个窗口顶部
- 16. 在同一个OpenGL窗口中绘制2D和3D
- 17. 如何在我的qMainWindow中嵌套一个opengl窗口
- 18. 在另一个应用程序中的OpenGL窗口
- 19. 在OpenGL中构建一个窗口系统
- 20. 如何在openGL中分割一个窗口?
- 21. OpenGL对象在一个圆圈内自动移动
- 22. 如何确保一个窗口只在Cocoa中显示一次?
- 23. 打开一个窗口,关闭一个窗口在PyQt5
- 24. 在另一个内部显示一个WPF窗口
- 25. 创建一个只能在父窗口内拖动的窗口
- 26. C++ - 在同一个窗口
- 27. 在另一个窗口
- 28. 确保一个对象将实现一个接口
- 29. C++ OpenGL问题绘图网格vbo和vao存储在一个对象内
- 30. 保存一个新对象GRAILS - GORM:DuplicateKeyException
你需要澄清你所说的“对象”的意思,你是如何渲染某些事情,等 –
你不用在OpenGL中创建对象,你可以绘制它们。 OpenGL不维护场景图形或几何图形持久性。 OpenGL不记得你告诉它绘制的东西。 – datenwolf