2014-04-21 53 views
1

我想根据我在OpenGL中的鼠标移动来更新我的相机参数。我正在使用GLFW。有在GLFW在C++中更新静态函数中的非静态成员

glfwSetCursorPosCallback(window, mouseMoveCallback); 

一个预定义的事件处理程序,我使用注册mouseMoveCallback()函数。我已经在一个类中声明了我的相机,并且在该程序中使用了Camera类的一个实例。 Camera类中的成员是非静态的,但mouseMoveCallback函数是静态的。我知道静态函数不可能访问非静态成员。我可以更新Camera类的非静态实例的成员的最佳方式是什么?

我能够通过使用全局变量和使用mouseMoveCallback()函数来更新全局,然后从非静态成员函数读取更新的全球价值,以获得所需的功能。但是,当我想添加更多的参数来读取时,如键盘输入等,这会变得很难看,所以我想知道是否有更好的方法来做这件事。

+1

那么你想更新的摄像头'对象'在哪里?这不是一个'class'问题 - 你已经在某个地方实例化了一个对象,并且这个对象有你想要更新的这些成员。您基本上需要设计一种方法来获取对象,无论是将其存储为全局单例模式等,然后访问它。 – PaulMcKenzie

+0

Camera对象是在函数实例化(另一个类的),我还设置了回调和静态函数mouseMoveCallback() – shaveenk

+0

我能够通过使用全局变量和使用mouseMoveCallback()函数来更新,以获得所需的功能全局变量,然后从非静态成员函数中读取更新的全局值。但是,当我想添加更多的参数来读取时,如键盘输入等,这可能会变得很难看。因此,我想知道是否有更好的方法来做到这一点 – shaveenk

回答

3

您可以使用glfwSet/GetWindowUserPointer到用户定义的指针与GLFWwindow对象关联。比方说,你create一个GLFWwindow指向winCamera指向的对象cam - 设置有:

... 
glfwSetWindowUserPointer(win, cam); 
glfwSetCursorPosCallback(win, mouseMoveCallback); 
... 

由于mouseMoveCallback从C库调用,它具有C链接:

extern "C" void mouseMoveCallback (GLFWwindow *win, double x, double y) 
{ 
    // get the associated user-data: 
    Camera *cam = static_cast<Camera *>(glfwGetWindowUserPointer(win)); 

    // manipulate the associated Camera object: 
    ... 
} 
2

您的问题需要您决定哪个设计用于与您的对象实例进行通信。

一个设计可以创建窗口的全局的std ::地图处理为重点和对象实例的数据。当句柄进入时,您搜索窗口句柄的地图,并可以从那里检索对象实例。

另一种设计是查看回调是否允许“用户参数”。如果是这样,那么可以将指向实例的指针附加到用户参数。当回调被调用时,您从“用户参数”中检索实例。

这些只是两种方法。还有一些我不会提到,但可以通过搜索“为'C'接口创建面向对象的包装器”的方法进行研究。

+1

我只想补充一点,GLFW提供“用户参数的”通过['glfwSetWindowUserPointer()'](http://www.glfw.org/docs/latest/group__window.html#ga3d2fc6026e690ab31a13f78bc9fd3651)的功能,所以它直接支持使用第二种方法。 – derhass