2011-08-26 3 views
4

얼마 전에 GLUT을 사용하여 OpenGL을 사용하기 시작했습니다. 멤버 함수를 GLUT 함수에 넘겨 줄 수는 없습니다. (또는 비록 그 옵션을 실제로 탐색하지는 않았지만 그 문제에 대한 회원에 대한 포인터).GLUT 및 C++ 클래스

"괜찮은"방법이 있는지 궁금 해서요. 아니면 이것을 해결하는 "가장 적절한"방법은 무엇입니까? 정적 멤버 함수를 사용할 수 있다는 것을 알고 있지만 더 좋은 방법은 없습니까?

나는 C++로 작성되고 C++ 클래스 기반 인터페이스를 제공하는 SFML과 같은 다른 라이브러리가 있다는 것을 알고 있지만 GLUT (자유롭게 정확해야 함)와 관련하여 어떤 가능성이 있는지 궁금합니다.

답변

7

첫째, GLUT는 심각한 응용 프로그램 작업을위한 것이 아닙니다. 간단한 그래픽 데모 용입니다. 그리고 그 목적을 위해, 그것은 좋습니다. GLUT에서 진지한 일을하려고 할 때, 한계를 극복하기 위해 많은 시간을 할애 할 것입니다. 이 제한은 결국 만나는 많은 것 중 하나 일뿐입니다. GLFW는 여전히이 제한 사항을 가지고 있지만 (다음 버전은 그렇지 않지만) 일반적으로 심각한 응용 프로그램 작업에 비해 월등합니다.

둘째,이를 해결하는 "가장 적절한"방법은 현재하고있는 일에 달려 있습니다. 하나의 창만있는 경우 올바른 해결책은 관심있는 클래스에 전역 포인터 (또는 전역 포인터를 반환하는 함수)를 사용할 수있는 간단한 정적 함수입니다.

여러 개의 창이있는 경우 GLUT의 윈도우 식별자에서 어떤 객체에 대한 포인터로 매핑하는 글로벌 std::map이 필요합니다. 그런 다음 특정 함수가 호출 된 창을 가져올 수 있고지도를 사용하여 해당 호출을 해당 창을 나타내는 특정 객체로 전달할 수 있습니다.

+0

답변을 주셔서 감사합니다. 지금은 "간단한 데모"이지만, GLFW를 살펴 보겠습니다. GLUT를위한 해결책에 관해서, 좋아, 나는 그 방향으로 다소 생각하고 있었다. – KWyckmans

0

멤버 함수를 glut 또는 다른 라이브러리에 전달하는 것은 충분히 쉽습니다. GLUT 함수 포인터를 찾고있다.

컨트롤러를 glutKeyboardFunc로 보내려는 OnKeyPress 멤버 함수가있는 클래스로 지정하십시오. 해당 클래스 객체의 멤버 함수를 보낼부터 먼저 여기

glutKeyboardFunc(&Controller::OnKeyPress); 

같은 것을 시도하는 유혹 수 있습니다, 우리는 함수 포인터를 전달하는, 그러나 이것은 잘못된 것입니다. C++ 11에서는 새로운 std::bind을 사용할 수 있습니다. 또는 이전 컴파일러를 사용하는 경우 boost::bind을 권장합니다. 어느 쪽이든 구문은 동일합니다.

using namespace std::placeholders; // for the _1, _2 placeholders 
glutKeyboardFunc(std::bind(&Controller::OnKeyPress, &GLInput, _1, _2, _3)); 

설명서에서 glutKeyboardFunc에는 3 개의 매개 변수가 필요합니다. 먼저 멤버 함수이므로 객체의 첫 번째 인수 메모리 주소를 수정 한 다음 3 개의 자리 표시자를 제공합니다.

std :: bind에 익숙하지 않은 사람들은 이상하게 느껴진다.하지만 C에서 객체 지향 코드를 작성한 사람이라면 누구나 알 수있다. 함수는 실제로는 C 함수이며 클래스에 대한 "this"포인터가 필요합니다. 콜백이 간단한 함수 인 경우에는 바인드가 필요하지 않습니다.