Molehill에서 시작하여 Matrix3D를 파악하는 데 많은 어려움을 겪고 있습니다. 첫 번째 문제는 단일 모델의 방향을 설명하는 Matrix3D를 관리하는 방법입니다.X, Y 및 Z 회전을 모델의 로컬 공간 (글로벌이 아닌)에서 결합하는 방법은 무엇입니까?
저는 이것을 수행하기 위해 Matrix3D.appendRotation()을 사용합니다. 그러나 내가 추가하는 순서에 따라 다른 결과를 얻습니다 (분명히, 나는 지구 공간에서 한 번에 하나씩 회전하고 있기 때문에). 이것이 일반적인 문제임을 알고 있습니다. 3D 소프트웨어 모델링으로이 문제를 해결했습니다. 그러나 이번에는 프로그래밍 방식으로 수정해야합니다. 이것이 내가 도움이 필요한 곳입니다.
는 첫째, 경우에 여기 저기, 혼동하다 사진에 문제가 :
1 단계 : 나는 모델을 렌더링합니다.
2a 단계 : 나는 X 축에 회전. 올바른 모양입니다!
2b 단계는 : I는 Z 축에 회전. 올바른 모양입니다! 내가 모델의 X와 Z 축으로 회전하는 경우
그래서 ... 내가 원하는 이 :
그러나, sadface, 내가 얻을이 :
나는 할 수있다 문제를 참조하십시오. 나는 지구 공간에서 한 번에 하나씩 회전을 덧붙이고있다. 객체의 로컬 공간에서 회전해야합니다. 나는 이것을 수행하는 방법이나 내가 무엇을 검색해야하는지에 대한 생각이 없다 (용어 등). 코드는 간단 (잘못된)입니다 : 그 대신 값 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() 메소드를 가지고있는 것으로 보인다. 나는 아직 그것을 얻지 못한다 ... 시행 착오로 몇 시간 동안 나를 구 해주시길 바랍니다!