![](/img/trans.png)
[英]How can I get access to object of `QQmlApplicationEngine` inside a `QQuickItem` derived class?
[英]How can I get transform matrix for QQuickItem?
我用QGraphicsItem
工作了很長時間,它有transform()
函數。 現在我不會對QQuickItem
做同樣的事情,但不幸的是它錯過了transform()
。 所以我的問題 - 如何獲得QQuickItem
變換矩陣?
實際上, QQuickItem
提供了transform()
方法,但它返回分配給給定項的所有轉換的列表。 這是因為可以將多個轉換分配給單個Item
。 QQuickItem::transform
的返回類型是QQmlListProperty<QQuickTransform>
- 它是QML list<Transform>
類型的包裝器(參見Item的文檔 )。 它可以迭代,產生QQuickTransform *
元素。 QQuickTransform
是轉換的基類,它提供虛擬方法applyTo
獲取QMatrix4x4 *
參數並在其上應用轉換。
QML允許實例化幾個QQuickTransform
子類(用於轉換,旋轉和縮放),並允許用戶定義自定義轉換(例如,用於偏斜)。
要獲得所需的單個轉換矩陣,必須從單位矩陣開始,然后依次應用給定QQuickItem
所有轉換。
QMatrix4x4 transformOfItem(QQuickItem *item) { QQmlListProperty transformations = item->transform(); const int count = transformations.count(&transformations); // Prepare result structure, it will be default-initialized to be an identity matrix QMatrix4x4 transformMatrix; // Apply sequentially all transformation from the item for(int i = 0; i applyTo(&transformMatrix); } return transformMatrix; }
請注意,該函數返回一個轉換矩陣作為QMatrix4x4
- 它不僅僅是基於3x3轉換矩陣的舊QTransform
,因此無法在沒有丟失的情況下進行轉換。 如果需要,可以使用QMatrix4x4::toAffine
獲取QMatrix
(3x3)並使用它來創建QTransform
對象。 但是,如果您的QQuickItem
轉換包含非QQuickItem
元素,它們將丟失。
還有一點需要注意:我發布的方法僅適用於通過賦值transform
屬性定義的transform
。 它不檢查scale
和rotation
屬性。 如果使用它們,則應使用適當的QQuickItem
方法檢查其值,並調整返回的矩陣以包含這兩個額外的轉換。
QSGTransformNode類在場景圖中實現轉換。 在updatePaintNode
函數中,參數updatePaintNodeData
提供指向與此QQuickItem
關聯的QSGTransformNode
的指針。
QSGNode *MyQuickItem::updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *data)
{
QSGTransformNode *transformNode = data->transformNode;
qDebug() << transformNode->matrix();
這是一個正確的解決方案,基於Michael之前提供的代碼,但實際上已經修復了,所以你不必花費20分鍾來弄清楚如何使用QQmlListProperty
QMatrix4x4 YourQQuickItem::get_model_matrix() {
QMatrix4x4 result;
// Compose model matrix from our transform properties in the QML
QQmlListProperty<QQuickTransform> transformations = transform();
const int count = transformations.count(&transformations);
for (int i=0; i<count; i++) {
QQuickTransform *transform = transformations.at(&transformations, i);
transform->applyTo(&result);
}
return result;
}
在我的用例中,我使用它來獲取我的對象的模型矩陣,然后與視圖和投影矩陣相乘以計算模型 - 視圖 - 投影矩陣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.