Tôi đang đọc cuốn sách "Học lập trình đồ họa 3D hiện đại" trực tuyến của Jason L. McKesson
Đến bây giờ, tôi gặp vấn đề về khóa gimbal và cách giải quyết bằng cách sử dụng tứ phương.
Tuy nhiên ngay tại đây, tại trang Đệ tứ .
Một phần của vấn đề là chúng tôi đang cố gắng lưu trữ một định hướng như một chuỗi gồm 3 vòng quay trục tích lũy. Định hướng là định hướng, không phải xoay. Và định hướng chắc chắn không phải là một loạt các vòng quay. Vì vậy, chúng ta cần coi định hướng của con tàu là một định hướng, như một số lượng cụ thể.
Tôi đoán đây là điểm đầu tiên tôi bắt đầu bối rối, lý do là vì tôi không thấy sự khác biệt đáng kể giữa định hướng và xoay. Tôi cũng không hiểu tại sao một định hướng không thể được biểu diễn bằng một loạt các phép quay ...
Cũng thế:
Ý nghĩ đầu tiên hướng đến kết thúc này sẽ là giữ định hướng như một ma trận. Khi đến lúc phải sửa đổi hướng, chúng ta chỉ cần áp dụng một phép biến đổi cho ma trận này, lưu trữ kết quả làm hướng hiện tại mới.
Điều này có nghĩa là mọi ngáp, cao độ và cuộn được áp dụng cho hướng hiện tại sẽ liên quan đến hướng hiện tại đó. Đó chính xác là những gì chúng ta cần. Nếu người dùng áp dụng một cái ngáp tích cực, bạn muốn cái ngáp đó xoay chúng so với vị trí của chúng hiện tại, không liên quan đến một số hệ tọa độ cố định.
Khái niệm, tôi hiểu, tuy nhiên tôi không hiểu làm thế nào nếu tích lũy các phép biến đổi ma trận là một giải pháp cho vấn đề này, làm thế nào mã được đưa ra trong trang trước không chỉ như vậy.
Đây là mã:
void display()
{
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutil::MatrixStack currMatrix;
currMatrix.Translate(glm::vec3(0.0f, 0.0f, -200.0f));
currMatrix.RotateX(g_angles.fAngleX);
DrawGimbal(currMatrix, GIMBAL_X_AXIS, glm::vec4(0.4f, 0.4f, 1.0f, 1.0f));
currMatrix.RotateY(g_angles.fAngleY);
DrawGimbal(currMatrix, GIMBAL_Y_AXIS, glm::vec4(0.0f, 1.0f, 0.0f, 1.0f));
currMatrix.RotateZ(g_angles.fAngleZ);
DrawGimbal(currMatrix, GIMBAL_Z_AXIS, glm::vec4(1.0f, 0.3f, 0.3f, 1.0f));
glUseProgram(theProgram);
currMatrix.Scale(3.0, 3.0, 3.0);
currMatrix.RotateX(-90);
//Set the base color for this object.
glUniform4f(baseColorUnif, 1.0, 1.0, 1.0, 1.0);
glUniformMatrix4fv(modelToCameraMatrixUnif, 1, GL_FALSE, glm::value_ptr(currMatrix.Top()));
g_pObject->Render("tint");
glUseProgram(0);
glutSwapBuffers();
}
Theo hiểu biết của tôi, không phải những gì anh ta đang làm (sửa đổi ma trận trên ngăn xếp) được coi là ma trận tích lũy, vì tác giả đã kết hợp tất cả các phép biến đổi xoay vòng riêng lẻ thành một ma trận đang được lưu trữ trên đỉnh của ngăn xếp.
Sự hiểu biết của tôi về một ma trận là chúng được sử dụng để lấy một điểm có liên quan đến một điểm gốc (giả sử ... mô hình) và làm cho nó liên quan đến một nguồn gốc khác (máy ảnh). Tôi khá chắc chắn rằng đây là một định nghĩa an toàn, tuy nhiên tôi cảm thấy như thiếu một thứ gì đó đang cản trở tôi hiểu vấn đề khóa gimbal này.
Một điều không có ý nghĩa với tôi là: Nếu một ma trận xác định sự khác biệt tương đối giữa hai "không gian", thì làm thế nào để xoay quanh trục Y, giả sử, cuộn, không đặt điểm vào "không gian cuộn "sau đó có thể được chuyển đổi một lần nữa liên quan đến cuộn này ... Nói cách khác, không nên có bất kỳ biến đổi nào nữa cho đến thời điểm này liên quan đến" không gian cuộn "mới này và do đó không có vòng quay so với trước đó" không gian mô hình "gây ra khóa gimbal.
Đó là lý do tại sao khóa gimbal xảy ra phải không? Đó là bởi vì chúng ta đang xoay đối tượng xung quanh các trục X, Y và Z thay vì xoay đối tượng xung quanh nó, các trục tương đối nó. Hoặc là tôi sai?
Vì rõ ràng mã này tôi đã liên kết không phải là sự tích lũy của các phép biến đổi ma trận, bạn có thể vui lòng cho một ví dụ về giải pháp sử dụng phương pháp này.
Vì vậy, tóm lại:
- Sự khác biệt giữa một vòng quay và một định hướng là gì?
- Tại sao mã được liên kết trong không phải là một ví dụ về tích lũy các phép biến đổi ma trận?
- Mục đích thực sự, cụ thể của ma trận là gì, nếu tôi có sai?
- Làm thế nào một giải pháp cho vấn đề khóa gimbal có thể được thực hiện bằng cách sử dụng tích lũy các phép biến đổi ma trận?
- Ngoài ra, như một phần thưởng: Tại sao các biến đổi sau khi xoay vẫn liên quan đến "không gian mô hình?"
- Một phần thưởng khác: Tôi có sai trong giả định rằng sau khi chuyển đổi, các biến đổi tiếp theo sẽ xảy ra so với hiện tại không?
Ngoài ra, nếu không ngụ ý, tôi đang sử dụng OpenGL, GLSL, C ++ và GLM, vì vậy các ví dụ và giải thích về những điều này được đánh giá rất cao, nếu không cần thiết.
Càng nhiều chi tiết càng tốt!
Cảm ơn trước.