8

Molehill에서 시작하여 Matrix3D를 파악하는 데 많은 어려움을 겪고 있습니다. 첫 번째 문제는 단일 모델의 방향을 설명하는 Matrix3D를 관리하는 방법입니다.X, Y 및 Z 회전을 모델의 로컬 공간 (글로벌이 아닌)에서 결합하는 방법은 무엇입니까?

저는 이것을 수행하기 위해 Matrix3D.appendRotation()을 사용합니다. 그러나 내가 추가하는 순서에 따라 다른 결과를 얻습니다 (분명히, 나는 지구 공간에서 한 번에 하나씩 회전하고 있기 때문에). 이것이 일반적인 문제임을 알고 있습니다. 3D 소프트웨어 모델링으로이 문제를 해결했습니다. 그러나 이번에는 프로그래밍 방식으로 수정해야합니다. 이것이 내가 도움이 필요한 곳입니다.

는 첫째, 경우에 여기 저기, 혼동하다 사진에 문제가 :

1 단계 : 나는 모델을 렌더링합니다.

Start position

2a 단계 : 나는 X 축에 회전. 올바른 모양입니다!

X-axis rotation

2b 단계는 : I는 Z 축에 회전. 올바른 모양입니다! 내가 모델의 X와 Z 축으로 회전하는 경우

Z-axis rotation

그래서 ... 내가 원하는 이 :

desired XZ rotation

그러나, sadface, 내가 얻을이 :

enter image description here

나는 할 수있다 문제를 참조하십시오. 나는 지구 공간에서 한 번에 하나씩 회전을 덧붙이고있다. 객체의 로컬 공간에서 회전해야합니다. 나는 이것을 수행하는 방법이나 내가 무엇을 검색해야하는지에 대한 생각이 없다 (용어 등). 코드는 간단 (잘못된)입니다 : 그 대신 값 Vector3D 축 상수를 사용하는 추측하고

modelLocalMatrix.identity(); 
modelLocalMatrix.appendRotation(modelZRot, Vector3D.Z_AXIS); 
modelLocalMatrix.appendRotation(modelXRot, Vector3D.X_AXIS); 
//eventually y-axis rotation as well... 
renderMatrix.append(modelLocalMatrix); 

, 좀 정규화 된 벡터와를 사용하려면 몇 가지 ... 어, 일 ... modelZRot 대신에 , modelXRot, 그리고 결국 modelYRot. 누구든지 위의 원하는 회전 유형을 적용하기위한 최적의 솔루션이 무엇인지 말해 줄 수 있습니까?

업데이트 : "책"(YouTube의 KhanAcademy라고도 함)을 치고 여기에서이 프레젠테이션을 시작하는 데 하루를 보냈습니다. The Mathematics of the 3d Rotation Matrix 나는 원하는 솔루션에 매우 근접한 일종의 "look at"방법을 발견했습니다. 불행히도, 나는 단지 그것을 이해하는 50 %. 나는 아직도 누군가가이 주제에 대해 밝히기를 희망한다.

var angleOfRotation:Number = Math.PI/2; //90 degrees... 
var axisOfRotation:Vector3D = new Vector3D(0, 1, 0); //some point to look at... 
//normalize the vector! 
axisOfRotation.normalize(); 
var x:Number = axisOfRotation.x; 
var y:Number = axisOfRotation.y; 
var z:Number = axisOfRotation.z; 
var c:Number = Math.cos(angleOfRotation); 
var s:Number = Math.sin(angleOfRotation); 
var t:Number = 1 - c; 

//Graphics Gems (Glassner, Academic Press, 1990). 
modelLocalMatrix = new Matrix3D(new <Number>[ 
    t * (x * x) + c, t * x * y - s * z, t * x * z + s * y, 0, 
    t * x * y + s * z, t * (y * y) + c, t * y * z - s * x, 0, 
    t * x * z - s * y, t * y * z + s * x, t * (z * z) + c, 0, 
    0,   0,   0,   1 
]); 

이것은 다소 지나치게 복잡해 보입니다. 특히 Vector3D의 회전 각도가 네 번째 (w) 값이어야하기 때문에 특히 그렇습니다. 더 중요한 것은, Matrix3D는 이미 lookAt() 메소드를 가지고있는 것으로 보인다. 나는 아직 그것을 얻지 못한다 ... 시행 착오로 몇 시간 동안 나를 구 해주시길 바랍니다!

답변

2

좋아,이 방법을 기본적으로 알아 냈습니다. 내가 만든 것보다 훨씬 더 간단하다. 또한 Matrix3D API를 검토하는 데 도움이되었습니다 (몇 가지 멋진 기능이 있습니다!).

첫째, 소스 나 로컬 축에 내 모델을 회전하는 데 사용되는 코드 : 정규화 된 벡터 내 원래의 링크에서 설명 "밖으로" "위로"

var raw:Vector.<Number> = modelLocalMatrix.rawData; 
var right:Vector3D = new Vector3D(raw[0], raw[1], raw[2]); 
var up:Vector3D = new Vector3D(raw[4], raw[5], raw[6]); 
var out:Vector3D = new Vector3D(raw[8], raw[9], raw[10]); 

modelLocalMatrix.appendRotation(modelXRot, right); 
modelLocalMatrix.appendRotation(modelYRot, up); 
modelLocalMatrix.appendRotation(modelZRot, out); 

, "오른쪽", 및 게시하다. 기본적으로 모델의 피치, 요 및 롤 축입니다. 객체를 초기화 할 때 이러한 벡터는 Vector3D.X_AXIS, Y_AXIS 및 Z_AXIS와 동일합니다. 더 나은 방법이있을 수 있지만 Matrix3D.rawData 속성을 사용하여 추출했습니다.

이제 이러한 축 중 하나를 선택하여 회전 할 수 있지만 실행 즉시 다른 두 축의 방향이 변경됩니다. 이것은 의미가 있습니다. 모델이 회전하고 "오른쪽", "위로"및 "앞으로"는 이제 다릅니다! 따라서 모델의 "오른쪽"축을 회전하여 시작하는 경우 (이것은 글로벌 X_AXIS와 동일하게 시작됩니다) 모델을 "외부"축으로 롤업하려면 모델의 로컬 모델에서 가져와야합니다 매트릭스. 분명히, 그것은 더 이상 글로벌 Z_AXIS와 동일하지 않습니다. Matrix3D.identity()를 호출하지 않습니다. 내가 그랬다면, 내 모델의 축이 재설정 될 것입니다! 내 렌더링 루프에서는 괜찮습니다. 변형 및 회전을 적용하기 전에 모든 행렬을 재설정했기 때문에 코드와 생각을 조금씩 변경해야했습니다. modelXRot, modelYRot 및 modelZRot은 회전 값을도 단위로 저장합니다.

나는 이것이 누군가를 돕기를 바랍니다. 나는 그런 간단한 해결책을 가진 그런 공통적 인 문제가 어디에도 없다고 믿을 수 없다. 어쨌든, 내가 원하는대로하고있는 것 같습니다.