【问题标题】:Normalized Device Coordinates mapping to 2d array indices标准化设备坐标映射到二维数组索引
【发布时间】:2016-02-25 23:43:55
【问题描述】:

我在 opengl 中创建了一个棋盘/棋盘,它有 100 个盒子。从逻辑上讲,我以二维数组(10 x 10)表示该板。现在我希望用户单击opengl窗口中的任意位置,我可以确定该框属于数组中的哪个索引,以便我可以进行一些处理。我怎样才能做到这一点?

我正在使用 LWJGL 一个用于 opengl 的 java 包装器。我知道我必须获取鼠标坐标,并且我知道它们以标准化设备坐标返回(在 1 到 -1 的范围内) 如何将 NDC 映射到索引?我一直在寻找,但没有找到太多。

我知道每个盒子的 NDC 范围。那是因为我通过给出顶点来绘制它们,所以我知道每个框在 NDC 中的开始和结束位置。但是以键值对的形式输入范围及其各自的索引就太麻烦了。

目前我正在尝试通过基本算术创建一个公式,以便它转换 NDC 并为我提供索引。这可能吗?还是有其他可行的方法?

对于那些正在思考我是如何制作棋盘的人,我以 0.2 的常规距离绘制了从 -1 到 1 的垂直线。水平的情况也是如此。

【问题讨论】:

    标签: java arrays opengl lwjgl


    【解决方案1】:

    如果您直接在屏幕空间中绘图,则很容易根据 NDC 坐标计算框索引:

    index.x = (int) ((ndc.x/2.0f + 0.5f) * boardSize.x)
    index.y = (int) ((ndc.y/2.0f + 0.5f) * boardSize.y)
    if (index.x == boardSize.x) // in case ndc.x was exactly 1
        --index.x;
    if (index.y == boardSize.y) // in case ndc.y was exactly 1
        --index.y;
    

    【讨论】:

    • 该死的人,这似乎有效.. 还没有编码,只是检查了公式。你能告诉我它们是如何产生的吗?我一直想自己推导出这些公式
    • 一步一步想。除以 2 缩放 ndc 在 [-0.5, 0.5] 范围内。然后添加 0.5,它现在位于 [0,1] 中。剩下要做的就是乘以所需的大小并通过将分形部分强制转换为整数来切断分形部分,无论如何都是你想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    • 2012-08-09
    • 1970-01-01
    • 2023-03-27
    • 2011-01-26
    相关资源
    最近更新 更多