2011-12-07 5 views
0

내가 내 3D 오브젝트 내 회전에 문제가 (그것은 자바에있어하지만 정말 중요하지 않습니다)일반 간단한 3D 매트릭스 회전 문제

가 배경 :

내가 간단한 3D 모델을 가지고, 당신이 그것을에 첫 번째 사람 플레이어, 당신은 (3 차원의 x 축에 의해 IE 회전)을 찾아 볼 위로 마우스를 이동하고 (반대 방향으로 회전)를 내려다 볼 아래로

을 마우스를 이동하지만 :

왼쪽/오른쪽 화살표 키를 사용하여 왼쪽/오른쪽으로 돌릴 수도 있습니다 (어느 ro x 축에 따라 회전 할 때 더 이상 예상대로 회전하지 않습니다. 예를 들어, 180도 회전하면 마우스를 실제로 움직여 문제가 발생합니다. 마우스를 올리면 실제로 내려다 보입니다.

이것을 해결하기 위해 x/y 축에서 어떤 회전을 수행 할 수 있습니까?

- 아무리 많이 돌리더라도 마우스를 위로 움직이면 아래로 내려다 보입니다.

죄송합니다. 더 설명 할 수 없지만 더 많은 정보가 필요하면 의견을 말하십시오.

덕분에 많이,

그것은 probabaly 간단한 변환하지만 내가 생각할 수 없다 :(

자바 회전 코드의 일부 :

마우스를 위/아래 :

public void rotateXY(double radians, double Yradians) 
    { 
     vpTrans.getTransform(T3D); 
     Transform3D test = new Transform3D(); 
     Transform3D testX = new Transform3D(); 
     Transform3D testY = new Transform3D(); 
     translate.set(lastXcord, lastYcord, lastZcord); 
     testX.rotX(radians); 
     testY.rotY(Yradians); 
     test.mul(testX, testY); 
     test.setTranslation(translate); 
     vpTrans.setTransform(test); 
     //System.out.println(test); 
    } // end of rotateXY() 

왼쪽 : (오른쪽도 비슷하지만 각도 변경시 + 대신 마이너스가 표시됨)

public void run() { 
    Transform3D test = new Transform3D(); 
    Transform3D rotX = new Transform3D(); 
    Transform3D rotY = new Transform3D(); 

    vpTrans.getTransform(T3D); 
    translate.set(lastXcord, lastYcord, lastZcord); 
    angle += 0.05; 
    trueangle += 0.05; 
    rotX.rotX(angle); 
    rotY.rotY(Yangle); 

    test.mul(rotX, rotY); 

    test.setTranslation(translate); 
    vpTrans.setTransform(test); 
} 

어떤 변형/회전을 추가해야합니까? 마우스를 아래로 움직일 때 마우스를 위아래로 움직일 때 내 y 축과 상관없이 카메라가 보입니다.

+0

어느 시점에서 X/Y 축이 설명에 섞여있을 수 있지만 잘하면 아이디어를 얻습니다 !! –

답변

2

변환 순서에 문제가있는 것으로 보입니다. 수치 승산과 달리 matrix multiplication is not commutative. 3D 응용 프로그램은 변환 순서에 매우 민감합니다. 영어

:

x 경우와 y는 숫자, 다음 x * y = y * x

그러나 xy 다음 행렬, x * yy * x 인 경우!

그 점을 염두에두고, 무엇을하고 있는지 살펴 보겠습니다.test.mul(rotX, rotY);

이 곱셈에 무슨 일이 일어나고 있는지 시각화하려면 직선 당신의 머리에서 나오는이 상상한다. 우리는 이것을 LineUp이라고 부를 것입니다. 이제 키보드를 내려다 보면서 LineUp이 당신과 함께 기울어 진다고 상상해보십시오. LineUp에서 머리를 90도 돌립니다. 그것이 회전 매트릭스에 일어나는 일입니다. 미친, 응?

은 이제과 같이 곱셈을 반대하자 : test.mul(rotY, rotX);

그래서 똑바로 앉아서 기대하고 머리/몸/의자를 켭니다. 이제 좀 내려다 봐라. 실제 LineUp 축을 중심으로 회전 한 다음 위/아래 변형을 적용했습니다. 재미 있니?

행렬 변환에 대해 생각해 볼 수있는 가장 좋은 방법은 명령 집합과 같아야한다는 것입니다.

  1. 머리를 오른쪽으로 돌리십시오. (rotY)
  2. 머리를 위로합니다. (rotX) 컴퓨터 (translate)
  3. -
  4. 이동 ... 등

하나의 작업 순서 변경은 재미 있고 터무니없는 방법으로 모든 후속 지침을 변경합니다.

건물은 카메라이므로 reading how to build one을 적극 권장합니다.

행렬 변환을 이해하는 데 훌륭한 운동은 궤도에 진입하는 위성과 회전하는 행성으로 완성되는 태양계를 구축하는 것입니다. 그것은 눈을 뜨고 매우 유익한 것입니다.