opengl - 在 3D View 中实现操纵 handle 的方法

标签 opengl 3d

我正在构建一个简单的实体建模应用程序。用户需要能够在正交 View 和透视 View 中操作对象。例如,当屏幕上有一个框并且用户单击它来选择它时,它需要在角落和中心获得“ handle ”,以便用户可以将鼠标移动到这样的 handle 上并将其拖动到放大或移动该框。

有什么策略可以做到这一点,哪一种是最好的?我可以想到两个明显的:

1) 将 handle 视为 3d 对象。 IE。对于盒子,将小盒子添加到“主”盒子角落的场景中。问题:这在透视 View 中不起作用,我需要确定相对于当前缩放级别的框的大小(无论用户放大/缩小多远, handle 都需要具有相同的大小)

2) 在渲染场景后添加 handle 。渲染到屏幕外缓冲区,以某种方式确定角点的 2d 位置,并使用常规 2d 绘图技术来绘制 handle 。问题:我将如何进行 HitTest ?我还需要进行两阶段的 HitTest 方法;如何在 3D 渲染图像上进行 2D 绘制?退回到 GDI?

这两种方法可能都存在更多问题。是否有行业标准的方法来解决这个问题?

我正在使用 OpenGL,如果这有什么不同的话。

最佳答案

我会将 handle 视为 3D 对象。这提供了许多优点 - 更一致、表现良好、 HitTest 很容易等等。

如果您希望 handle 大小恒定,您仍然可以将它们视为 3D 对象,但您必须根据到相机的距离适当缩放它们的大小。这有点麻烦,但由于通常只有几个句柄,而且这些通常都是小对象,因此性能应该很好。

但是,我实际上想说让 handle 随着场景缩放。只要您为 handle 选择一种使它们脱颖而出的渲染样式(即:明亮的橙色框等),透视效果(背景中较小的 handle )实际上可以在很多方面使最终用户更轻松地使用它们。从 3D 场景中获得深度感很困难 - handle 上的透视效果有助于提供更多视觉线索,了解 handle 在屏幕中的“深度”。

关于opengl - 在 3D View 中实现操纵 handle 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/829786/

相关文章:

java - glGenVertexArrays() 不应有任何参数

matlab - "rectifyStereoImages"在 MATLAB 中不工作

java - 游戏专用3D环境系统

javascript - 4点图像变换

c++ - OpenGL/GLUT 中的鼠标拖动对象

c - 物体通过世界轴而不是局部轴OpenGL旋转

java - 法线贴图错误

ios - 将 3D 随机立方体旋转四舍五入到最近的 90 度

ios - Scenekit Pan 2D Translation to Orthographic 3D only horizo​​ntal

opengl - glBufferSubData什么时候返回?