簡體   English   中英

如何獲得QQuickItem的變換矩陣?

[英]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 它不檢查scalerotation屬性。 如果使用它們,則應使用適當的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM