2017-11-04 5 views
1

키를 사용하여 큐브를 회전하고 싶습니다. 이것은 코드의 일부입니다. LEFT 키를 누르면 큐브가 왼쪽으로 회전합니다. 내 목표는 큐브를 모두 회전시키는 것이므로 xy 축으로 회전시켜야 문제가 발생합니다.키를 사용하여 개체 회전

mat4 rotation;을 정의했으며 키를 길게 누르면 회전이 지정되었습니다. 제가 열쇠를 잡고 있으면, 예를 들어 왼쪽으로 돌고 있습니다. 그런 다음 키를 놓으면 객체가 초기 위치로 돌아옵니다 (객체는 움직이지 않기 때문에 초기 위치로 돌아옵니다). 나는이 문제가 키 기능 아래에 정의 된 auto rotateMat = rotation; 행을 야기한다고 생각한다. 내가 뭘 잘못하고 있니?

mat4 rotation; //global 

    if(keysPressed[GLFW_KEY_LEFT]){ 
       timer -= delta; 
       rotation = rotate(mat4{}, timer * 0.5f, {0, 1, 0}); 
    } 

    if(keysPressed[GLFW_KEY_RIGHT]){ 
       timer += delta; 
       rotation = rotate(mat4{}, timer * 0.5f, {0, 1, 0}); 
    } 

    if(keysPressed[GLFW_KEY_UP]){ 
       timer += delta; 
       rotation = rotate(mat4{}, timer * 0.5f, {1, 0, 0}); 
    } 

    if(keysPressed[GLFW_KEY_DOWN]){ 
       timer -= delta; 
       rotation = rotate(mat4{}, timer * 0.5f, {1, 0, 0}); 
    } 

    ... 
    program.setUniform("ModelMatrix", rotation* cubeMat); 
    cube.render(); 

UPDATE : I 글로벌 변수, 로컬하지 행렬 변수를 사용하는 경우에 따라서이 문제가 해결되었다

.

+0

키를 누르지 않으면 회전이 단위 행렬이됩니다. 그래서 예, 단위 행렬로 rotateMat를 오버라이드하면 큐브가 원래 위치로 돌아갑니다. – BDL

+0

@BDL 어떻게'rotateMat'을 무시할 수 있습니까? 나는 rotateMat에'rotation'을 할당했을 때 마지막 위치를 기억할 것이라고 생각했습니다. – Ady96

+0

예를 들어 if의 상대 회전을 계산하여 현재 행렬에 곱할 수 있습니다. – BDL

답변

0

이러한 상호 작용을 구현하는 방법은 여러 가지가 있습니다. 쉬운 것 중 하나는 대신 글로벌 한 모든 프레임에서 상대 번역을 생성하고 현재 회전에 추가하는 것입니다이를 위해

, 하나는 글로벌 varialbe의 모든 회전의 합을 저장하는

//Global variable 
mat4 total_rotate; 

그리고 매 프레임마다 상대적 번역을 계산 :

//In the function 
mat4 rotation; 

if(keysPressed[GLFW_KEY_LEFT]){ 
      rotation = rotate(mat4{}, delta, {0, 1, 0}); 
} 

if(keysPressed[GLFW_KEY_RIGHT]){ 
      rotation = rotate(mat4{}, -delta, {0, 1, 0}); 
} 

if(keysPressed[GLFW_KEY_UP]){ 
      rotation = rotate(mat4{}, delta, {1, 0, 0}); 
} 

if(keysPressed[GLFW_KEY_DOWN]){ 
      rotation = rotate(mat4{}, -delta, {1, 0, 0}); 
} 

total_rotate = total_rotate * rotation; 
... 
program.setUniform("ModelMatrix", total_rotate * cubeMat); 
cube.render(); 

대안으로, 당신은 두 개의 회전 대신 각 저장하고 모든 프레임에서 행렬을 계산할 수 :

//Global variables 
float rot_x = 0.0f, rot_y = 0.0f; 

//In every frame  
if(keysPressed[GLFW_KEY_LEFT]){ 
      rot_x += delta; 
} 

if(keysPressed[GLFW_KEY_RIGHT]){ 
      rot_x -= delta; 
} 

//Same for y 

auto rotation = rotate(rotate(mat4{}, rot_y, {0, 1, 0}), rot_x, {1, 0, 0} 
... 
program.setUniform("ModelMatrix", rotation * cubeMat); 
cube.render(); 
+0

첫 번째 해결책은 나를 위해 작동하지 않습니다. 그것은 초기 위치로 돌아옵니다. – Ady96

+0

'total_rotate'을 전역 변수로 선언 했습니까? total_rotate를 무시하거나 다시 설정하지 않으면 다시 돌아 가지 않아야합니다. – BDL

+0

그것은'onIdle() override '함수에 있지만 재설정해서는 안됩니다. 두 번째 해결 방법은 회전시키고 자하지만, 움직이지 않는 무언가가 움직임을 막고 있습니다. 그래서 키를 눌러 이동할 때 초기 위치에서 "떨리는"것입니다. – Ady96

관련 문제