2014-04-21 2 views
1

OpenGL에서 내 마우스 동작을 기반으로 카메라의 매개 변수를 업데이트하려고합니다. GLFW를 사용하고 있습니다. GLFW에 미리 정의 된 이벤트 핸들러가 있습니다. mouseMoveCallback() 함수를 등록하는 데 사용하는 미리 정의 된 이벤트 핸들러는C++의 정적 함수에서 비 정적 멤버 업데이트

glfwSetCursorPosCallback(window, mouseMoveCallback); 

입니다. 클래스에서 카메라를 선언했고 Camera 클래스의 인스턴스가 프로그램에서 사용되었습니다. Camera 클래스의 멤버는 정적이 아니지만 mouseMoveCallback 함수는 정적입니다. 정적 함수가 비 정적 멤버에 액세스하는 것은 불가능하다는 것을 알고 있습니다. Camera 클래스의 비 정적 인스턴스 멤버를 업데이트 할 수있는 가장 좋은 방법은 무엇입니까?

전역을 사용하고 mouseMoveCallback() 함수를 사용하여 전역을 업데이트 한 다음 비 정적 멤버 함수에서 업데이트 된 전역 값을 읽는 등 필요한 기능을 얻을 수 있습니다. 그러나 키보드 입력과 같이 더 많은 매개 변수를 추가하려는 경우 키보드 입력과 같은 매개 변수를 추가 할 때 이렇게 빨리 못 생길 수 있습니다.이 작업을 수행하는 데 더 좋은 방법이 있는지 알고 싶습니다.

+1

: mouseMoveCallback 이후

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

은 C 라이브러리에서 호출, 그것은 C 결합을 가지고 그렇다면 카메라 객체를 어디서 업데이트 할 것인가? 이 클래스는 문제가되는 클래스가 아닙니다. 객체를 어딘가에 인스턴스화했으며이 객체에 업데이트하려는 멤버가 있습니다. 기본적으로 개체에 접근 할 수있는 방법을 디자인해야합니다. 개체를 전역, 단일 패턴 등으로 저장했는지 여부에 관계없이 액세스 할 수 있어야합니다. – PaulMcKenzie

+0

Camera 객체는 콜백 및 정적 함수 mouseMoveCallback()을 설정하는 다른 클래스의 함수에서 인스턴스화됩니다. – shaveenk

+0

전역 함수를 사용하고 mouseMoveCallback() 함수를 사용하여 필요한 기능을 얻을 수 있습니다. 비 정적 멤버 함수에서 업데이트 된 전역 값을 읽습니다. 그러나 이것은 키보드 입력과 같이 더 많은 매개 변수를 추가하고자 할 때 추악 할 정도로 빨리 빠져 나올 수 있습니다. 그래서 이것을 수행하는 더 좋은 방법이 있는지 알고 싶었습니다. – shaveenk

답변

3

glfwSet/GetWindowUserPointer을 사용하여 사용자 정의 포인터를 GLFWwindow 개체와 연결할 수 있습니다. 의는 GLFWwindowwin가 가리키는 및 Camera 객체가 cam가 가리키는 당신에게 create을 가정 해 봅시다 - 설치를 :

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

질문에 어떤 디자인이 필요합니까? 개체 인스턴스와 통신하는 데 사용합니다.

하나의 디자인은 윈도우 핸들을 글로벌 키로 만들고 오브젝트 인스턴스를 데이터로 생성 할 수 있습니다. 핸들이 들어 오면지도에서 윈도우 핸들을 검색하고 거기에서 객체 인스턴스를 검색 할 수 있습니다.

또 다른 디자인은 콜백이 "사용자 매개 변수"를 허용하는지 확인하는 것입니다. 그렇다면 인스턴스에 대한 포인터를 user 매개 변수에 첨부 할 수 있습니다. 콜백이 호출되면 "사용자 매개 변수"에서 인스턴스를 검색합니다.

이것은 두 가지 방법 중 하나입니다. 여기에서는 언급하지 않겠지 만 "C 인터페이스를위한 객체 지향 래퍼"를 만드는 방법을 연구함으로써 연구 할 수 있습니다.

+1

그 GLFW를 추가하고 싶습니다. ['glfwSetWindowUserPointer()'] (http://www.glfw.org/docs/latest/group__window.html#ga3d2fc6026e690ab31a13f78bc9fd3651) 함수를 통해 "사용자 매개 변수"를 사용하므로 두 번째 접근법을 직접 지원합니다. – derhass

관련 문제