2014-09-18 21 views
8

Tôi cần thao tác các mục QML thông qua QMatrix4x4, để áp dụng một số phép biến đổi phối cảnh. Về cơ bản, tôi định nghĩa lớp Transform để sử dụng một QMatrix4x4 đối tượng như là đối số cho chuyển đổi lĩnh vực QML mụcMa trận biến đổi Qt

class Transform : public QQuickTransform{ 
Q_OBJECT 

Q_PROPERTY(QMatrix4x4 matrix READ matrix WRITE setMatrix NOTIFY matrixChanged) 

public: 
explicit Transform(QQuickItem *parent = 0); 

QMatrix4x4 matrix() const; 
void setMatrix(QMatrix4x4 matrix); 

virtual void applyTo(QMatrix4x4 *matrix) const; 

signals: 
     void matrixChanged(); 

private: 
     QMatrix4x4 m_matrix; 

}; 

nơi

void Transform::applyTo(QMatrix4x4 *matrix) const { 
     *matrix *= m_matrix; 
     matrix->optimize(); 
} 

Tuy nhiên, có vẻ như QML không "xác định" các ma trận phối cảnh theo cách cổ điển. Tôi đã tập trung các bài kiểm tra của mình chủ yếu vào các phép quay (http://en.wikipedia.org/wiki/Rotation_matrix). Hãy nói rằng tôi có một QML Item trong x: 200, y: 200 và tôi áp dụng các thay đổi

transform: [Transform{matrix:mytra},Rotation { axis { x: 1; y: 0; z: 0 } angle: 90 } ] 

nơi mytra là nhận dạng ma trận. Phương pháp applyTo() nhận được (xoay) ma trận

 1 -0.195312   0  200   
    0 -0.195312   0  200   
    0   0   1   0   
    0 -0.000976562   0   1 

nhưng "cổ điển" một nên

 1 0   0  200   
    0 0  -1  200   
    0 1   0   0   
    0 0   0   1 

Tôi không hiểu nơi ma trận này đến từ và làm thế nào để thích nghi với ma trận của tôi để qt. Cảm ơn sự giúp đỡ.

Trả lời

13

Qt toán đang hoạt động đúng, nhưng khung tham chiếu mà Qt đang sử dụng không khớp với những gì bạn đang nghĩ.

Matrix Math:

enter image description here

Vì vậy, các thành phần bạn đang nhìn thấy trong toán học được thêm cắt theo trục x và y của hình ảnh.

Nhưng xoay mà Qt thực hiện là về một trong các trục đó. Vì vậy, nếu bạn muốn quay 2D chuẩn, mà không cắt, bạn cần hoặc không chỉ định trục hoặc bạn chỉ định trục z.

Trục xoay xung quanh. Đối với xoay vòng đơn giản (2D) quanh một điểm, bạn không cần chỉ định trục, vì trục mặc định là trục z (axis { x: 0; y: 0; z: 1 }).

http://qt-project.org/doc/qt-5/qml-qtquick-rotation.html

Vòng xoay quanh trục y trông như thế này:

enter image description here

Hy vọng rằng sẽ giúp.

+0

Cảm ơn ... tuy nhiên tôi không hiểu điểm ma trận 4x4 là gì. Có phải quản lý tọa độ z không? – lorenzolightsgdwarf

+2

Có. Một ma trận 3x3 có thể theo dõi các phép quay trong x và y và các bản dịch (pos) và tỷ lệ trong x và y. Ma trận 4x4 có thể theo dõi các phép quay x, y và z, tỷ lệ và bản dịch (còn gọi là vị trí hoặc vị trí). Robotics sử dụng ma trận 4x4 rất nhiều. Dựng hình 3D trên cạc đồ họa cũng sử dụng ma trận 4x4. Nếu bạn nhìn vào OpenGL, nó sử dụng nó khắp nơi. – phyatt

+0

Làm cách nào để dịch Hình chữ nhật QML dọc theo trục Z? – trusktr

Các vấn đề liên quan