문제
간단한 2D OpenGL 애플리케이션을 만들고 있는데 일부 카메라 문제가 발생한 것 같습니다.(20,20)에 직사각형을 그리면 (25,20) 정도에 그려집니다.(100, 20)에 그리면 125 정도에 그려집니다.어떤 이유로 모든 것이 몇 % 오른쪽으로 이동하고 있습니다.
여기에 잘린 버전을 붙여넣었습니다.http://pastebin.com/m56491c4c
GLUT를 설정하는 방식에 문제가 있나요?나는 그것을 비활성화할 때 동일한 일이 발생하기 때문에 내 개체가 이상한 일을 하는 것이 아니라는 것을 알고 있습니다.
미리 감사드립니다.
해결책
Reshape 함수 내부에서 투영 행렬을 설정해야합니다 (resize()
), 또한 사용자가 창 크기 조정의 문제를 자동으로 해결합니다.
void resize(int w, int h)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, w, h, 0);
}
그런 다음 드로우 함수에서 행렬 모드가 모델 뷰인지 확인하십시오.
void draw()
{
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
...
}
코드와 관련된 기타 문제 :
- 당신은 아마도 전화해서는 안됩니다
glutPostRedisplay()
끝에draw()
. 이것은 CPU를 100%로 운영 할 것입니다. 대신 사용할 수 있습니다glutTimerFunc()
여전히 몇 밀리 초마다 업데이트됩니다. - ~ 안에
processMouse()
, 당신은 사용하고 있습니다wsprintf()
배열에char
에스:wsprintf()
광범위한 캐릭터 배열을 취합니다 (wchar_t
), 따라서 로컬 변수를 만들어야합니다s
유형의wchar_t[]
, 또는 사용sprintf()
그리고MessageBoxA()
대신에wsprintf()
그리고MessageBoxW()
(어느 쪽MessageBox()
유니 코드 애플리케이션을 컴파일 할 때 매크로로 확장됩니다. 당신은 또한 버퍼 오버플로에 취약합니다. 현실적으로는 매우 큰 것을 전달하지 않더라도 최소 12 자 이상의 버퍼를 사용해야합니다.x
값. 마지막으로 사용해야합니다snprintf()/wsnprintf()
대신에sprintf()/wsprintf()
버퍼 오버 플로우로부터 보호합니다.
다른 팁
ModelView 매트릭스에서 glOrtho2D를 호출하는 것 같습니다.그게 문제인지는 의심스럽습니다(이 경우에는 Projection이 ID여야 하기 때문에). 대신 Projection 행렬에서 이를 호출해야 합니다.
크기 조정 호출에서 w와 h도 인쇄해야 합니다. 창 크기가 실제로 생각한 것과 같은지 확인해야 합니다. (글루트가 어떻게 작동하는지는 모르겠지만 gluInitWindowSize()에는 테두리가 포함될 수 있으므로 상황이 엉망이 될 수 있습니다. 위로).
작업중인 시스템에 따라 다르지만 일반적으로 대부분의 Windows 좌표 시스템은 왼쪽 하단에서 시작하여 상단과 오른쪽으로 계산됩니다. 이 경우 Gluorth02D 호출이 잘못되었습니다.
당신은 :
gluOrtho2D(0, appWidth, appHeight, 0);
창의 상단이 바닥에 바닥에 쌓여 있습니다.
대부분의 경우 :
gluOrtho2D(0, appWidth, 0, appHeight);
내가 말했듯이 그것은 시스템에 따라 다르고, 당신과 함께 일하는 플랫폼. 대부분의 Linux 구현에 대해서만 말할 수 있습니다.
버그에 영향을 미치는 경우를 대비하여 확인해야 할 다른 것입니다.