2013-08-28 1 views
3

libGDX (사실 아주 새로 추가되었습니다)와 Android를 사용하고 있습니다. 그리고 나는 그것이 향하는 방향으로 (약간의 속도를 사용하여) 3d 객체를 움직이기를 원합니다. 나는 그것이 기본적인 질문이라고 생각하지만 그것에 대한 직접적인 nswer를 발견 할 수 없다. 개체 회전 (방향)을 나타내는 Quaternion이 있고 개체 위치를 나타내는 Vector3이 있습니다. Quaternion이 나타내는 방향으로 객체를 이동하기 위해 Quaternion의 정보를 사용하여 Vector3 위치를 업데이트하는 방법이 문제입니다. (이에 대한 대안으로 Quaternion에서 roll pitch와 yaw를 추출하고 삼각 함수 계산을 적용하여 새로운 좌표계를 얻는 것입니다. 그러나 Vector3와 Quat를 사용하여이를 달성 할 수있는 방법이 있어야합니다.)Android. (Vector3와 Quaternion을 사용하여) 객체를 향하는 방향으로 이동하는 방법

답변

8

쿼터니언은 회전. 먼저 회전이 적용되지 않을 때 방향을 지정해야합니다. 더 회전이 적용되지 않을 때 예를 들어, 당신은 X 축을 따라 이동하려는 경우 :

Vector3 baseDirection = new Vector3(1,0,0); 

은 기본 방향이 정상화되어 있는지 확인합니다 (길이 = 1), 당신은 안전 할 nor() 방법을 사용할 수 있습니다 :

Vector3 baseDirection = new Vector3(1,0,0).nor(); 

다음으로는 사원 수를 사용하여 방향을 회전해야합니다 :

Vector3 direction = new Vector3(); 
Quaternion rotation = your_quaternion; 
direction.set(baseDirection); 
direction.mul(rotation); 

이제 방향을 가지고, 당신은 당신이 그것을 이동하려는 금액을 확장 할 수 있습니다. 아마 모든 프레임과 마지막 프레임 이후 경과 된 시간에 따라이 작업을 수행하려고 할 것입니다.

translation.set(baseDirection).mul(rotation).scl(speed * Gdx.graphics.getDeltaTime()); 
position.add(translation); 

업데이트 :

final float speed = 5f; // 5 units per second 
Vector3 translation = new Vector3(); 
translation.set(direction); 
translation.scl(speed * Gdx.graphics.getDeltaTime()); 

마지막으로 당신은 예를 들어, 당신이 배치 여러 작업을 할 수있는 실제 구현에 따라 위치 물론

position.add(translation); 

에 번역을 추가해야합니다 : Xoppa의 메모에서 작업 코드 추가 :

translation.set(baseDirection).rot(modelInstance.transform).nor().scl(speed * delta) 
+0

안녕하세요! 대답 해줘서 고마워. 내가 찾고 있었던 것 같아. 그러나 불행히도 예상대로 작동하지 않습니다. 나는 당신의 코드를 그대로 사용했고 이상한 결과를 얻는다. 객체가 오른쪽을 향하기 시작합니다 (X 축). Z 축을 중심으로 35도 회전시킵니다. 개체가 약간 위로 보입니다. 나는 당신의 코드를 적용하고 객체가 오른쪽 위로 움직일 것으로 기대한다. 그러나 그것은 매우 작은 변위로 오른쪽으로 움직입니다. 35 도는 dY/dX = 0.7 (tan (35))을 제공해야합니다. 좀 도와 줄 수있어? – Taras

+0

안녕하세요. Xoppa. 조사가 끝난 후 Quaternion에 문제가 있다는 느낌이 들었습니다. 나는 Rajawali (3d 엔진)에서 같은 장면을 만들었습니다. 같은 35도 회전시킵니다. 자신의 쿼터니언을 코드에 사용했습니다. 그것은 매력처럼 작동합니다. dY/dX = 0.7. 완벽한. 그래서 대답은 정확합니다. 하지만 제가 libgdx에서 얻은 쿼터니언은 잘못되었습니다 (Rajawali에서 나온 것보다 잘못된 값). 그것을 사용하여 얻을 : modelInstance.transform.getRotation (quaternion). 이것이 올바른 방법입니까? – Taras

+1

모델 인스턴스의 크기가 조절 되었습니까? iirc 당신은 Matrix4를 사용하여 Vector3를 직접 회전시킬 수 있으므로 quaternion 'direction.set (baseDirection) .rotate (modelInstance.transform) .nor()'를 건너 뜁니다. 아니면 후자의 방법을 사용한다면 :'translation.set (baseDirection) .rotate (modelInstance.transform) .nor(). scl (speed * delta)'. 'rotate()'메소드에 대해서는 잘 모르겠다.'rot()'(그러나'mul()'이 아니다)라고 할 수있다. – Xoppa

관련 문제