2014-11-14 6 views
0

회전 행렬을 사용하여 큐브의 꼭지점을 회전 시키려고하지만 프로그램을 실행할 때마다 큐브가 사라집니다.회전 행렬을 사용하여 큐브의 꼭지점을 회전

저는 큐브의 x 좌표를 회전시키는 강의에서 우리에게 주어진 회전 행렬을 사용하고 있습니다. 나는 그러나 때

glMultMatrixf(); 

을 사용하고 내 키보드

case 't': 
    moveCubeX += 5; 
    break; 

그리고 행렬 곱셈을 할 수의 't'키를 사용하여 moveCubeX 변수에 추가 해요

double moveCubeX = 0; 
float xRotationMatrix[9] = {1, 0, 0, 
          0, cos(moveCubeX), sin(moveCubeX), 
          0, -sin(moveCubeX), cos(moveCubeX) 
}; 

큐브가 실행 중일 때이를 코드에 추가했습니다. 이것은 glMultMatrixf() 함수에서 추가하는 부분입니다.

void display(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 

    gluLookAt(pan, 0, -g_fViewDistance, 
       pan, 0, -1, 
       0, 1, 0); 

    glRotatef(rotate_x, 1.0f, 0.0f, 0.0f); //Rotate the camera 
    glRotatef(rotate_y, 0.0f, 1.0f, 0.0f); //Rotate the camera 

    glMultMatrixf(xRotationMatrix); 

나는 그것이 잘못되었는지 알기 위해 고심하고 있습니다.

답변

3

OpenGL은 크기가 4x4 인 행렬을 사용합니다. 따라서, 귀하의 회전 행렬은 16 개 원소의 총, 4 행 4 열을 확장 할 필요가있다 :

float xRotationMatrix[16] = {1.0f, 0.0f, 0.0f, 0.0f, 
          0.0f, cos(moveCubeX), sin(moveCubeX), 0.0f, 
          0.0f, -sin(moveCubeX), cos(moveCubeX), 0.0f, 
          0.0f, 0.0f, 0.0f, 1.0f}; 

당신은 또한 당신의 각도에 대한 단위에주의해야합니다. 사용자가 키를 누를 때마다 각도에 5을 추가하기 때문에 각도로 생각하는 것처럼 보입니다. C/C++ 라이브러리의 표준 cos()sin() 함수는 각도가 라디안이어야합니다.

또한 매트릭스가 글로벌 수준에서 정의 된 것처럼 보입니다. 이렇게하면 요소는 프로그램 시작시 한 번만 평가됩니다. display()에 로컬로 행렬 정의를 작성해야하므로 그리기 할 때마다 행렬을 다시 평가하거나 각도가 변경 될 때마다 행렬을 업데이트해야합니다.

두 번째 옵션의 경우 각도가 변경 될 때마다 각도에 의존하는 행렬 요소 만 업데이트 할 수 있습니다. moveCubeX을 수정하는 기능에 추가

xRotationMatrix[5] = cos(moveCubeX); 
xRotationMatrix[6] = sin(moveCubeX); 
xRotationMatrix[9] = -sin(moveCubeX); 
xRotationMatrix[10] = cos(moveCubeX); 
+0

내가 원래 회전 행렬에 위키 피 디아를 읽어하여 4 × 4로했고, 어떤 이유로 그것을 변경되었습니다. 어쨌든 좋은 소식은 큐브가 실제로 실행될 때 큐브가 실제로 나타나지만 키를 누를 때 큐브가 움직이지 않는다는 것입니다. 도/라디안에 관해서는 OpenGL이 이것에 따라도를 사용했다는 인상하에 http://stackoverflow.com/questions/2146884/why-does-opengl-use-degrees-instead-of-radians. – JaAnTr

+0

OpenGL이 아닌 C++ 에서처럼도 및 라디안에 대한 의미를 알았습니다. 나는 매번 0.175 라디안을 더할 수 있도록 노력했습니다. 그러나 큐브에 실제로 아무 것도하지 않기 때문에 여전히 작동하지 않습니다. – JaAnTr

+0

@JaAnTr - 각도를 변경할 때마다 행렬의 셀을 한 번만 다시 계산해야합니다. –

관련 문제