Cocoa / OpenGL坐标转换

时间:2009-03-13 14:34:06

标签: cocoa opengl coordinates

我正在尝试在NSOpenGLView中按时间戳绘制一些数据。我还想在数据上方叠加一些非openGL Cocoa元素,例如突出显示框。我的困难在于让坐标系统排成一行。

我的数据的时间戳是从纪元以来的秒数。值从-2到2运行。我可以通过执行gluOrtho(startTime, endTime, -2, 2)在OpenGL中绘制原始数据而不会有太多困难。当我尝试将它与缩放和Cocoa绘图混合时,困难就来了。

为简单起见,我将使用一行的例子。以下是从(2/18/09 at 13:00:08, -1.5)(2/18/09 13:00:13, 1.7),或(1234980008, -1.5)(1234980013, 1.7)的秒数(使用OpenGL)绘制的行:

Scale=1 http://ccg.cc.gt.atl.ga.us/~anjiro/tmp/scale1.png

为了便于讨论,我想现在要使用Cocoa在OpenGL线上叠加一条完全相同的线。我希望能够使用完全相同的坐标,即(1234980008, -1.5) -> (1234980013, 1.7)

这是第一个问题。现在我想看到更多细节,所以我想缩放:

Scale=2 http://ccg.cc.gt.atl.ga.us/~anjiro/tmp/scale2.png

我仍然希望绘制相同的Cocoa系列,但我还需要知道,在数据坐标中,此窗口中显示的内容是什么,所以我不必绘制额外的数据。

我尝试了各种解决方案,但无法完成任何工作。我可以这样做吗?如果是这样,怎么样?如果没有,我该怎么做呢?

1 个答案:

答案 0 :(得分:1)

我猜您已经知道使用 - [NSView bounds]获取视图的矩形。 因此,您会得到以下对应关系:

  • startTime< - > bounds.origin.x
  • endTime< - > bounds.origin.x + bounds.size.width
  • ( - 2)< - > bounds.origin.y
  • (+ 2)< - > bounds.origin.y + bounds.size.height

如果我没弄错,这个方法应该将NSOpenGL点转换为视点:

- (NSPoint) pointWithTime:(long)time value:(float)value
{
    NSPoint point;

    point.x = [self bounds].origin.x 
        + [self bounds].size.width * ((time - startTime) / (endTime - startTime));
    point.y = [self bounds].origin.y
        + [self bounds].size.height * ((value - minValue) / (maxValue - minValue));

    return point;
}

(minValue = -2,maxValue = 2。)

对于问题的第二部分:使用 - [NSView drawRect:]方法提供的 rect 来了解要刷新视图的哪个部分。在“可可绘图指南”中详细说明了这一点。可以多次调用该方法来绘制视图的不同部分。