◼️OpenGL
[OpenGL] 모델의 특정축을 고정하여 회전
회전 방식 1) 고정된 물체의 축을 전역 좌표의 z축과 동일하게 만든다.(x축회전(alpha만큼), y축회전(beta만큼)) 2) z축에 대해 원하는 만큼 회전 3) 거꾸로 회전시켜 제자리로 복귀한다. (y축회전(-beta 만큼), x축회전(-alpha 만큼)) /*원하는 모델 축을 전역좌표계의 z축과 동일하게 만들기 위한 x축 회전각, y축 회전각을 구한다.*/ //x축 alpha 회전, y->0// alpha = atan2(y, z); //물체의 x축을 alpha 만큼 회전시킨다.// x1 = x; y1 = y * cos(alpha) - z * sin(alpha); z1 = y * sin(alpha) + z * cos(alpha); //y축 beta 회전, x->0// beta = atan2(-x1,..
[OpenGL] 도형 선택해서 값 읽어오기
Issue 도형을 마우스로 클릭하고 어떤 도형을 클릭했는지 값을 알아오고 싶었다. 스크린에 물체를 그릴 때 Projection 모드에서 glOrtho로 물체의 투영 영역을 지정하게되면 피킹값을 잘 받아오지 못했다. Solution 마우스로 클릭한 영역을 얻기위한 GL_SELECT 모드에서 물체가 그려지는 투영값을 동일하게 설정해서 물체를 그리게 된다. 이때 GL_SELECT 모드를 위한 투영값 설정과 그림을 그릴 때 적용하는 투영값 설정이 이중으로 적용된 것이 문제였다. 그래서 Picking을 확인할 때는 그림을 그릴때 투영값을 설정하지 못하도록 했다. void MyView::drawModel(){ //물체를 그리는 함수 if(!pickMode){ //pick할 때는 적용하면 안된다.(pick자체에서 적..
[OpenGL] 투명 도형 그리기
glEnable(GL_BLEND); //투명을 사용하기 위한 설정 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor4f(0.0f, 0.0f, 0.0f, 0.0f); //투명색 glBegin(GL_POLYGON); glVertex3f(0, 0, 0); glVertex3f(0, 10, 0); glVertex3f(10,10, 0); glVertex3f(10, 0, 0); glEnd(); glDisable(GL_BLEND);
[OpenGL] 종횡비 조절 및 물체 형태가 변하지 않게 평행이동
Issue 1. 물체 종횡비 유지 OpenGL에서 물체를 그릴 때 창의 크기가 바뀌면 물체의 크기가 그에 맞춰 변형이 된다. 창의 크기에 종속되지 않고 물체의 비율을 유지하기 위해서는 변경되는 창의 종횡비에 맞춰서 물체의 종횡비를 설정해줘야한다. Issue 2. 물체 형태가 변하지 않게 평행이동 물체를 평행이동하기 위해서는 OpenGL에서 Translate함수를 사용한다. 물체를 중앙에서 옆으로 이동시키면 이때 관찰자는 그자리 그대로 서서 이동한 물체의 중심을 보기 때문에 물체의 측면을 보게된다. 그러나 보이는 형태가 바뀌지 않게 물체를 옆으로 이동시키고 싶다. 이를 위해 물체를 그릴 좌표 영역을 옆으로 이동시키면 해결된다. Solution 종횡비 유지와 형태가 변하지않게 평행이동하기 위해서 glOrth..
MFC 마우스 이동으로 OpenGL 화면 회전 값 받기
마우스가 눌러진 후에 마우스를 움직이면 회전값을 올리는 코드이다. void MyView::OnMouseMove(UINT nFlags, CPoint point) { xAngle += (point.y-mouseDownPt.y) / 3.6; yAngle += (point.x-mouseDownPt.x) / 3.6; mouseDownPt = point; } 위의 계산 공식에서 3.6을 나눠주는 이유? 마우스를 1 픽셀 이동했을 경우 1/3.6 회전, 즉 0.27777778도 회전하게 되는데, 이 회전량이 사용자가 가장 자연스럽게 느껴지므로 3.6으로 나눴다. 좀더 회전정도를 강하게 하고 싶다면 이 값을 줄이면 회전이 팍팍!! 되도록 할 수 있다. [출처] http://www.gisdeveloper.co.kr/?p..
OpenGL x, y, z축 회전 후 좌표값 구하기
X축 회전 x = x; y = y*cos(angle) - z*sin(angle); z = y*sin(angle) + z*cos(angle); Y축 회전 x = x*cos(angle) + z*sin(angle); y = y; z= -x*sin(angle) + z*cos(angle); Z축 회전 x = x*cos(angle) - y*sin(angle); y= x*sin(angle) + y*cos(angle); z = z; [다음 링크의 회전 메트릭스 참고] https://www.charlezz.com/?p=934

OpenGL gluLookAt 카메라 회전 적용 (구에서 점의 회전 좌표 구하기)
구에서 x,y,축회전했을 때의 좌표 α : y 회전 값, β : x 회전 값 이라고 했을 때 점P의 좌표값은 P (d cosα cosβ, d sinα, d cosα sinβ) 이다. 원리는 아래 이미지를 참고하면 이해가 될 것입니다. 선분 OB의 값: d cosα B (d cosα cosβ, 0, d cosα sinβ) 가 된다. P의 y좌표: d sinα P (d cosα cosβ, d sinα, d cosα sinβ) α : y 회전 값, β : x 회전 값 OpenGL 시점 좌표계 설정에 구의 회전 좌표 적용! 시점 좌표계설정 GLU함수: gluLookAt(eyex,eyey,eyez, atx,aty,atz, upx, upy, upz) eyex, eyey, eyez: 카메라의 원점, 카메라의 위치 a..