OpenGL 2009. 4. 6. 02:30
Line, Rectangle, Circle, Sphere, Cube 의 각각의 객체에 대하여 구조체를 선언
각각의 구조체에는 좌표값을 위한변수, 로테이션을 위한 값, 그룹을 위한 할당값,
선택여부판단을 위한 Boolean 등이 들어있다.

이러한 객체를 관리하기위해 Vector를 이용하여 리스트를 구성하였다.
그러면 각각의 객체를 관리할수 있기때문이다.

드로우 에서는 두가지 펑션이 호출되게 해놓았는데,
하나는 오브젝트를 리스트를 돌면서 화면에 출력하는 것이고
하나는 마우스의 클릭&드래그를 통한 러버밴딩을 위한 출력을 위한 함수 두개를 호출.

다른 객체들을 그리는 부분은 모두들 쉽게 구현을 했으리라 생각한다. 하지만
많은 사람들이 glTranslatef 를 통한 중점 이동을 한후에 어떠한 문제가 발생했으리라 추측된다.

아마도 화면이 계속 밀리듯이 하다가 객체가 안보이는 현상이 생겼을것이다.

이는 매트릭스 모드의 복구가 이루어지지 않았기 떄문이다.
즉 무슨말인고 하니 , glTranslatef(0.5, 0.5, 0); 을 했다치면은 객체를 그린후
glTranslatef(-0.5, -0.5, 0) 를 해주어야 된다라는거다.

하지만 이짓을 상당히 귀찮은 짓이다.

그래서 glPushMatrix(); 를 통해서 현재 매트리스 상태를 저장하고 어떠한 작업을 한후에(중점 옮기기 라던지, 로테이션이라던지 이런것들) glPopMatrix()를 통해서
원래 상태로 되돌리면 위와같은 문제는 간단히 해결된다.

객체 변환의 기능의 경우 각각의 객체가 리스트르 통해서 따로관리되기에 각각의 값을 불러와서
그대로 로테이션, 해주고 출력하면 모든것이 해결된다. 단, 스케일의 변화같은경우에는 직접 객체를 그리기위한 반지름의 값, 혹은 사각형 등을 그리기위한 좌표값을 수정해서 저장해야만 반영이 되므로 이점을 유의하면 나머지도 무사히 구현가능하리라 생각한다.

러버벤딩을 이용한 처리의 경우에는, 마우스의 처음 클릭 값과, 마우스 버튼을 떼었을때의 경우를
생각해서 드로잉 하면되겠다. 이러면 별 문제가 발생하지않고 다 해결된다.

만약, 객체를 그렸는데 나타나지않는다면 이 경우를 의심해보자.
중심좌표를 이동할때 (마우스좌표값/화면축의 길이값)과 같이 적용했는지를 확인해보면 간단히 나온다.
무슨말인고하니 glOrthogo와 같이 투영값을 지정해줄시에 화면에 맵핑되는 값을 -1 ~ 1, 이런식으로 값을 지정하게되는데 거기게 맞는 값으로 매핑을 해주어야 윈도우 좌표계와 매핑되어 나오기 떄문이다. 즉 저값을 벗어나면 그냥 뷰의 화면에선 보이지않게된다. 이점을 잘 생각해보면 출력이 되지않는 경우를 제대로 할수있을것이다.

객체의 복사 붙이기 기능의 경우 역시 버퍼를 이용하면 단순하다.
어떠한 객체가 지정되면, 객체의 리스트의 정보에 셀렉트의 bool값이 true가 될것이고 이정보들을
컨트롤+c와같이 명령어를 먹이는순간 카피버퍼에리스트에 다 복사한다.
 그리고 붙이기를 할때, 그 값을 해당하는 리스트에 다시 삽입하면 되는것이다. 그러면 화면에는
겹쳐져서 안보일지 몰라도 객체가 그려져 있을것이다.

잘라내기 역시 위와같으나, 버퍼에 옮김후에 원래 내용을 지워주면 해결된다.(간단한 문제임..)

드래그를 통한 객체이동의 경우 조금 귀찮은 방법을 사용해서 구현했다.
객체의 구조체에 처음에 그려진 좌표값이 있고, 드래그중에 이동될 x,y 변화값을 기록을 통해
드래그시에 이값을 참조하여 이동시켜 뿌리면 해결된다.
단 마우스 버튼을 떼는순간 이 값을 적용한 값을 좌표에 기록해주고, 그 이후 이 변화값을 0으로 해주면 말끔하게 드래그를 통한 객체 이동이 구현된다.

워낙 두서없이 글을 써서 정보를 얻을수 있으려나 모르겠지만, 한번쯤 디버깅을 해본 사람이라면
약간의 단서는 제공했으리라 생각된다.
posted by Sense.J
: