버그 해결을 위한 모든 질문을 던져
+1 vote
95 views
안녕하세요.
OpenGL 을 공부중인 초심자입니다.

어디다 질문할데는 없고.. 정말 난감한 상황에 올려봅니다.

제가 아래와 같이 OpenGL 에서 pivot 포인트를 변경하여 해당 위치를 기준으로 회전을 시키는 코드를 작성중입니다.
해당 짤막한 코드는 다음과 같습니다.

float ratio = (float)width / (float)height;
glm::mat4 projection = glm::ortho(-ratio, ratio, -1.0f, 1.0f, -100.0f, 100.0f);

glm::mat4 model = glm::mat4(1.0);
model = glm::translate(model, _pivot);
model = glm::translate(model, glm::vec3(_trans_x, _trans_y, 0.0f));
model = glm::scale(model, glm::vec3(_zoom, _zoom, _zoom));
model = model * _rotation;
model = glm::translate(model, -_pivot);

glm::mat4 view = glm::lookAt(
glm::vec3(0, 0, 0.0f), // Camera position is at (0,0,_zoom), in world space
glm::vec3(0, 0, -1.0f), // and looks at the origin
glm::vec3(0,1,0) // Head is up (set to 0,-1,0 to look upside-down)
);

glm::mat4 MV = view * model;

glMatrixMode(GL_PROJECTION);
glLoadMatrixf(glm::value_ptr(projection));

glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(glm::value_ptr(MV));

해당 _pivot 변수는 마우스를 클릭시 해당 view 메트릭스의 방향으로 ray intersection 을 수행해서 가장 가까운 지점을 찾아낸 지점입니다.
찾아낸 지점을 기준으로 rotation 은 잘 됩니다..
하지만 _pivot 포인트를 변경시 카메라가 움직이는듯합니다.
아래 캡쳐 동영상을 올려 보았습니다.

http://archive.tcltk.co.kr/tmp/reproduce.mp4

해당 동영상을 보시면.. 변경된 _pivot 포인트 위치로 카메라의 중심점? 이 이동하는듯 합니다.
이 문제를 수정할려면 어떻게 해야할지.. 조언좀 부탁드립니다.
거의 2-3주째 이걸 해결 못하니.. 답답한 마음에 이렇게 실례를 무릎쓰고 올려봅니다.

감사합니다.
asked (3 point)
수정됨 , 95 views
링크가 짤린거 같습니다ㅠ

----수정---

 url의 앞부분으로 타고 들어가서 직접 경로를 찾으니 나오네요
링크 수정했습니다. ^^

1 답변

0 votes
아래 부분이 이해가 잘 가지 않습니다. _trans_x, _trans_y를 이용해서 한번 더 이동시키는데 이 변수에 할당된 값은 무엇이며 이렇게 이동해야 하는 이유가 궁금하군요.

model = glm::translate(model, _pivot);
model = glm::translate(model, glm::vec3(_trans_x, _trans_y, 0.0f));
answered (186 point)
_trans_x, _trans_y 는 이동한 모델의 world 좌표입니다.

예를들어 현재는 Ctrl+마우스 오른쪽 버튼으로 드래그를 하면 모델이 이동합니다.
제시된 코드만 가지고는 무엇이 원인인지 잘 모르겠군요.. _trans_x, _trans_y값이 피봇설정과 함께 변경된다거나 하는 상황이 아니라면 저도 잘 모르겠네요..

http://archive.tcltk.co.kr/tmp/Main.cpp

이곳에 코드를 올려두었습니다.

죄송하지만 확인 부탁드려도 될런지요? ^^

여유가 나는대로 확인해 보겠습니다.. 근데 제가 OpenGl은 잘 몰라서 큰 기대는 안하시는게..ㅠ

음.. 올려주신 소스코드는 질문에서 올려주신것과 다르게 카메라의 위치와 바라보는 위치를 _hit_x, _hit_y. 즉 pivot에 할당되는 값을 이용해서 설정해 주고 있는 것 같습니다. 제가 잘못 보고 있는 건가요?

// Camera matrix
glm::mat4 view = glm::lookAt(
	glm::vec3(_hit_x, _hit_y, 0.0f), // Camera position is at (0,0,_zoom), in world space
	glm::vec3(_hit_x, _hit_y, -1.0f), // and looks at the origin
	glm::vec3(0, 1, 0)  // Head is up (set to 0,-1,0 to look upside-down)
	);

 

이 부분은 모델의 중심 x, y 를 바라보게해도 동일하더군요.

저 부분은 _cg[0], _cg[1] 로 보시면 될 것 같습니다. ㅠㅠ

감사합니다.

하지만 _hit_x와 _hit_y 는 루프가 진행되는 과정에서 마우스 입력을 통해서 갱신되는 것 같은데요?

			_hit_x = shortIntersectPoint[0];
			_hit_y = shortIntersectPoint[1];
			_hit_z = shortIntersectPoint[2];

를 보시면 여기서 갱신되고 맨 처음에만 cg[0], cg[1]로 초기화 될 뿐인듯합니다.

해당 코드를 다시 업데이트 했습니다.

제가 오해를 드린것 같네요. ^^

http://archive.tcltk.co.kr/tmp/Main.cpp

매트릭스는 어렵습니다. ㅠ

음.. 어떻게 달라졌는지는 잘 모르겠습니다만 여전히 _hit_x, _hit_y를 이용해서 카메라의 위치를 설정하고 있는것은 같은것 같은데요.

혹시 그부분을 질문에서 올려주신것처럼 0으로 넣고 테스트 해보시겠어요?

// Camera matrix
glm::mat4 view       = glm::lookAt(
	glm::vec3(0, 0, 0.0f), // Camera position is at (0,0,_zoom), in world space
	glm::vec3(0, 0, -1.0f), // and looks at the origin
	glm::vec3(0,1,0)  // Head is up (set to 0,-1,0 to look upside-down)
);

이렇게요.

만약 메시의 중점을 잡아주고 싶으신 거라면 _cg[0], _cg[1] 로 바꾸셔도 좋을것 같아요

버그 해결을 위해 도움을 구하고, 도움을 주세요. 우리는 그렇게 발전합니다.

throw bug 는 프로그래밍에 대한 전분야를 다룹니다. 질문,논의거리,팁,정보공유 모든 것이 가능합니다. 프로그래밍과 관련이 없는 내용은 환영받지 못합니다.

126 질문
221 answers
253 댓글
245 users