超碰91资源站-超碰97豆花-超碰97人妻-超碰97人人干-超碰97人人香蕉-超碰97天天操-超碰97在线资源站-超碰97资源站共享-超碰97资源站总站-超碰aa在线91-超碰av操-超碰爱爱

半岛外围网上直营

3D模型格式轉換工具HOOPS Exchange如何檢索可視化工作流的圖形數(shù)據(jù)?

原創(chuàng)|行業(yè)資訊|編輯:吳秋紅|2023-11-24 11:53:00.230|閱讀 97 次

概述:本教程將說明如何使用 HOOPS Exchange 檢索可視化工作流的圖形數(shù)據(jù)。完成本教程后,您將對 HOOPS Exchange 如何提供對零件三角形網格的訪問、如何在 3D 空間中正確定位以及如何確定每個零件的基本顏色有一個基本的了解。

# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>

相關鏈接:

HOOPS Exchange是什么?

 是一組軟件庫,可以幫助開發(fā)人員在開發(fā)應用程序時讀取和寫入主流的 2D 和 3D 格式。HOOPS Exchange 支持在主流的3D 文件格式中讀取 CAD 數(shù)據(jù),并支持將 3D 數(shù)據(jù)轉換為 PRC 數(shù)據(jù)格式,這是一種高度可壓縮和開放的文件格式,并已通過國際標準化組織 (ISO 14739-1:2014) 的認證。PRC 也是 Adobe PDF 中用于 3D 的格式之一。HOOPS Exchange 持續(xù)優(yōu)化讀取各種 3D 數(shù)據(jù)的功能,尤其是對于來自計算機輔助設計 (CAD) 系統(tǒng)的數(shù)據(jù)。

       

本章我們學習創(chuàng)建一個使用 加載文件并使用 Qt3D 將其可視化的跨平臺應用程序。

介紹
本教程將向大家說明如何使用 檢索可視化工作流的圖形數(shù)據(jù)。學習完本教程后,您將對 HOOPS Exchange 如何提供對零件三角形網格的訪問、如何在 3D 空間中正確定位它們以及如何確定每個零件的基本顏色有一個基本的了解。
本教程有一些先決條件。首先,您應該已經完成了“打印裝配結構”教程,該教程涵蓋了文件加載和數(shù)據(jù)檢索等幾個基本概念,這些話題在此不再贅述。
HOOPS Exchange 是一個支持 Windows、macOS 和 Linux 的 SDK。我們將使用最流行的跨平臺 GUI 工具包 Qt,具體來說,我們將依賴 Qt3D 來實現(xiàn)跨平臺的圖形功能。我們將盡一切努力將工具包所需的專業(yè)知識降至最低,但是,您必須在計算機上安裝 Qt 6才能完成本教程。
像許多跨平臺開發(fā)社區(qū)一樣,Qt 已經開始向使用 CMake 作為默認構建系統(tǒng)的方向遷移。可以在此處找到有關使用 CMake 構建 Qt 應用程序的信息。本教程包括基于這些概念的完整 CMakeLists.txt 文件。Qt 的最新發(fā)行版包括 bin/qt-cmake,如果您尚未安裝 CMake,則可以使用它們。
不需要深入了解 Qt 和 CMake,但兩者都必須安裝并準備好使用。
第 0 步:項目設置
克隆項目
我們提供了一個 git 存儲庫來支持本教程。克隆主分支以建立項目的起點。
git 克隆 //github.com/techsoft3d/he_qt_basic_view.git
配置
使用您喜歡的文本編輯器打開文件CMakeLists.txt。在文件的頂部,您將看到HOOPS_EXCHANGE_DIR已設置變量。更新分配給此變量的值以反映您的特定安裝位置。
建造
由于本教程的目標是提供對 HOOPS Exchange 的理解,因此我們不會花太多時間在如何構建和運行 Qt 應用程序或 IDE 選擇和配置的主題上。但以防萬一您不熟悉它是如何完成的,我們將在此處提供一些提示。
視覺工作室代碼
Visual Studio Code 是跨平臺開發(fā)的絕佳選擇。它支持 C/C++ 開發(fā)和 CMake 作為構建配置系統(tǒng)。Microsoft在此處提供了此用例的出色概述。
編輯文件 _.vscode/settings.json_ 并更新 Qt 路徑以反映您本地安裝的 Qt。安裝 CMake Tools 擴展后,您可以使用狀態(tài)欄上的按鈕來配置、構建和運行應用程序。
Windows 上的 Visual C++
打開 Visual Studio 命令提示符并執(zhí)行位于 Qt 安裝的 bin 文件夾中的 qtenv2.bat。接下來,在項目目錄中創(chuàng)建一個名為build的子文件夾并更改為它。運行qt-cmake ..以生成所需的文件。這將創(chuàng)建qt_he_viewer.sln,您可以使用命令evenv qt_he_viewer.sln 打開它。
開始運作
構建項目后,您就可以運行應用程序了。當您運行二進制文件時,您將看到一個標準的文件打開對話框。對話框的默認位置是包含 HOOPS Exchange 附帶的示例數(shù)據(jù)的文件夾。導航到 PRC 子文件夾并選擇helloworld.prc。該文件加載迅速,并出現(xiàn)空的 3D 視圖。
查看main.cpp的實現(xiàn)以熟悉程序流程。您會注意到 HOOPS Exchange 已初始化,并提示用戶輸入一個輸入文件,然后加載該文件。加載文件后,代碼繼續(xù)調用createScene,配置視圖、相機和光源。
我們將從創(chuàng)建場景開始,以一種有點抽象的方式。
第 1 步:創(chuàng)建場景
要創(chuàng)建場景,我們必須實現(xiàn)Scene.cppcreateScene中定義的函數(shù)。在編輯器中打開文件。你會注意到它被存根返回一個空對象。
在 HOOPS Exchange 數(shù)據(jù)模型中,曲面細分存在于表示項級別。這意味著我們將需要實現(xiàn)遍歷裝配結構、輸入每個零件定義并提取其中包含的表示項的功能。對于我們遇到的每個表示項目,我們需要做一些事情:
  1. 確定是否應顯示表示項。
  2. 生成我們可以輕松渲染的細分數(shù)據(jù)。
  3. Qt3D從 細分創(chuàng)建網格。
  4. Qt3D從HOOPS Exchange 樣式定義創(chuàng)建材質。
  5. Qt3D從世界位置創(chuàng)建一個變換。
我們剛剛列出的所有功能都已在您克隆的項目中被刪除,因此我們可以編寫完整的 createScene 主體,而無需過多關注每個步驟的實現(xiàn)方式。
首先,我們將聲明并初始化一個結構來控制如何為表示項生成鑲嵌。創(chuàng)建后添加以下代碼行rootEntity.
// 創(chuàng)建曲面細分參數(shù)來控制行為
A3DRWParamsTessellationData tess_params;
A3D_INITIALIZE_DATA(A3DRWParamsTessellationData, tess_params);
// 使用“預設”選項獲得中等詳細程度
tess_params.m_eTessellationLevelOfDetail = kA3DTessLODMedium;
為簡單起見,我們在 options 結構中使用詳細級別枚舉,它控制一組特定的細分選項。這適用于基本的查看工作流程。我們將很快使用這個選項對象。
forEach_RepresentationItem接下來,我們將使用稍后實現(xiàn)的函數(shù)來迭代每個表示項。現(xiàn)在,讓我們假設它存在并且做我們想做的事——也就是說,它遍歷裝配結構,并且對于它遇到的每個零件,它都提取表示項。對于每個表示項,調用提供的 lambda。設置細分參數(shù)后添加以下代碼行。
// 遍歷每個表示項
forEach_RepresentationItem(model_file, [&](EntityArray const &path) {
});
lambda 的參數(shù)是 an EntityArray,,它是 的類型別名QVector<A3DEntity*>。它包含指向程序集層次結構中每個節(jié)點的有序指針列表。數(shù)組中的第一項是模型文件,然后是一系列產品,然后是零件。最后,數(shù)組以遇到的表示項結束。
對于這一步的其余部分,我們將按順序將代碼添加到 lambda 的主體中。
有時不應繪制表示項。為了確定這一點,我們將使用一種稱為級聯(lián)屬性的機制。級聯(lián)屬性允許我們在實例化它的組件的上下文中計算零件的屬性。特定裝配可以覆蓋特定零件的顏色或可見性。我們將把我們對級聯(lián)屬性的使用封裝在一個名為的簡單結構CascadedAttributes中,稍后我們將實現(xiàn)該結構。它被淘汰了,所以現(xiàn)在讓我們假設它的行為符合我們的需要。
在 lambda 的主體中添加以下代碼行:
CascadedAttributes ca( 路徑 );
// 確定是否應該跳過此項
如果( ca->m_bRemoved || !ca->m_bShow ) {
  返回
}
CascadedAttributes重載,提供對其中包含的結構operator->的直接訪問。A3DMiscCascadedAttributesData如果表示項目的這個實例被刪除或不應該顯示,我們會提前退出。
如果我們不及早退出,下一步就是在 Exchange 中生成曲面細分。為此,我們添加以下代碼行:
A3DRiRepresentationItem *ri = path.back();
// 使用我們上面聲明的選項生成曲面細分
A3DRiRepresentationItemComputeTessellation(ri, &tess_params);
現(xiàn)在我們已經對表示項進行了細分,我們可以訪問數(shù)據(jù)。
// 獲取此表示項的數(shù)據(jù)
A3DRiRepresentationItemData擺脫;
A3D_INITIALIZE_DATA(A3DRiRepresentationItemData,擺脫);
if ( A3D_SUCCESS != A3DRiRepresentationItemGet( ri, &rid ) ) {
  返回
}
// 曲面細分存儲在 m_pTessBase 中
自動tess_base = rid.m_pTessBase;
您應該非常熟悉上面介紹的模式,它使用不透明的對象句柄 ( ri) 將其關聯(lián)數(shù)據(jù)讀入結構。然后從結構中獲得鑲嵌句柄,我們就可以使用它了。
使用曲面細分的句柄,我們接下來嘗試創(chuàng)建一個Qt3D網格。如果我們成功了,我們就會創(chuàng)造并應用它的材料并進行轉換。這是通過以下方式完成的,使用了一些已經被刪除的附加函數(shù):
// 創(chuàng)建網格
如果(自動網格= createMesh(tess_base)){
  自動節(jié)點 =新Qt3DCore::QEntity(rootEntity);
  節(jié)點->添加組件(網格);
  // 創(chuàng)建材質
  如果自動材料= createMaterial(ca->m_sStyle)){
    節(jié)點->添加組件(材料);
  }
  // 創(chuàng)建變換
  如果自動變換 = createTransform(路徑)){
    節(jié)點->添加組件(變換);
  }
}
如果獲得了網格,我們將創(chuàng)建一個節(jié)點來保存它,以及材質和變換。該節(jié)點是rootEntity.
仍然在 lambda 的主體內工作,我們還有最后一項任務。回想一下,每當您從 Exchange 讀取數(shù)據(jù)時,您必須確保通過第二次調用 getter 并提供空句柄來釋放任何關聯(lián)的內存。
使用 lambda 主體內的以下(也是最終)代碼行釋放表示項數(shù)據(jù):
A3DRiRepresentationItemGet( nullptr , &rid);
這樣就完成了構建場景的高層實現(xiàn)。我們顯然為以后的步驟留下了許多實現(xiàn)細節(jié),但我們已經完成了構成渲染模型所需的基本場景圖的任務。
第 2 步:程序集遍歷
從上一步來看,應該有點清楚還剩下什么要做。我們將以系統(tǒng)的方式攻擊每個任務,首先通過實現(xiàn) ForEach_RepresentationItem 遍歷程序集層次結構。
讓我們從函數(shù)必須如何運行的簡短描述開始。在您的編輯器中打開文件 ForEachRepresentationItem.cpp,您將找到代碼的存根版本:
命名空間{
  void forEach_Impl( EntityArray const &path, std::function< void (EntityArray
  常量&)>常量&fcn ) {
    Q_UNUSED(路徑);
    Q_UNUSED(fcn);
  }
}
無效forEach_RepresentationItem(A3DAsmModelFile *model_file,
std::function< void (EntityArray const &)> const &fcn ) {
  forEach_Impl( { model_file }, fcn );
}
該函數(shù)有兩個參數(shù)。第一個是模型文件的不透明句柄。第二個參數(shù)是作為回調調用的函數(shù)對象。并且,正如我們在第 1 步中所討論的,實現(xiàn)預計將遍歷裝配結構并為遇到的每個表示項調用回調。
回調函數(shù)使用單個參數(shù)調用:一個EntityArray包含 Exchange 對象的不透明句柄的有序列表。該列表是順序的,從A3DAsmModelFile句柄開始,然后是一個或多個A3DAsmProductOccurrence句柄。句柄代表通向零件的裝配層次。當然,接下來就是A3DAsmPartDefinition手柄了。最后,路徑包含A3DRiRepresentationItem遇到的句柄。如果部件定義包含A3DRiSet對象(表示項集),則路徑中將有多個A3DRiRepresentationItem句柄。
公共函數(shù)立即調用一個匿名實現(xiàn),該實現(xiàn)采用一個EntityArray而不是一個A3DAsmModelFile句柄。這樣做的用處很快就會變得清晰。該實現(xiàn)將只關心提供的路徑中的最后一個句柄。
一個很好的起點是一開始。所以,讓我們實現(xiàn)我們已經知道的情況——當這個函數(shù)被路徑中的單個對象調用時,它是一個A3DAsmModelFile句柄。在這種情況下,我們希望將每個子A3DAsmProductOccurrence句柄添加到路徑并再次調用該函數(shù)以進行更深入的挖掘。它應該看起來像這樣:
auto  const ntt = path.back();
自動類型 = kA3DTypeUnknown;
if (A3D_SUCCESS != A3DEntityGetType(ntt, &type) ) {
  返回
}
EntityArray children;
如果(kA3DTypeAsmModelFile == 類型){
  A3DAsmModelFileData mfd;
  A3D_INITIALIZE_DATA(A3DAsmModelFileData, mfd);
  如果(A3D_SUCCESS!= A3DAsmModelFileGet(ntt,&mfd)){
    返回
  }
  children = EntityArray(mfd.m_ppPOOccurrences,mfd.m_ppPOOccurrences +
  mfd.m_uiPOOccurrencesSize);
  A3DAsmModelFileGet( nullptr , &mfd);
}
對于(auto child : children ){
  自動child_path = 路徑;
  child_path.push_back(children auto child : children);
  forEach_Impl(child_path, fcn);
}
A3DAsmProductOccurrence此實現(xiàn)是遞歸的,并使用句柄作為 的值調用自身path.back()。讓我們通過添加 if 子句來擴充處理這種情況的代碼。

否則 if ( kA3DTypeAsmProductOccurrence == type ) {
  A3DAsmProductOccurrenceData 吊艙;
  A3D_INITIALIZE_DATA(A3DAsmProductOccurrenceData, pod);
  if (A3D_SUCCESS != A3DAsmProductOccurrenceGet(ntt, &;pod) ) {
    返回;
  }
 child = EntityArray( pod.m_ppPOccurrences, pod.m_ppPOccurrences +
  pod.m_uiPOOccurrencesSize );
  A3DAsmProductOccurrenceGet( nullptr , &pod);
}
從這里去哪里?這將處理整個裝配層次結構,直至節(jié)點包含零件。所以,除了上面實現(xiàn)中所示的處理children外,我們還必須檢查an是否A3DAsmProductOccurrence包含一個part。
確定零件是否存在有時就像檢查m_pPart產品出現(xiàn)結構中的字段一樣簡單。但這并沒有捕捉到共享部件實例化的常見情況。零件實例化是通過使用m_pPrototype句柄來實現(xiàn)的,該句柄引用了裝配節(jié)點的共享定義。如果一個節(jié)點有一個空m_pPart句柄,你還必須遞歸檢查它的原型,如果它有一個。要實現(xiàn)此邏輯,請在匿名命名空間的頂部添加 getPart 函數(shù)。
A3DAsmPartDefinition *getPart( A3DAsmProductOccurrence *po ) {
  if ( nullptr == po ) {
    返回 空指針;
  }
  A3DAsmProductOccurrenceData 吊艙;
  A3D_INITIALIZE_DATA(A3DAsmProductOccurrenceData, pod);
  if (A3D_SUCCESS != A3DAsmProductOccurrenceGet( po, &pod ) ) {
    返回 空指針
  }
 ; 汽車零件 = pod.m_pPart ?pod.m_pPart : getPart( pod.m_pPrototype );
  A3DAsmProductOccurrenceGet( nullptr , &pod);
  返回部分;
  }
現(xiàn)在,我們可以在剛剛添加的處理A3DAsmPartDefinition對象的子句中使用這個函數(shù):
否則 if ( kA3DTypeAsmProductOccurrence == type ) {
  A3DAsmProductOccurrenceData 吊艙;
  A3D_INITIALIZE_DATA(A3DAsmProductOccurrenceData, pod);
&nbsp; if (A3D_SUCCESS != A3DAsmProductOccurrenceGet(ntt, &pod) ) {
    返回;
  }
  孩子 = EntityArray( pod.m_ppPOccurrences, pod.m_ppPOccurrences +
  pod.m_uiPOOccurrencesSize );
  如果(汽車零件= pod.m_pPart?pod.m_pPart:getPart(pod.m_pPrototype)){
    children.insert(children.begin(), part);
  }
  A3DAsmProductOccurrenceGet( nullptr , &pod);
}
我們已經完成了零件定義!所以讓我們在子句中添加部分定義遍歷:
} else  if ( kA3DTypeAsmPartDefinition == type ) {
  A3DAsmPartDefinitionData pdd;
  A3D_INITIALIZE_DATA(A3DAsmPartDefinitionData, pdd);
  if (A3D_SUCCESS != A3DAsmPartDefinitionGet(ntt, &pdd) ) {
    返回
  }
 children = EntityArray(pdd.m_ppRepItems,pdd.m_ppRepItems +
  pdd.m_uiRepItemsSize );
  A3DAsmPartDefinitionGet( nullptr , &pdd);
將我們帶到表示項目上,我們應該在其中調用回調函數(shù),提供用于將我們帶到這里的路徑。但在我們這樣做之前,我們不能忘記作為集合的特定表示項類型。如果遇到這種對象類型,我們必須進一步遍歷。
處理所有這些細節(jié)應該看起來像這樣,作為條件的最后一個 else 子句:
 否則{
  如果(kA3DTypeRiSet == 類型){
    A3DRiSetData risd;
  &nbsp; A3D_INITIALIZE_DATA(A3DRiSetData, risd);
    if (A3D_SUCCESS != A3DRiSetGet(ntt, &risd) ) {
      返回
    }
&nbsp;   children = EntityArray(risd.m_ppRepItems, risd.m_ppRepItems + risd.m_uiRepItemsSize);
    A3DRiSetGet( nullptr , &risd);
  }其他{
    fcn(路徑);
  }
}
如果您現(xiàn)在感覺有點頭暈,請不要擔心,這是完全正常的。我們一起成功地實現(xiàn)了一個行為良好的函數(shù),用于以對我們非常有用的方式遍歷 Exchange 產品結構。通過使用函數(shù)對象,我們將遍歷與構建場景圖的工作分開。在此過程中,您可能已經對 Exchange 的數(shù)據(jù)結構有所了解。
第 3 步:級聯(lián)屬性
讓我們繼續(xù)實現(xiàn)我們在步驟 1 中創(chuàng)建場景時使用的每個函數(shù)。我們遇到的下一個存根函數(shù)是 lambda 內部的CascadedAttributes結構。此結構在文件CascadedAddtributes.h中實現(xiàn)。打開它看看。您將找到一個空的構造函數(shù)和析構函數(shù),我們現(xiàn)在將實現(xiàn)它們。
構造函數(shù)有一個參數(shù),你現(xiàn)在應該很熟悉了。它是一個 EntityArray,表示從模型文件到我們感興趣的表示項的 Exchange 對象的路徑。我們的構造函數(shù)的工作是計算A3DMiscCascadedAttributesData與該路徑對應的對象。我們將按照此處的編程指南關于級聯(lián)屬性的部分提供的指導來執(zhí)行此操作。
實現(xiàn)構造函數(shù)如下:
// 創(chuàng)建一個向量來保存級聯(lián)屬性句柄
QVector<A3DMiscCascadedAttributes*&gt; cascaded_attribs;
// 創(chuàng)建“根”級聯(lián)屬性句柄
cascaded_attribs.push_back( nullptr );
A3DMiscCascadedAttributesCreate( &cascaded_attribs.back() );
// 對于路徑中的每個實體
對于(自動ntt:路徑){
  如果(A3DEntityIsBaseWithGraphicsType(ntt)){
    // 獲取之前級聯(lián)屬性的句柄
    自動父親 = cascaded_attribs.back();

// 為這個實體創(chuàng)建一個新的級聯(lián)屬性句柄

  &nbsp; cascaded_attribs.push_back( nullptr );
 ;   A3DMiscCascadedAttributesCreate( &cascaded_attribs.back() );

    // 將此句柄壓入堆棧
    A3DMiscCascadedAttributesPush( cascaded_attribs.back(), ntt, 父親);
  }
}
// 計算級聯(lián)屬性數(shù)據(jù)
A3D_INITIALIZE_DATA(A3DMiscCascadedAttributesData, d);
A3DMiscCascadedAttributesGet( cascaded_attribs.back(), &amp;d );
對于自動屬性:cascaded_attribs){
    A3DMiscCascadedAttributesDelete(attrib);
}
代碼中的注釋應該合理地解釋方法是什么。
一旦構造了這個對象,我們就適當?shù)靥畛淞藬?shù)據(jù)字段。剩下要做的就是釋放析構函數(shù)中的對象。將這行代碼添加到析構函數(shù)中:
A3DMiscCascadedAttributesGet( nullptr , &d);
僅此而已。
完成此步驟意味著您已經創(chuàng)建了一個簡單的結構來管理任意 EntityArray 的級聯(lián)屬性。這與我們工作流程的其余部分很好地結合在一起,并直接利用了我們實現(xiàn)的方法來遍歷產品結構。
第 4 步:創(chuàng)建網格
在下一步中,我們將介紹從 HOOPS Exchange 讀取曲面細分所需的代碼,并創(chuàng)建Qt3D適合渲染的相應對象。這項工作將在文件中完成Mesh.cpp。現(xiàn)在在你的編輯器中打開它,你會發(fā)現(xiàn)熟悉的 stubbed out 實現(xiàn)。
要開始這項任務,我們應該對傳入的句柄執(zhí)行一些健全性檢查。具體來說,我們要確保它是我們要為這個基本查看工作流處理的正確的具體對象類型。
A3DEEntityType tess_type = kA3DTypeUnknown;
if (A3D_SUCCESS != A3DEntityGetType( tess_base, &tess_type ) ) {
  返回 空指針
}
// 確保我們只處理我們關心的類型
如果(苔絲類型!= kA3DTypeTess3D){
  返回 空指針
}
傳遞給函數(shù)的句柄是一個名為的基類型A3DTessBase.對于這個基本的查看工作流,我們將只處理具體類型A3DTess3D.如果傳入一個空句柄,此代碼將正確處理它并退出。
基本鑲嵌類型包含我們需要的所有派生類型共有的信息,特別是坐標數(shù)組。添加代碼以從 HOOPS Exchange 讀取基礎數(shù)據(jù)。
// 從 tess 基礎數(shù)據(jù)中讀取坐標數(shù)組
A3DTessBaseData 待定;
A3D_INITIALIZE_DATA(A3DTessBaseData,待定);
if ( A3D_SUCCESS != A3DTessBaseGet( tess_base, &tbd ) ) {
  返回 空指針;
}
A3DDouble const *coords = tbd.m_pdCoords;
A3DUns32 const n_coords = tbd.m_uiCoordSize;
坐標數(shù)據(jù)以 C 樣式數(shù)組的形式提供 - 也就是說,它是一個指向指定長度的雙精度數(shù)組的指針。大小總是能被 3 整除。
下一個任務是獲取與具體細分類型相關的數(shù)據(jù)。我們將從獲取法線向量的 C 樣式數(shù)組開始。
3DTess3D數(shù)據(jù) t3dd;
A3D_INITIALIZE_DATA(A3DTess3DData, t3dd);
if ( A3D_SUCCESS != A3DTess3DGet( tess_base, &t3dd ) ) {
A3DTessBaseGet( nullptr , &tbd);
  返回 空指針;
}
A3DDouble const *normals = t3dd.m_pdNormals;
A3DUns32 const n_normals = t3dd.m_uiNormalSize;
還存儲在對象A3DTess3DData數(shù)組中A3DTessFaceData,每個拓撲面在精確幾何表示中一個。現(xiàn)在我們有了坐標和法線向量的數(shù)組,我們可以遍歷面部數(shù)據(jù)并解釋其中引用的鑲嵌。當我們遍歷面時,我們將構建一個包含位置和法線向量的單個 Qt 緩沖區(qū),以及一個簡單的“扁平化”索引數(shù)組。
每個實例都A3DTessFaceData包含一個位標志字段,用于描述三角形數(shù)據(jù)的存儲方式。通過使用 HOOPS Exchange 生成曲面細分,我們可以合理地確保只有基本三角形存在,因此我們不必擔心在從輸入文件本身。我們通過生成曲面細分對性能造成了影響,但好處是用于讀取生成的數(shù)據(jù)的簡化代碼塊。
這是從 HOOPS Exchange 讀取三角形數(shù)據(jù)的循環(huán)。它交錯三角形頂點位置及其法線向量,這通常在可視化工作流程中使用的頂點緩沖區(qū)對象中完成。
QVector<quint32> q_indices;
QByteArray 緩沖區(qū)字節(jié);
quint32 const stride = sizeof (float) * 6; // 3 表示頂點 + 3 表示法線
對于(自動tess_face_idx = 0u; tess_face_idx <; t3dd.m_uiFaceTessSize; ++tess_face_idx ) { A3DTessFaceData const &d = t3dd.m_psFaceTessData[tess_face_idx];
  自動sz_tri_idx = 0u;
  自動ti_index = d.m_uiStartTriangulated;
  if (kA3DTessFaceDataTriangle & d.m_usUsedEntitiesFlags) {
&nbsp;   auto  const num_tris = d.m_puiSizesTriangulated[sz_tri_idx++];
    自動 常量pt_count = num_tris * 3; // 每個三角形 3 分
    auto&nbsp; const old_sz = bufferBytes.size();
    bufferBytes.resize(bufferBytes.size() + stride * pt_count);
    auto fptr = reinterpret_cast< float * > (bufferBytes.data() + old_sz);
    對于(自動三= 0u;三<num_tris;三++){
    對于(自動垂直= 0u;垂直<3u;垂直++){
      自動 常量&normal_index =
      t3dd.m_puiTriangulatedIndexes[ti_index++];
      自動 常量&coord_index =
  &nbsp;   t3dd.m_puiTriangulatedIndexes[ti_index++];
      *fptr++ = coords[coord_index];
      *fptr++ = coords[coord_index+1];
      *fptr++ = coords[coord_index+2];
      *fptr++ = normals[normal_index];
      *fptr++ = normals[normal_index+1];
      *fptr++ = normals[normal_index+2];
&nbsp;     q_indices.push_back(q_indices.size());
      }
    }
  }
}
當這個循環(huán)結束時,我們留下一個原始緩沖區(qū),其中包含身體中每個三角形的浮點頂點位置和法線向量。它們按順序存儲,不考慮共享索引值的可能性。這導致緩沖區(qū)可能比需要的更大,但簡化了我們呈現(xiàn)的代碼。
我們從 Exchange 獲得了我們需要的所有數(shù)據(jù),所以讓我們自己清理一下。
A3DTess3DGet( nullptr , &t3dd);
A3DTessBaseGet( nullptr , &tbd);
我們必須通過創(chuàng)建Qt3D渲染剛剛捕獲的數(shù)據(jù)所需的原語來完成該功能。正如本教程開頭所提到的,我們不會花太多時間來描述細節(jié),Qt3D,而是根據(jù)需要呈現(xiàn)代碼:
auto buf = new Qt3DCore::QBuffer();
buf->setData(bufferBytes);
自動幾何=新的QGeometry;
auto position_attribute = new QAttribute(buf,
QAttribute::defaultPositionAttributeName(), QAttribute::Float, 3, q_indices.size(), 0, stride);
幾何->addAttribute(位置屬性);
auto normal_attribute = new QAttribute( buf,
QAttribute::defaultNormalAttributeName(), QAttribute::Float, 3, q_indices.size(), sizeof (float) * 3, stride );
幾何->addAttribute( normal_attribute );
QByteArray indexBytes;
QAttribute::VertexBaseType ty;
如果(q_indices.size() < 65536) {
  // 我們可以使用 USHORT
  ty = QAttribute::UnsignedShort;
  indexBytes.resize(q_indices.size() * sizeof (quint16));
  quint16 *usptr = reinterpret_cast< quint16* > (indexBytes.data());
  for ( int i = 0; i < int(q_indices.size()); ++i)
    *usptr++ = static_cast<quint16>(q_indices.at(i));
}其他{
  // 使用 UINT - 不需要轉換,但讓我們確保 int 是 32 位的!
  ty = QAttribute::UnsignedInt;
&nbsp; Q_ASSERT( sizeof ( int ) == sizeof (quint32));
&nbsp; indexBytes.resize(q_indices.size() * sizeof (quint32));
  memcpy(indexBytes.data(), reinterpret_cast< const char * > (q_indices.data()), indexBytes.size());
}
自動*indexBuffer = new Qt3DCore::QBuffer(); indexBuffer->setData(indexBytes);
QAttribute *indexAttribute = new QAttribute(indexBuffer, ty, 1, q_indices.size());
indexAttribute->setAttributeType(QAttribute::IndexAttribute);
幾何->addAttribute(indexAttribute);
自動渲染器 =新Qt3DRender::QGeometryRenderer();
渲染器->setGeometry(幾何);
返回渲染器
完成此步驟后,您已達到一個重要里程碑。現(xiàn)在,您可以加載單個零件并查看它。它將以默認顏色(紅色)顯示,但應該是可見的。程序集無法正確顯示,因為我們尚未處理轉換,但加載示例文件 samples/data/prc/Flange287. prc,您應該看到以下內容:
接下來,我們將專注于使轉換正確,以便我們可以正確地可視化程序集。
第 5 步:創(chuàng)建轉換
現(xiàn)在我們在屏幕上有了一些東西,讓我們添加在世界中正確定位對象所需的代碼。完成后,我們將能夠加載和查看程序集。
在程序集文件中,程序集樹的各個節(jié)點包含本地轉換。每個變換都相對于其父級應用。這意味著,要計算每個零件的世界變換,我們必須在通向零件實例的路徑中累積每個裝配節(jié)點的變換。
根據(jù)這個描述,我們可以開始編寫 createTransform(在 Transform.cpp 中找到)的實現(xiàn),如下所示:
QMatrix4x4 網絡矩陣;
對于(自動 常量ntt:路徑){
  A3DMiscTransformation *xform = getTransform(ntt);
  net_matrix *= toMatrix( xform );
}
自動xform =新Qt3DCore::QTransform();
xform->setMatrix(net_matrix);
返回xform;
這個實現(xiàn)完全按照我們所描述的方便的事實來描述,路徑包括指向表示項的程序集層次結構中每個對象的順序句柄列表。它使用了兩個我們仍然必須定義的函數(shù),getTransform我們toMatrix.將在上面的匿名命名空間中實現(xiàn)它們createTransform.
我們getTransform.將從它的用法開始,這個函數(shù)接受一個實體句柄并返回一個A3DMiscTransformation句柄。我們必須實現(xiàn)這個函數(shù)來確定傳入的實體的類型,并從它返回轉換(如果存在)。
在從模型文件到表示項的路徑中,唯一可能包含轉換的對象類型是A3DAsmProductOccurrence和A3DRiRepresentationItem.我們的代碼必須處理這兩種情況。實現(xiàn)getTransform功能如下:
命名空間{
    A3DMiscTransformation *getTransform( A3DEntity *ntt ) {

        A3DMiscTransformation *result = nullptr ;

        A3DEEntityType ntt_type = kA3DTypeUnknown;
        A3DEntityGetType(ntt, &ntt_type );
        if ( kA3DTypeAsmProductOccurrence == ntt_type ) {
          &nbsp; A3DAsmProductOccurrenceData d;
    &nbsp;       A3D_INITIALIZE_DATA(A3DAsmProductOccurrenceData, d);
 ;           A3DAsmProductOccurrenceGet(ntt, &d);
   ;       &nbsp; 結果 = d.m_pLocation ?d.m_pLocation:getTransform(d.m_pPrototype);
            A3DAsmProductOccurrenceGet( nullptr , &d);
        } else  if (ntt_type > kA3DTypeRi && ntt_type <= kA3DTypeRiCoordinateSystemItem) {
&nbsp;           A3DRiRepresentationItemData d;
            A3D_INITIALIZE_DATA(A3DRiRepresentationItemData, d);
            A3DRiRepresentationItemGet(ntt, &d);
        &nbsp;   如果(自動ti_cs = d.m_pCoordinateSystem){
          &nbsp;     A3DRiCoordinateSystemData cs_d;
&nbsp;   &nbsp;           A3D_INITIALIZE_DATA(A3DRiCoordinateSystemData, cs_d);
                A3DRiCoordinateSystemGet(d.m_pCoordinateSystem, &cs_d);
                結果 = cs_d.m_pTransformation;
      &nbsp;         A3DRiCoordinateSystemGet( nullptr , &cs_d);
            }
            A3DRiRepresentationItemGet( nullptr , &d);
        }
        返回結果;
    }
}
在這個實現(xiàn)中有兩個值得注意的地方。也許你已經發(fā)現(xiàn)了它們。
首先,在 if 子句中,kA3DTypeAsmProductOccurrence,您可能已經注意到選項結果的三元運算符。如果為空,getTransform則使用原型指針遞歸調用。m_pLocation這是因為裝配節(jié)點在未被覆蓋時會從其原型“繼承”位置字段。
第二個注釋在 else if 條件本身中。因為A3DEntityGetType返回提供的實體的具體類型,所以我們必須使用這里介紹的邏輯來查看實體是否是所有可能的表示項類型中的任何一種。不幸的是,它依賴于枚舉值。我愿意接受有關處理此問題的更好方法的建議(ExchangeToolkit.h有一個名為 的函數(shù)isRepresentationItem)。
有了A3DMiscTransformation句柄,我們現(xiàn)在準備實現(xiàn) toMatrix,它必須將句柄轉換為 aQMatrix4x4. A3DMiscTranformation是具有兩種可能的具體類型的基類句柄:A3DMiscCartesianTransformation我們A3DMiscGeneralTransformation.必須處理這兩種情況。為此,請使用以下代碼在匿名命名空間的頂部創(chuàng)建函數(shù):
QMatrix4x4 toMatrix(A3DMiscTransformation *xfrm){
  如果(xfrm){
    A3DEEntityType xfrm_type = kA3DTypeUnknown;
    A3DEntityGetType(xfrm, &xfrm_type);
    開關(xfrm_type){
      案例kA3DTypeMiscCartesianTransformation:
&nbsp;       返回getMatrixFromCartesian(xfrm);
        休息;
      案例kA3DTypeMiscGeneralTransformation:
&nbsp;       返回getMatrixFromGeneralTransformation(xfrm);
        休息;
      默認:
        throw std::invalid_argument( "意外類型。" );
        休息;
    }
  }
  返回QMatrix4x4();
}
一般變換將其矩陣表示為代表 4x4 矩陣的 16 元素雙精度數(shù)組。QMatrix4x4將這些值復制到對象中很簡單。在匿名命名空間的頂部創(chuàng)建以下函數(shù)來處理這種情況。
QMatrix4x4 getMatrixFromGeneralTransformation(A3DMiscGeneralTransformation *xform){
  A3DMiscGeneralTransformationData d;
  A3D_INITIALIZE_DATA(A3DMiscGeneralTransformationData, d);
  A3DMiscGeneralTransformationGet(xform, &d);

  自動 常數(shù)系數(shù) = d.m_adCoeff;
  QMatrix4x4 結果;
  for (自動行 = 0u; 行 < 4u; ++row ) {
    對于(自動col = 0u;col < 4u;++col){
      結果(row,col) = static_cast< float &gt; (coeff[row + col * 4]);
    }
  }
返回結果;
處理笛卡爾變換的情況要復雜一些。我們必須讀取基本數(shù)據(jù)并執(zhí)行一些元素代數(shù)來計算矩陣的值。將此代碼添加到匿名命名空間以提取笛卡爾變換數(shù)據(jù)。
QMatrix4x4 getMatrixFromCartesian(A3DMiscCartesianTransformation *xform){
  A3DMiscCartesianTransformationData d;
&nbsp; A3D_INITIALIZE_DATA(A3DMiscCartesianTransformationData, d);
  A3DMiscCartesianTransformationGet(xform, &d);
  auto  const mirror = (d.m_ucBehaviour & kA3DTransformationMirror) ?-1。: 1.;
  auto  const s = toQVector3D(d.m_sScale);
  auto ; const o = toQVector3D(d.m_sOrigin);
  auto  const x = toQVector3D(d.m_sXVector);
  auto  const y = toQVector3D(d.m_sYVector);
  auto  const z = QVector3D::crossProduct( x, y ) * mirror;
  A3DMiscCartesianTransformationGet( nullptr , &amp;d);
  返回QMatrix4x4(
  &nbsp; xx() * sx(), yx() * sy(), zx() * sz(), ox(),
    xy() * xx(), yy() * sy(), zy() * sz(), oy(),
&nbsp;   xz() * sx(), yz() * sy(), zz() * sz(), oz(),
    0.f, 0.f, 0.f, 1.f
  );
}
此代碼使用從對象toQVector3D創(chuàng)建 a的函數(shù)。它在Transform.h中實現(xiàn)。QVector3DA3DVector3DData
添加此功能后,您將擁有一個完整的實現(xiàn)以供測試。運行您的應用程序并加載一個程序集文件,例如data/prc/_micro engine.prc。
第 6 步:創(chuàng)建材料
本教程的最后一步是創(chuàng)建代表我們從 Exchange 讀取的樣式數(shù)據(jù)的 Qt3D 材質。要確定零件的外觀,我們必須依賴從第 3 步的級聯(lián)屬性助手中檢索到的數(shù)據(jù)。回想一下,可見性是由通過裝配的特定路徑決定的。應以相同的方式計算應繪制的部分樣式。在createScene,我們調用函數(shù)的主體中,createMaterial并從我們的級聯(lián)屬性助手中傳遞樣式數(shù)據(jù)。

打開文件材料。cpp 這樣我們就可以開始實現(xiàn)該功能了。您將看到創(chuàng)建了默認材質,這就是所有部件都顯示為紅色的原因。傳入此函數(shù)的樣式數(shù)據(jù)對象可以通過 3 種不同的方式指定材質信息。最簡單的情況是單色。讓我們從處理那個案例開始。
更新函數(shù)如下:
Qt3DCore::QComponent *createMaterial( A3DGraphStyleData const &style_data ) {
  自動材質 =新Qt3DExtras::QDiffuseSpecularMaterial();
  材料->setDiffuse(QColor(“紅色”));
  如果(!style_data.m_bMaterial){
    auto&nbsp; const a = style_data.m_bIsTransparencyDefined ?style_data.m_ucTransparency:255u;
    材料->setDiffuse(getColor(style_data.m_uiRgbColorIndex, a));
  }
  退回材料;
}
在這里,我們使用了一個我們仍然必須實現(xiàn)的getColor.函數(shù),這個函數(shù)接受一個 RGB 顏色索引(和 alpha)并在上面的匿名命名空間中返回一個QColor.實現(xiàn)getColorcreateMaterial.

命名空間{
  QColor getColor(A3DUns32 const &color_idx, int  const &a) {
&nbsp;   如果(A3D_DEFAULT_COLOR_INDEX == color_idx){
      返回QColor( 255, 0, 0 );
    }
    A3DGraphRgbColorData rgb_color_data;
&nbsp;   A3D_INITIALIZE_DATA(A3DGraphRgbColorData, rgb_color_data);
    A3DGlobalGetGraphRgbColorData(color_idx, &rgb_color_data);
    自動 常量&amp;r = rgb_color_data.m_dRed;
    自動 常數(shù)&g = rgb_color_data.m_dGreen;
    自動 常量&b = rgb_color_data.m_dBlue;
    返回QColor( static_cast<int>(r * 255), static_cast<int>(g * 255), static_cast<int>(b * 255), a);
  }
}
顏色數(shù)據(jù)通過整數(shù)索引存儲在 中。這個實現(xiàn)首先檢查索引是否等于A3D_DEFAULT_COLOR_INDEX,表示沒有分配顏色。在這種情況下,我們返回紅色,你會認為這是我最喜歡的顏色,但你錯了。從 Exchange 的雙精度定義創(chuàng)建QColor對象是一件簡單的事情,自然而然。
通過此實現(xiàn),您會發(fā)現(xiàn)許多部件現(xiàn)在將加載并以正確的顏色顯示。
讓我們添加一個額外的案例來處理樣式數(shù)據(jù)可以采用的兩種或三種形式。使用以下 else 塊更新 createMaterial 中的 if 子句。
否則{
  A3DBool is_textuture = false ;
  A3DGlobalIsMaterialTexture(style_data.m_uiRgbColorIndex, &is_texuture);
  如果(!is_textuture){
    A3DGraphMaterialData material_data;
    A3D_INITIALIZE_DATA(A3DGraphMaterialData, material_data);
    A3DGlobalGetGraphMaterialData(style_data.m_uiRgbColorIndex, &material_data);
    auto  constambient_color = getColor(material_data.m_uiAmbient, static_cast<int>(255 * material_data.m_dAmbientAlpha));
    auto  constdiffuse_color = getColor(material_data.m_uiDiffuse, static_cast<int>(255 * material_data.m_dDiffuseAlpha));
  &nbsp; if (ambient_color.alpha() == 255 &&diffuse_color.alpha() == 0) {
    材料->setDiffuse(ambient_color);
    }否則 if (ambient_color.alpha() == 0 &;&diffuse_color.alpha() == 255) {
        材料->setDiffuse(diffuse_color);
    }
    材質->setSpecular(getColor(material_data.m_uiSpecular,material_data.m_dSpecularAlpha));
  }
}

這可以處理稍微復雜的材質定義。處理紋理超出了本基本查看教程的范圍。我們已經處理了兩種最常見的樣式定義情況,并且我們正在返回一個合理的 Qt3D 材料。

HOOPS Exchange是旗下的一款高性能CAD數(shù)據(jù)格式轉換工具,通過單一接口可完成30多種數(shù)據(jù)格式轉換,如果您感興趣可聯(lián)系我們申請60天免費試用

慧都深耕行業(yè)近20年,始終緊跟全球前沿技術,持續(xù)投入核心技術研發(fā),在相關專業(yè)技術領域建立自身優(yōu)勢,不斷為客戶數(shù)字化、智能化賦能!

    &nbsp;          

慧都科技是Tech Soft 3D-HOOPS在中國區(qū)的唯一增值服務商,負責試用,咨詢,銷售,技術支持,售后,旨在為企業(yè)提供一站式的3D開發(fā)解決方案。如果您的企業(yè)目前也有的需求,歡迎咨詢在線客服申請3D 輕量化引擎的60天免費試用。

↓↓掃碼添加客服微信,及時獲取“HOOPS技術”支持↓↓


標簽:

本站文章除注明轉載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@ke049m.cn


為你推薦

  • 推薦視頻
  • 推薦活動
  • 推薦產品
  • 推薦文章
  • 慧都慧問
掃碼咨詢


添加微信 立即咨詢

電話咨詢

客服熱線
023-68661681

TOP
利記足球官網(官方)網站/網頁版登錄入口/手機版登錄入口-最新版(已更新) 真人boyu·博魚滾球網(官方)網站/網頁版登錄入口/手機版登錄入口-最新版(已更新) 最大網上PM娛樂城盤口(官方)網站/網頁版登錄入口/手機版登錄入口-最新版(已更新) 正規(guī)雷火競技官方買球(官方)網站/網頁版登錄入口/手機版登錄入口-最新版(已更新) 雷火競技權威十大網(官方)網站/網頁版登錄入口/手機版登錄入口-最新版(已更新) boyu·博魚信譽足球官網(官方)網站/網頁版登錄入口/手機版登錄入口-最新版(已更新) 權威188BET足球網(官方)網站/網頁版登錄入口/手機版登錄入口-最新版(已更新) 正規(guī)188BET足球大全(官方)網站/網頁版登錄入口/手機版登錄入口-最新版(已更新) 国产一区二区四五区在线视频 | 国产精品亚洲一区二区在线观 | 国产美女a做受 | 精品国产一区二区在线观看 | 国产蜜桃tv | 成人免费无码婬片在线观看免费 | 高清无码免费在 | 成人a片99产无码小视频 | 2025亚洲精品午夜精品国产 | 国产成人精品久久一区二区三区 | 国产一区二区三区福利 | 国产肥熟女视频一区二区视频 | 国产人妖视频一区二区 | 国产成人无精品久久久久国语 | 国产欧美日产高清欧美 | 91精品婷婷国产综合久久 | 精品国产一区二区三区四区色欲 | 国产91福利小视频在线观看 | 91精品福利| 国产一级毛片午夜 | 国产精品va在线观看无码电影麻豆 | 国产三级精品久久久久久久 | 大尺度亚洲写真图片在线 | av鲁丝一区鲁丝二区鲁丝四区 | 精品日韩av一区二区三区 | 91人妻无码精品一区二区三区 | 国产无码不卡 | www.亚洲一区二区三区 | 国产精品国产三级国产a无密码 | 精品人妻无码一区二区色欲产成 | 国产成人综合亚洲欧美天堂 | 国产精品精品系列在线观看 | 国产精品视频系列专区 | 国产午夜精品亚洲精品国产 | 91嫩草免费国产永久入口 | 91久久精品国产91久久公 | 91久国产在线观看 | 国产精品高潮久久久久无码av | 不卡国产在线看h | 精品日产一区二区三区手机 | 91麻豆69天堂| 91亚洲自偷观看高清 | 国产成人高清亚洲综合 | 国产精品成人无码av无码免费 | 成人自慰女黄网站免费大全 | 国产精品无码无片在线观看 | 国产亚洲欧美日韩在线三区 | 国产极品粉嫩美女在线播放 | 风韵丰满熟妇啪啪区老老熟妇 | 国精品无码一区二区 | 成人国产三级 | 成无码网站在线观看 | 2025最新亚洲中文字幕在线 | 精品免费av一区二区 | 国产精品免费观看在线观看 | 国产欧美野外性生活 | 成人一区二区免费中文字幕视 | 国产成人亚洲精品播放器下载 | 国产尤物一区二区三区在线观看 | 精品无码一区二区三区免费看 | 国产美女自慰在线观看 | 超碰国产在线高清无码 | 国产免费一区二区三区香蕉精 | 国产福利视频一区二区 | 国产免费伦精品一区二区三区 | 国产精品亚洲一区二区在线观 | 高清无码日本一区 | 国产成人精品午夜日本亚洲 | 国产成年人免费视频 | 高清不卡v免费费 | 国产黄网站视频在线观看 | 精品三级av无码一区 | 2025v视频无码高清网站 | 国偷自产视频一区二区久 | 国产亚洲精品看片在线观看 | 国产精品亚洲片在线观看不 | 国产精品亚洲专区在线播放 | 国产在线精品一区二区在线观看 | 国产亚洲午夜影视在线观看 | 91福利 | 国产一产二产三精华液 | 高清国产一级婬片a片免费 高清国产一区 | 国产精品免费久 | 国产精品无码午夜免费影院 | 99精品欧美一区二区蜜桃免费 | av人人澡人人爽人人夜夜 | 国产人妖在线播放 | 顶级丰满少妇自慰到喷水 | 东京日韩人妻无码专区一本亚州最新 | 国产三级黄福利在线视频 | 超薄丝袜足j好爽在线 | 国产尤物一区二区在线播放 | 国产成人精品亚洲2025 | 国产免费露脸视频在线 | 国产成年女人特黄特色大片免费 | 国产成人精品久久一区二区精品 | 国产成人av黄色大片 | 精品国产一区二区三区2025 | 国产亚洲无线码一区二区 | 精品少妇人妻av无码专区不卡 | 99久精品 | 国产精品毛片va一区二区三区 | 国产色婷婷视频在线观看 | 国产制服日本一区二区 | 国产办公室紧身裙丝袜av在线 | 岛国毛片一级一级特 | 国产蜜桃色欲91精品一区二区 | 精品无码一区二区三区三十路 | 成人国内精品视频在线观看 | 国产av无码熟妇 | 国产成人亚洲综合无码精品 | 成人毛片无码免费播放网站 | 国产品精十八禁免费的网站 | 成人免费aa在线观看 | 国产肥熟女视频一区二区三区 | 国产精品三级久久 | 国产av无码专区影视 | 97人人模人人| 国产精品毛片久久久久 | 国产毛片日韩精品无码 | av中文字幕网免费观看 | 国产在线精品国自产拍影院同性 | 国产av剧情 | 国产精品自产拍在线观看中文 | 国产精品无码一区二区三四区 | aⅴ无码午夜在线 | 国产精品麻豆99久久久久久 | www高清无码日韩 | 国产精品一级a片不卡 | 精品无码av毛片一区二区三区 | 国产精品成人一区二区三区吃奶 | 国产欧美国产精品第一区 | 国产午夜a理论毛片在线影院 | 国产自国产在线观看免费观看 | 91福利院| 白丝jk自慰高潮 | 成人无遮挡裸免费视频在线观看 | 国产自偷在线拍精品 | 国产精品成人一区二区不卡 | 国产欧美日韩综合一区激情 | 18禁成人无遮羞网站免费 | 国产一区二区三区精品观看 | 成人va在线一区二区三区四区 | 国产精品露脸精 | 91精品国产综合久久香蕉爱欲 | 国产精品二区 | 99久久国语露脸 | 精品国产片自在线拍免费看 | 国产精品无码制服丝袜 | 国产91精品一区二区麻豆观看 | 精品国产一区二区三区精品日韩 | av无码专区 | 国产精品无码久久四虎 | 国产成人精品免费视频大全不卡 | 精品国产96亚洲一区二区三区 | 国产精品成久久久久三级6二k | 91精品在线免费视频 | 91久久老司机福利精品网 | 91国内自产 | av片在线观看不卡 | 国产v在线观看视频无码 | 国产精品伦理一区二区三区 | 激情无码专区在线观看 | 国产福利一区二区三区在线视 | 精品人妻少妇一区二区a | 国产成人高清精品免费观看 | 国内女人牲交视频播放 | 国产成人精品999在线观看视频 | 国产精品日韩精品在线播放 | 国产精品另类激情久久久免 | a片人人澡c片人人人妻蜜臀 | 国产超级乱淫视频播放免费 | 国产白袜脚足j棉袜在线观看 | av一级在线观看 | 国产成人调教在线视频 | 国产三区视频在线观看 | 国产成人啪精品视频网站午夜 | 国产亚洲精久久久久久无码苍井空 | 91精产国品一二三产区粉粉 | 99精品在线观看视频 | 国产在线午夜不卡精品影院 | 国产色视频一区二区三区 | 18禁美女黄网站色大片免费观看 | 国产福利网站 | 2025国产在线观看无码 | 2025亚洲欧美日韩在线观看 | 国产欧美日韩免费观看一区二区 | 国产高级桑拿会所在线看 | 91福利资源站 | 国产成人精品日本亚洲 | aⅴ不卡国产在线观看 | 国产午夜福利大尺度在线观看 | 变态另类欧美大码日韩 | 国产精品福利一区二区久久 | 国产毛片成 | 国产系列丝袜熟女精品视频 | 国产系列在线精品 | 成人拍拍拍免费视频网站 | 国产黄片第一区二区三区 | 高潮喷水视频一区二区三区 | 18禁白丝喷水视频www视 | 国产成人亚洲精品91专区高清 | 国产一区二区三区播放 | 国产成年女人免费视频播放a | 国产毛片特黄毛片老人 | 国产亚洲欧美在线播放网站 | 丰满人妻熟妇乱又伦精品视频三 | 国产成人高潮拍拍拍18 | 国产一区二区在线观看麻豆 | 国产精品日韩av在自线在免费 | 国产巨作在线无遮挡 | 国产成人精品无码a区在线观看 | 国产999精品久久久久久 | 精品视频手机在线观看免费 | 国产重口老太和小伙乱 | 国产av国片精品 | 精品少妇一区二区三区视频 | 国产精品一区二区久久精品 | 国产亚洲欧美在手机线专区 | 国产亚洲视频网站 | 18禁黄污吃奶免费看网站 | 国产91在线看片 | 国产激情91久久精品导航 | 白丝jk女仆爆乳自慰喷水流白浆 | 国产精品无码专区av在线播放 | 国产成人综合洲欧美在线 | 国产高清视频免费最新在线 | 91国自产精品中文字幕亚洲 | 国产麻豆剧果冻传媒白晶晶 | 国产无套水多在线观看 | 精品人妻系列无码人妻网 | 国产91精品高清一区二区三区 | 18禁免费观看网站 | 91精品国产麻豆国产自产在线 | 国产尤物精品不卡 | 国产欧美久久久精品影 | 91人妻中文字幕在线精品 | 国产精品亚洲二区第一页 | 黑人巨大精品欧美一区二区蜜桃 | 国产成人精品久久久 | 精品国模一区二 | 国产av片国产 | 国产精品视频网站丝袜 | 国产精品女在线观看 | 国精产品一区一区三区糖心 | 国产一区二区三区不卡在线 | 国产人妻人伦精品无码.麻豆 | 国产在线播放精品一区 | 国产精品亚洲第五区在线 | 国产高清网站视频在线观看 | 国产超级avcao在线观看 | 成人在线精品视频 | 2025年最新偷拍视频一区 | av亚洲精品毛片av | av无码在线免费观看 | 国产av一区二区三区导航 | 国产一级亚洲视频在线观看 | 国产交换配乱婬视频手机版 | 国产成人综合久久精品亚洲 | 国产成年无码久久久久毛片 | 国产精品一亚洲av日韩av欧 | 国产尤物精品自在拍视频首页 | 18禁免费av日韩av高清 | 东京热一精品无码一二三 | 91精品在| 91精品人妻一区二区三区蜜桃 | 国产成人三级视频在 | 成人在线毛片精品 | 国产最爽的aⅴ片在线观看 国产最爽的av片在线观看 | 国产亚洲成人精品久久久久无码av | av蜜臀| av在线观看 | 国产精品高清一区二区 | 国产福利小视频在线观看的一区 | 精品人妻无码视频中文 | 国产成人a福利在线观看 | 精品国产欧美精品v | 2025最新免费精品无码 | 国产一区视频在线观看 | 精品国产va久久久久久久 | 高潮又黄又爽又无遮挡又免费视频 | 囯产精品久久久久久久久久无 | 国产成人亚洲精品播放器下载 | 国产精品精品自在线拍 | 国产一区白丝 | 国产精品一区不卡在线观看 | 成人午夜福利app | 国产麻豆精品久 | 国产精品无码一本二本三本色 | av无码理论片在线观看免费 | 国产精品三级a三级三级午夜 | 精品无码av一区二区 | 精品国产丝袜高跟鞋子 | 国产短视频精品一区二区三区 | 国产成人精品日本亚洲网站 | 91av免费观看 | 1000部未满十八禁止观看 | 国产白浆视频在 | 国产高清一区二区三区四区 | 国产精品无码一区二区在线观看 | 福利视频欧美一区二区三区 | 国产成人片aⅴ在线观看 | 97人妻在线免费视频 | 国产成人a亚洲 | 国产在线观看91精品一区 | 国精品人妻 | 91精品乱码一区 | 精品人妻一区二区三区蜜桃 | 99精品久久久 | 国产成人a亚洲精v品无 | 国产成人色欲av在线 | 精品3d卡通动漫h在线观看 | 国产av夜夜欢一区二区 | 国产亚洲一区二区三区在线 | 果冻传媒2025精品一区 | 国产欧美日韩亚洲精品区 | 国产在线观看美女福利精 | 国产一区二区三区精品一级片 | 国产成人精品亚洲日 | 国产成人啪精品午夜在线观看 | 国产免费午夜一区二区视频 | 二区欧美无遮挡中文字幕人成人 | 国产人妻精品一区二 | 精品无人区一区二区三区 | 国产精品一区二区熟女不卡 | 精品无码专区免费播放 | 国产成人一区二区三区在线观看 | 国产成人小视频 | 国产在线精品一区二区在线看 | 国产一区在线观看视频网站 | 国产午夜福利91天堂美女 | 国产成人精品一区 | 国产av午夜精品一区二区三区 | 国产精品香蕉夜间视频免费播放 | av天堂一区二区三区 | av一本久道久久波多野结衣 | 国产成人综合在线 | 国产成久久免费精品av片天堂 | 国产一级av毛片国语对白 | 国产一区二区在线免费观看 | 国产成人综合久久 | 丰满大胸年轻继坶hd | 国产私伦一区二区三区 | 加勒比久久综合 | 成年女人毛片免费播放人 | 国产欧美日产高清欧美 | 99久久婷婷国产综合精品免费 | 97人妻精品 | 国产一区二区激情视频在线 | 国产午夜亚洲精品无码 | 国产精品一区二区av影院萌芽 | 成人在线免费观看视频 | 国产三级精品三级在线播放 | 国精无码欧精品 | av无码专区| 国产日韩欧美一区二区久久精品 | 国产精品日韩欧美在线第3页 | 国产亚洲中文一区二区三区 | 国产亚洲欧美日韩在线观看一区 | 国产一区二区激情戏 | 国产91高跟丝袜 | 国产麻豆天美果冻无码视频 | 91大神精品无码在线观看 | 国产精品成人小电影在线观看 | 精品三级在线 | 国产91密拍在线高清无删减 | 精品人妻一区二区三区含羞草 | 99久久原创国产精品原创a | 91在线国产一区二区 | 成人欧美一区二区三区在线 | 国产精品国产三级 | 国产盗摄精品一二区 | 国产精品无码无片在线观看3d | av无码精品久久久久精品免费 | 国产精品亚洲精品影院 | 国产一区二区三区日韩 | 国产一区二区三区婷婷五月 | 国产精品熟女四五十路一区二区 | 国产成人精品无码播放 | 精品无码专区久久久水蜜桃 | 成人无码精品一区二区在线 | 91高清视频在线观看 | 91桃色午夜福利国产在线观看 | 国产精品露脸精 | 91国自产精品 | 国产精品高清视频免费 | 国产熟女亚洲精品明星自拍 | 国产成人精品免费视频大全不卡 | 变态sm天堂无码专区 | 国产在线98福利播放视频免费 | 国产三级片在线观 | 国产精品欧美在线观看 | 精品国产成人国产在线观看 | 91中文字幕在线一区 | 69精品久久久久中文字幕 | 精品国产专区91在线官网 | 99久久精品成 | aⅴ不卡国产在线观看 | 国产丝袜欧美中文另类 | 2025国产视频不卡在线 | 国产成人精品日本亚洲77美色 | 99久久精品一区二 | 精品亚洲av无码一区二区 | 国产精品欧洲激情无码av | 国产精品刮毛 | 国产双飞 | 国产精品毛片无码一区二区蜜 | 国产成人精品一区二区三区视频 | 国精品人妻无码一区二区三区喝尿 | 99精品国产福久久久久久 | 国产91对白在线播放边 | 国产草草影院一区二区三区 | 国产极品美女在线观看网站 | 国产成人无码a区电影 | 国产精品视频一区国模私拍 | 韩国欧美日本亚洲一区二 | av免费无码在线观看 | 国产精品日韩精 | 91久久九九亚洲一区二区 | 成人三级视频在线观看一区二区 | 成人免费毛片一级 | 国产欧美日韩午夜在线观看 | 国产成人无码av一区二区 | 国产福利最新手机在线观看 | 精品日韩欧美一区在线播放不 | 国产一区二区三区视频高清 | 激情另类乱人伦人妻 | 91久久精品无码一区二区大 | 国产成人永久免费视频 | 国产免费无码成人a片在线观看 | 国产av夜夜欢一区二区 | a级毛片无码兔费真人久久 a级毛片无码兔费真人久久91 | 精品久久久无码人妻中文字幕免费 | av无码午夜福 | 精品人妻系列无码一区二区三区 | 国产欧美日韩综合精品一区二区三区 | 国产成人爆乳在线视频播放 | 2025国产麻豆 | 成a人无码午夜电影 | 国偷自产视频一区二区久 | 99久精品 | 国产成人午夜精品影院 | 国产成人精品午夜福利 | 国产成人综合亚洲精品 | 精品无码一区在线观看 | 国产精品初高中精品久久 | 国产av无码一区二区二三区j | 精品无码午夜福利免费看 | 精品视频一区二区三区免费 | 18禁午夜福利a级污黄刺激 | 国产亚洲视频网站 | 国产成人无码v片在线观看 国产成人无码v在线播放不卡 | 成熟女人特级毛片www免费 | 国产精品午夜免费观看网站 | 91人妻中文字幕在线精品 | 国产制服丝袜你懂的 | av三区在线在线播放 | 国产福利一区二区三区高清 | 国产专区一区 | 91精品在线免费视频 | 国产av永久精品无码 | 国产产无码乱码精品久久鸭 | 精品不卡免费一区二区三区 | 不卡午夜中文字幕 | 国产精品情侣呻吟 | 精品午夜视频一区二区三 | 91精品国产制服啪啪无码 | 91探花视频在线观看 | 国产三上悠亚日韩在线 | 国产av老师黑色丝袜美腿 | 国产精品亚欧美一区二区三区 | 2025国内性爱精品偷拍 | 白嫩少妇激情无码久久 | 精品视频手机在线观看免费 | 国产成人精品日本亚洲成熟 | 国产91久久久久久 | 成人国产网站v片免费观看 成人国产亚洲精品a区天堂 | 岛国毛片一级一级特 | 国产激情无码视频一区二区三区 | 国产对白老熟女正在播放 | 国产精品大神在线播放 | 精品无码av不卡久久久久 | 国产日韩欧美一区二区三区综合 | 国产女人喷浆 | 国产福利一区二区三区在线观 | 91大神福利在线 | 国产成年人免费在 | 成人av在线一区二区三区四区 | 高清无码国产在线 | 国产成人无码久久久久毛片 | 国自产在线精 | 国产无码少妇影视 | 国产优质视频在线观看 | 国产女主播一二三区丝袜美腿 | 国产成人综合欧 | 91福利国产在线在线播放 | 2025国产精华国产精 | 国产午夜无码喷水福利在线观看 | 成人精品一区二区在线观看 | 国产一区二区三区内射 | 国产美女精品网站在线看 | 国产一区二区三区精品网站 | 精品久久久久久无码人妻 | 2025卡1卡2卡3精品老狼 | 国产在线播放线99视频大全 | 国产自产视频一区二区三区 | 精品国产sm最大网站麻豆 | 韩国无码电影在线观看 | 91福利院| 国产精品免费露脸视频 | 国产日韩精品无码去免费专区国产 | 国产成人久久av一区二区 | 国产国产成人高清视频 | 国产一区二区四区在线视频 | 国产资源精品一区二区免费 | 18禁很色很爽很黄的免费网站 | 国产高清一级夜夜爽 | 成年午夜免费 | 91精品国产综合久久小美女 | 国产自愉自愉免费精品七区 | 国产精品一区电影 | 国产高清在线观看一区二区三区 | 国产午夜福利在线播放87 | 国产一区二区在线午夜福利 | 91麻豆69天堂 | 18禁很色很爽很黄的免费网站 | 国产成人久久精品一区二区 | 国产精品二区无 | 精品无人区乱码一区2区3区 | 2025久久精品国产99国产精品 | 国产精品偷伦视频观看免费 | 国产麻豆成人传媒免费观看 | 国产无码毛片一区二区三区 | 国产精品高潮呻吟久久av旡码 | 成人无码一区二区三区 | 国产麻豆一区二区三区精品视频 | 精品久久免费一区二区三区四区 | 精品人妻一区二区三区含羞草 | 国产精品区在线12p 国产精品区在线观看 | 国产精品熟女一区二区 | av无码免费一区二区三区 | 国产av无码一区二区二三区j | 国产精品亚洲欧美大片在线 | 超大乳抖乳露双乳呻吟电影 | 91免费看nba国产免费 | 精品深夜av无码一区二区老年 | 国产精品无码久久人妻无码影院 | 动漫成年美女黄漫网站小视频 | 国产人妻黑人一区二区三区 | av中文字幕音影先锋天堂 | 国产av玩弄放荡人妇性奴老师 | 国产午夜精品免费一区二区 | 国产精品va在线播放我和闺蜜 | 国产成人av大片在线播放 | 精品免费av在线播放 | 白丝被绑双腿憋尿sm调教 | 国产原创av一区二区三区 | 国产91久久综合 | 潮喷大喷水系列无码久久精品 | 国产精品成人a片在线播放 国产精品成人a区在线观看 | 韩国免费a级毛片 | 国产美足白丝榨精在线观看sm | 国产成a人片在线观看视频下载 | 成人在线激情网 | 国产亚洲欧美另类一区二区 | 国产精品免费高清观看 | 国产精品一区二区日韩欧美 | 91久久| 成人区人妻精品一区二 | 2025精品久久久久久中文字幕 | 精品国产亚洲一区二区三区在线观看 | 91精品综合久久久久五月天 | 国产色视频一区二区三区不卡 | 成人国产一区二区三区精品不卡 | 国产成人在线观看免费网站 | 国产成人av大片在线观看 | 国产欧美第一页 | 国产大片b站免费观看推荐 国产大片大全免费看软件下 | 国产精品伦视 | 国产成人毛片在线视频软件 | av在线免费观看综合区 | 国产av国片精品麻豆 | 91激情视频 | 国产精品人人操人人爽 | 精品动漫无码一区二区三区 | 国产在线观看免费视频在线 | 国产视频一区二区在线 | 91人妻精品一区二区三区蜜桃 | 国产美女午夜区一区二区三区 | 成人国产一区二区三区香蕉 | 国产激情高清在线视频免费观看 | 国产无码影视 | 国产精品高潮呻吟久久av旡码 | 2025久久精品免费观看 | 91成人午夜性a一级毛片 | 国产一区二区最新免费视频 | 国产成人三级视频在 | 国产爆操美女五月天 | 国产精品日本一区二区在线 | av伊人久久 | 18禁无遮挡肉动漫在线播放观看 | 99国产女人高潮抽搐喷浆视频 | 国产成人午夜精品免费视频 | 国产偷窥澡堂在 | 国产aaa级高清黄色 国产aaa免费视频国产 | 国产av无码专区亚洲av男同 | 国产麻豆剧传媒精品国产v 国产麻豆剧传媒精品国产v精品 | 成人免费的性色视频 | 成网人免费视频免费 | 国产一卡2卡三卡4卡精 | 国产精品国产三级在线专区丘 | 果冻传媒一区 | 国产av无码专区亚洲av果冻传 | 国产精品免费播放久久 | 国产精品白浆在线播放 | 国产aⅴ一区 | 国产在线一区二区三区免费大片 | 国产日韩一区二区三区高清 | 国产精品白浆在线观 | 91久久精品美女高潮喷水白 | av高清网址在线观看 | 91免费视 | 91精品导航在线观看 | 91久久偷偷做嫩 | 精品亚洲av无码 | 丰满人妻熟妇乱又伦精品视 | 国产美女高潮流白浆视频 | 成本人片无码中文字幕免费 | 国产系列丝袜熟女精品视频 | 91精品人妻一区二区三区蜜臀 | 国产原创中文无码精品视频 | 91精品国产一区二区 | 国产成人精品永久免费视频 | 国产一区二区三区日本道 | 国产精品码一区二区密挑 | 国产高清不卡一区二区三区 | 国产精品亚洲一区二区三区正片 | 国产精品一线免费观看 | 国产成人av在线影院无毒 | av天堂最新手机网址 | 国产美女精品久久久 | 国产黄网站视频 | 国产三a级日本三级日产三级 | 国产综合不卡一区在线视频 | 国产亚洲字幕手机在线 | 91无码人妻精品一区二区蜜桃 | 国产精品高清在线 | 国产精品无码制服丝袜 | 99国产精品欧美一区二区三区 | 国产精品一区在线观 | 国产成人精品一二区 | 国产中文男人天堂 | 国产av无码专区亚汌a√ | av无码久久久久不卡网站下载 | 国产成人www免费人 国产成人www免费人成看片 | 国产成人免费无码视频在线 | 国产女人乱人精品三区 | 国产福利一区二区三区高清 | 国产av无码国产av毛片 | a亚洲欧美中文日韩在线v日本 | av午夜福利一片免费看久久 | 高清不卡一区二区三区 | 国产无套粉嫩白浆免费 | 国产成人精品一二区 | 国产精品成人一区二区三区视频 | 国产色欲av一区二区三区麻豆 | 国产亚洲漂亮白嫩美女在线 | 国产产在线精品亚洲aavv | 精品麻豆一区二区 | 国产精品毛片久 | 18禁婷婷丁香久久精品人人 | 国产美女爽到高潮久久久 | 国产成年人未进视频 | 国产成人无码18禁午夜福利p | 国产精品成人无码视频 | 国产爆乳合集在线观看视频 | 囯产精品视频一区二区三区99 | 精品极品国产呦在线观看 | 国产成人精品自在钱拍 | 国产一区二区精选 | 成人在线中文字幕 | 国产成人欧美日韩在线电影 | 动漫av永久无码精品每日更新 | 99久久一品道官网 | 精品码一区二区三区 | 国产自美女在线精品尤物 | 国产成人v无码精品天堂 | 国产三级在线观看免费播放 | 国产区免费在线观看 | 国产黄频在线观看视频 | 国产99久久久国产精品潘金莲 | 大尺度做爰无遮挡动漫 | 91精品在线国产一区 | 国产在线精品国自 | 国产精品日本欧美一区三 | 国产成a人亚洲精v品久久网 | 国产成人亚洲欧美日韩精品 | 国产成人无精品久久久久国语 | 国产精品亚洲日韩aⅴ在线 国产精品亚洲日韩aⅴ在线观看 | 国产成人无码午夜视频在线播放 | 99国产在线一区 | 2025无码专区 | 成在人线āv无码毛片观看 成在人线av无码免费 | 东京熟一级片集 | 国产精品一区二区麻豆亚洲 | 国产中文字幕在线观看视频 | 成人精品一区二区三区 | 国产精品无套内射迪丽热巴 | 国产在线一区免费国产 | 国产精品无码av在线 | 国产成人啪精品午夜在线观看 | 国产女主播精品大秀系列在线 | 国语自产视频在线不卡 | 高清无码一区二区三区 | 不卡区一区二区三区国产 | 国产白嫩在线观看视频 | 18禁强伦姧人妻又大精品国产 | 91精品午夜福利在线观看 | 国内嫩模私拍精品视频 | 国产精品成人观看视频 | 极品尤物一区二区三 | 国产精品美女在线观看 | 99久久香蕉国产综合影院 | 国产亚洲成aⅴ人片在线观看蜜桃 | 国产熟女高潮精选 | 国产日韩精品无码去免费专区国产 | 国产美女作爱全过程免费视频 | 国产精品精华液网站 | 国产成人无码午夜视频在线观看 | 国产在线98福利播放视频免费 | 国产精品成人免费 | 福利小电影在线看 | 国产午夜精品理论片a级在线观看 | 国产美女精品久久久久久久免费 | 国产精品麻豆入口92 | 国产成人亚洲精品无码车a 国产成人亚洲精品无码青app | 成人3d动漫在线观看 | 国产女同无遮挡互慰高潮 | 91在线精品亚洲一区二区 | 国产免费内射又粗又爽密桃视频 | 国产av人妻无码一区二区 | 国产一区二区波多野结衣 | 99国产成人综合久久精品77 | 精品国产日韩一区2区3区 | 91视频黄版app| 国产人妻一区二区 | 国产精品日日摸夜夜添夜夜添 | 国产高清日韩在线播放 | 国产女人高潮免费视频在线观看 | 国产精品国产精品专区不卡 | 国产一区二区三区四区五区不卡 | 91免费在线影院 | 国产精品无码污污污免费网站 | 东京热一区二区三区 | 国产午夜片无码区在线观看爱情 | 国产亚洲综合另类一区二区 | 国产免费无码一区二区 | 国产精品嫩草影院一二三区 | 精品亚洲欧美v国产一区二区三区 | 国产成人久久一区二区不卡三区 | 国产精品亚洲日韩av在线 | 国产av秘无码一区区三区 | 国产无套在线观看视频 | 国产av无码字幕制服高清 | 国产黄色三级电影免费观看 | 成人国产网站v片免费观看 成人国产亚洲精品a区天堂 | 国产精品成人嫩草影院 | 成人免费在线观看毛片 | 国产三级精品三级在 | 国产欧美成人不卡视频 | 国产3p露脸| 91麻豆精品一二三区在线 | 成人午夜精品久久久久久久 | 国产黄色一级大片 | 国产成人免费观看 | 国产精品艺校美女校花在线 | 91精品国产91久久综合牛牛 | 91久久久久就去色色精品 | 国产成人麻豆精品午夜福利在 | 国产精品久久久久精品三级a | 国产成人啪精品免费观看 | 高清自拍亚洲精品二区 | 国产欧美va | 国产精品一区二区日韩欧美 | 国产精品成人麻烦视频 | 国产美女作爱全过程免费视频 | 国产亚洲第一精品社区麻豆 | 成人片黄网站久久久免费 | 国产精品.xx视频.xxtv | 成人精品国产一区二区三区 | 动漫精品中文字幕无码第一页 | 精品国产91无码大片在线观看 | 91久久国产视频 | 国产av高清一区二区三区 | 91精品三级在线观看播放 | 国产精品无码一二区免费 | 国产二级毛片 | 国产精品高潮露脸在线观看 | 91人人妻人人做人人爽男同 |