Tôi đang bắt đầu trên Molehill và đang gặp rất nhiều vấn đề khi nắm bắt Matrix3D. Vấn đề đầu tiên của tôi là làm thế nào để quản lý một Matrix3D mô tả định hướng của một mô hình duy nhất.Làm thế nào để bạn kết hợp các phép quay X, Y và Z trong không gian cục bộ của mô hình (không phải toàn cục)?
Tôi sử dụng Matrix3D.appendRotation() để thực hiện việc này. Nhưng tùy thuộc vào thứ tự tôi gắn thêm vào tôi nhận được một kết quả khác nhau (rõ ràng, vì tôi đang luân phiên một lần trong không gian toàn cầu). Tôi biết đây là một vấn đề phổ biến, tôi đã chạy vào nó với mô hình phần mềm 3D. Nhưng lần này, tôi phải sửa nó theo chương trình. Đây là nơi tôi cần giúp đỡ.
Trước tiên, trong trường hợp có bất kỳ sự nhầm lẫn nào, đây là sự cố trong ảnh:
Bước 1: Tôi vẽ mô hình.
Bước 2a: Tôi xoay nó trên trục X. Có vẻ chính xác!
Bước 2b: Tôi xoay nó trên trục Z. Có vẻ chính xác!
Vì vậy, ... nếu tôi xoay trên trục X và Z của mô hình tôi muốn này:
Nhưng, sadface, tôi có được điều này:
Tôi có thể xem sự cố. Tôi đang nối từng vòng một vào không gian toàn cầu. Tôi cần phải xoay trong không gian địa phương của đối tượng. Tôi KHÔNG có ý tưởng làm thế nào để làm điều này hoặc những gì tôi thậm chí nên tìm kiếm (thuật ngữ, vv). Mã này là đơn giản (và sai):
modelLocalMatrix.identity();
modelLocalMatrix.appendRotation(modelZRot, Vector3D.Z_AXIS);
modelLocalMatrix.appendRotation(modelXRot, Vector3D.X_AXIS);
//eventually y-axis rotation as well...
renderMatrix.append(modelLocalMatrix);
Tôi đoán rằng thay vì sử dụng các hằng số trục Vector3D, tôi muốn sử dụng một số vector bình thường và một số ... uh, điều ... ở vị trí của modelZRot , modelXRot và cuối cùng là modelYRot. Bất cứ ai có thể cho tôi biết giải pháp thực hành tốt nhất là áp dụng loại xoay vòng mong muốn ở trên?
CẬP NHẬT: Đã dành cả ngày đánh "sách" (aka KhanAcademy trên YouTube) và bắt đầu bản trình bày này tại đây: The Mathematics of the 3d Rotation Matrix Tôi đã tình cờ gặp một loại phương pháp "nhìn vào" rất gần với giải pháp mong muốn của tôi. Thật không may, tôi chỉ có 50% hiểu nó. Tôi vẫn hy vọng ai đó có thể làm sáng tỏ chủ đề này!
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
]);
Thing là, điều này có vẻ khá phức tạp. Đặc biệt là vì góc quay cho một Vector3D nên là giá trị thứ tư (w). Quan trọng hơn, Matrix3D đã xuất hiện để có một phương thức lookAt(). Tôi chưa hiểu ... hãy nhờ ai đó cứu tôi khỏi những giờ thử và lỗi!