老司机夜插-理伦理片-理伦片免费-理伦片免费观看-理伦片免费看-理伦日韩-理论福利片-理论片第一页-理论片电影-理论片理论

金喜正规买球

3D格式轉(zhuǎn)換神器HOOPS Exchange使用教程(二):檢索可視化工作流的圖形數(shù)據(jù)

原創(chuàng)|3D產(chǎn)品功能介紹|編輯:何家巧|2022-08-31 11:45:40.093|閱讀 228 次

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

# 界面/圖表報(bào)表/文檔/IDE等千款熱門(mén)軟控件火熱銷(xiāo)售中 >>

相關(guān)鏈接:

HOOPS Exchange是什么?

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


本章我們學(xué)習(xí)創(chuàng)建一個(gè)使用 加載文件并使用 Qt3D 將其可視化的跨平臺(tái)應(yīng)用程序。

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

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

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

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

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

       ; A3DMiscTransformation *result = nullptr ;

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

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

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

命名空間{
  QColor getColor(A3DUns32 const &color_idx, int  const &a) {
    如果(A3D_DEFAULT_COLOR_INDEX == color_idx){
      返回QColor( 255, 0, 0 );
    }
    A3DGraphRgbColorData rgb_color_data;
    A3D_INITIALIZE_DATA(A3DGraphRgbColorData, rgb_color_data);
    A3DGlobalGetGraphRgbColorData(color_idx, &rgb_color_data);
    自動(dòng) 常量&r = rgb_color_data.m_dRed;
   ; 自動(dòng) 常數(shù)&g = rgb_color_data.m_dGreen;
    自動(dòng) 常量&b = rgb_color_data.m_dBlue;
    返回QColor( static_cast<int>(r * 255), static_cast&lt;int>(g * 255), static_cast<int>(b * 255), a);
  }
}
顏色數(shù)據(jù)通過(guò)整數(shù)索引存儲(chǔ)在 中。這個(gè)實(shí)現(xiàn)首先檢查索引是否等于A3D_DEFAULT_COLOR_INDEX,表示沒(méi)有分配顏色。在這種情況下,我們返回紅色,你會(huì)認(rèn)為這是我最喜歡的顏色,但你錯(cuò)了。從 Exchange 的雙精度定義創(chuàng)建QColor對(duì)象是一件簡(jiǎn)單的事情,自然而然。
通過(guò)此實(shí)現(xiàn),您會(huì)發(fā)現(xiàn)許多部件現(xiàn)在將加載并以正確的顏色顯示。
讓我們添加一個(gè)額外的案例來(lái)處理樣式數(shù)據(jù)可以采用的兩種或三種形式。使用以下 else 塊更新 createMaterial 中的 if 子句。
否則{
  A3DBool is_textuture = false ;
  A3DGlobalIsMaterialTexture(style_data.m_uiRgbColorIndex, &is_texuture);
  如果(!is_textuture){
    A3DGraphMaterialData material_data;
&nbsp;   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));
    if (ambient_color.alpha() == 255 &&diffuse_color.alpha() == 0) {
    材料->setDiffuse(ambient_color);
    }否則 if (ambient_color.alpha() == 0 &&diffuse_color.alpha() == 255) {
&nbsp;     &nbsp; 材料->setDiffuse(diffuse_color);
    }
    材質(zhì)->setSpecular(getColor(material_data.m_uiSpecular,material_data.m_dSpecularAlpha));
  }
}
這可以處理稍微復(fù)雜的材質(zhì)定義。處理紋理超出了本基本查看教程的范圍。我們已經(jīng)處理了兩種最常見(jiàn)的樣式定義情況,并且我們正在返回一個(gè)合理的 Qt3D 材料。
結(jié)論

恭喜!您已經(jīng)完成了涵蓋基本查看工作流程的非常詳細(xì)的教程。在此過(guò)程中,您了解了 裝配結(jié)構(gòu)及其對(duì)零件顯示方式的影響。您學(xué)習(xí)了如何閱讀曲面細(xì)分的基本形式并將其解釋為一種常見(jiàn)的基于緩沖區(qū)的查看技術(shù)。我們通過(guò)讀取變換數(shù)據(jù)將對(duì)象放置在正確的位置和方向上,最后為每個(gè)部分應(yīng)用合理的材料,使它們看起來(lái)像預(yù)期的那樣。

了解HOOPS技術(shù)詳情歡迎進(jìn)入


慧都科技是中國(guó)地區(qū)的指定經(jīng)銷(xiāo)商,提供售賣(mài)、HOOPS 60天的免費(fèi)試用、中文技術(shù)支持,同時(shí)提供工業(yè)3D解決方案如果您對(duì)此感興趣,歡迎電話咨詢(xún):023-68661681

↓ ↓ 關(guān)注“HOOPS技術(shù)”微信公眾號(hào),了解HOOPS技術(shù)的真實(shí)應(yīng)用 ↓ ↓



標(biāo)簽:

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


為你推薦

相關(guān)產(chǎn)品
控件
  • 產(chǎn)品功能:三維矢量圖處理
  • 源 碼:非開(kāi)源
  • 產(chǎn)品編號(hào):14225
  • 當(dāng)前版本:V2025.5.0 [銷(xiāo)售以商家最新版為準(zhǔn),如需其他版本,請(qǐng)來(lái)電咨詢(xún)]
  • 開(kāi) 發(fā) 商: Tech Soft 3D 正式授權(quán)
  • ">HOOPS Exchange

    更快、更準(zhǔn)確的CAD數(shù)據(jù)轉(zhuǎn)換工具包,3D數(shù)據(jù)格式轉(zhuǎn)換首選解決方案。

    控件
  • 產(chǎn)品功能:三維矢量圖處理
  • 源 碼:非開(kāi)源
  • 產(chǎn)品編號(hào):14227
  • 當(dāng)前版本:V2025.5.0 [銷(xiāo)售以商家最新版為準(zhǔn),如需其他版本,請(qǐng)來(lái)電咨詢(xún)]
  • 開(kāi) 發(fā) 商: Tech Soft 3D 正式授權(quán)
  • ">HOOPS Communicator

    工業(yè)級(jí)高性能3D渲染引擎,專(zhuān)注于Web端工程圖形渲染。

    控件
  • 產(chǎn)品功能:三維矢量圖處理
  • 源 碼:非開(kāi)源
  • 產(chǎn)品編號(hào):12161
  • 當(dāng)前版本:V2025.5.0 [銷(xiāo)售以商家最新版為準(zhǔn),如需其他版本,請(qǐng)來(lái)電咨詢(xún)]
  • 開(kāi) 發(fā) 商: Tech Soft 3D 正式授權(quán)
  • ">HOOPS Visualize

    強(qiáng)大的工業(yè)級(jí)3D渲染引擎,為您打造出眾的工程應(yīng)用程序

    控件
  • 產(chǎn)品功能:三維矢量圖處理
  • 源 碼:非開(kāi)源
  • 產(chǎn)品編號(hào):14230
  • 當(dāng)前版本:V2025.5.0 [銷(xiāo)售以商家最新版為準(zhǔn),如需其他版本,請(qǐng)來(lái)電咨詢(xún)]
  • 開(kāi) 發(fā) 商: Tech Soft 3D 正式授權(quán)
  • ">HOOPS Publish

    讓您的應(yīng)用可將3D數(shù)據(jù)以原生3D PDF、HTML和標(biāo)準(zhǔn)CAD格式進(jìn)行發(fā)布。

    掃碼咨詢(xún)


    添加微信 立即咨詢(xún)

    電話咨詢(xún)

    客服熱線
    023-68661681

    TOP
    亚洲18岁禁止 | 成人激情小视频 | 久久国产精品99国产精 | 久久96国产精品久久久 | 欧美69视频 | 亚洲2024无矿砖码砖区 | 五月天丁香婷婷开心激情五月 | 制服丝袜中文在线 | 九九热re | 国产激情久久久久久影院 | 成年看片永远免费 | 伊在人亚洲香蕉精品区 | 青青青视频蜜桃一区二区 | 精品国产三级a | 最新中文字幕在线资源 | 黄网址大全免费观看免费 | 韩国日本免费不卡在线丷 | 日本无码精品一区二区三 | 打屁股gay | 亚洲国产香蕉视频欧美 | 蝴蝶色综合综合成人网 | 国产精品成人A片在线果冻 国产精品大尺度尺度视频 国产精品对白交换视频 | 荡公乱妇第1章方情公憩系列大 | 五月天社区 | 久久精品国产福利国产琪琪 | 97在线资源站 | 视频一区在线免费观看 | 中国一级毛片 | 日产中文乱码字幕无线观看 | 精品综合久久88色鬼首页 | 国产精品人妻一区免费看8C0M | 免费观看亚洲视频 | 女体拷问研究所下载 | 麻豆产精国品 | 色人阁久久 | 嗯 好深 啊 用力 哦 嗯 啊视频 | 国产精品一区成人精品 | 国产AV国片偷人妻麻豆潘甜 | ふたりの兄嫁 | 免费一级特黄欧美大片久久网 | 国产传媒在线观看视频免费观看 | 吃奶呻吟打开双腿做愛 | 长篇YIN荡乱合集小说免费TXT下载 | 国产精品日本不卡一区二区 | 韩日美无码精品无码 | 偷国精产品久拍自产 | 黄色在线网 | 69老司机精品视频免费观看 | 国产精品视频在线观看 | 国产熟妇无码A片AAA毛片视频 | 免费黄色欧美 | 国产强伦姧人妻电影 | 好硬啊一进一得太深了A片 好涨好爽好大视频免费 | 色柚视频网站ww色 | 一道本不卡一区 | 自偷自拍三级全三级视频 | 国精品人妻无码一区二区三区软件 | 囯产精品宾馆在线精品酒店 | 啪啪啪视频高清 | 欧美人妻WWW无码国产黄漫 | 日本高清com | 老师的丰满大乳奶水在线观看 | 色情欧美片午夜国产特黄 | 精品久久久久久蜜臂a∨ | 精品视频99 | 中文字幕乱码亚洲精品一区 | 波多野结衣hd系列在线播放 | 99国产成人精品2021 | 午夜影院a级片 | 性奴抽插乳中出精没射视频搜索 | 看美国毛片 | 国产成人av在线免播放观看 | 苍井空人体b | 一级做a爰性色毛片免费 | 亚洲中国精品精华液 | 毛茸茸xxxx免费视频hd | 色欲AV亚洲午夜精品无码 | 日本欧美中文字幕人在线 | 黄瓜污影院| 一级黄色毛片免费看 | 四房播播婷婷基地 | 三级在线看中文字幕完整版 | 九九精品超级碰视频 | 国产美女一区二区 | 2020欧美极品hd18 | 日本中文字幕高清 | 日韩高清一区二区 | 国产成人精品无缓存在线播放 | 国产三级精品三级在线观看 | 开心四播网 | 欧美日韩精品在线 | 东京道一本热中文字幕 | 青草草在线观看免费视频 | 久久久国产麻豆 | 久久片| 一边摸一边桶一边脱免费 | 涩涩快播| 精品国产污污免费网站入口 | 成片一卡三卡四卡免费网站 | 蜜桃视频在线观看免费视频网站WWW | 亚洲高清无在码在线电影 | 午夜理论在线观看不卡大地影院 | 欧美一级久久 | 欧美亚洲精品真实在线 | 另类色 | 午夜A级理论片左线播放 | 男人把女人桶到喷白浆的软件免费 | 国产又大又黑又粗免费视频 | 欧美内射深喉中文字幕 | 久久久综合结合狠狠狠97色 | 青草国内精品视频在线观看 | 欧美亚洲h在线一区二区 | 男子扒开美女尿口做羞羞的事 | 四房色播电影 | 女同学粉嫩无套第一次 | 丰满年轻岳欲乱中文字幕电视 | 久久免费看少妇高潮A片JA | 久久免费播放 | 国产电影一曲二曲三曲图片 | 日本人妖miran护士 | 伊人小视频 | 久久免费看少妇高潮A片小说 | 永久午夜福利视频一区在线观看 | 久久影院午夜理论片无码 | 亚洲黄业| 婷婷亚洲视频 | 久拍国产在线观看 | 99视频导航 | 最近中文免费字幕1 | 男人天堂第七色 | 无码人妻丰满熟妇A片护士M | 天天色 | 狠狠色丁香久久综合网 | 国产ts最新人妖在线 | 性做爰A片免费看网站 | 一本色道久久88一综合 | 亚洲欧美国产精品久久久 | 91视频青青| 国产又色又爽又黄刺激在线视频 | 青草免费观看 | 国产又粗又爽又猛的视频A片 | 中文字幕你懂的 | 无人视频在线观看播放免费 | 在车里被弄了H野战 | 狠狠色丁香婷婷久久综合五月 | 国产精品亚洲专区在线播放 | 亚洲AV无码一区二区色情蜜芽 | 国产激情视频在线 | 91在线视频播放 | 黄色一级欧美 | 攻把受做哭边走边肉楼梯PLAY | 国产日韩精品SUV | 久久久久久综合对白国产 | 国产欧美熟妇另类久久久 | 亚洲中文字幕无码专区日本苍井空 | 久久久这里只有精品免费 | 手机在线观看视频免费视频 | 午夜影院一区二区 | 亚洲欧美日本国产高清 | 色猫成人| 亚洲h视频在线 | 久久经典免费视频 | 亚洲一级毛片免费在线观看 | 在线一二三区国产色情无码电影 | 欧美 日本 亚欧在线观看 | 日韩毛片网| 边吃奶边狠狠躁日韩A片 | 天美麻豆| 99久久免费国产精精品 | 99re5久久在热线播放 | 久久国产精品久久久久久 | 免费国产成人午夜私人影视 | 国产91一区二区在线播放不卡 | 日本黄A级A片国产免费 | 免费三圾片在线观看 | 欧洲无码八A片人妻少妇 | 日韩黄色成人 | 欧美成人国产一区二区 | 成年视频xxxxxx在线 | 狠狠色噜噜狠狠狠狠网站视频 | 狠狠色噜噜狠狠狠狠888奇米 | 漫画老师全彩超级巨大乳 | 免费的日本网站 | 97色论 | 丝瓜app汅api免费丝瓜在线下载 | 骚骚骚色爱 | 欧美肥老女人 | 日本免费一区视频 | 久久精品一本到99热免费 | 国产又爽又黄无码无遮挡在线观看 | 久久曰视频| 亚洲区色情区激情区小说 | 免费在线看黄网站 | 亚洲 无码 在线 专区 | 国产一级视频 | 少妇和黑人老外做爰 | 青草青草久热国产精品 | 免费高清日本 | 中文无码第3页不卡av | 99精品久久精品一区二区 | 一级做a爰片性色毛片思念网 | 欧美黑人猛性暴交 | 日本精品99 | 久久99精品一久久久久久 | 欧美三级在线视频 | 国产高潮呻吟无码精品AV | 色播五月www 222uk | 特级毛卡片现场直播 | 伊人久久国产免费观看视频 | 国产午夜精品久久久久 | 亚洲自偷自拍另类图区 | 激情丁香开心久久综合 | 亚洲香蕉影院 | 干b在线| 人妻免费久久久久久久了 | 意大利色情肉欲乐园 | 工口里番h彩色无遮挡全彩 工口里番全彩全彩无遮挡 工口里番全彩无肉码3D啪啪 | 黄色专区| 朱竹清把我夹得又紧又爽 | 澳门一级毛片手机在线看 | 亚洲精品卡一卡2卡3卡4卡 | 国产超碰AV人人做人人爽 | 国产免费看插插插视频 | 日韩免费中文字幕 | 麻豆传媒新剧国产30部 | 大胆日本无码一区二区 | 国产婷婷亚洲999精品小说 | 天上人间av网 | 西安润基投资控股有限公司 | 老司机午夜免费福利 | 国产91一区二区在线播放不卡 | 最新国模无码国产在线视频 | 校花岔开玉腿欲液横流 | 黄网站色网址 | 精品国产午夜肉伦伦影院 | 亚洲AV无码区在线观看东京热 | 亚洲最大的成人网 | 欧美黑人猛性暴交 | 永久无码日韩A片免费看麻豆精品 | 亚州少妇无套内射激情视频 | 免费一级做a爰片久久毛片 免费一级特黄欧美大片久久网 | 亚洲日本高清成人aⅴ片 | 亚洲日本中文字幕 | 艳情短篇辣文合 | 狠狠躁| 久久久久久久久久免免费精品 | 亚洲色欲色欲WWW在线看小说 | 国产精品黄在线观看免费软件 | 国产超碰AV人人做人人爽 | 国产超高清麻豆精品传媒麻豆精品 | 五色网| 夜夜狠操 | 亚洲乱码AV久久久久久久 | 亚洲免费天堂 | 国产精品综合色区 | 天天玩夜夜操 | 欧美成熟毛茸茸复古 | 真人做爰到高潮A级 | 欧美另类高清 | 免费啪视频在线观看视频日本 | 2024色情在线无码 | 免费观看波多野结衣 | 国产精品久久久久久久A片冻果 | 四虎国产精品免费五月天 | 人体内射精一区二区三区 | 日本三级韩国三级三级a级按摩 | 亚洲 色 欧美 爱 视频 日韩 | 苍井空大尺寸视频大全 | 巜疯狂的少妇4做爰HD | 欧美成人无码视频午夜福利 | 91热久久免费频精品动漫99 | 黄页网站视频免费 视频 | 成人影院app | 91精品综合| 午夜在线.XYZ | 久久88色综合色鬼 | 国产成人高清精品免费软件 | 阳茎进去女人阳道过程免费看 | а8天堂资源在线官网 | 欧美色网络 | 国产美女无遮挡裸体毛片A片软件 | 国产69式A片 | 免费看一级黄色毛片 | 一区二区三区精品道 | 狠狠躁日日躁夜夜躁A片55动漫 | 日本无码熟妇人妻在线视频免费看 | 武侠艳妇屈辱的张开双腿 | 高清成人影院 | 亚洲国产欧美中文手机在线 | 闺蜜把春药放进我下面那个 | 一区二区三区四区免费视频 | 欧美伊人| 高h全肉纯肉 高质量 | 女18一级大黄毛片免费女人 | 伧理片午夜伧理片毛片日本 | 久久综合桃花 | 人色网| 91国在线国内在线播放 | 国产精品热久久高潮AV袁孑怡 | 玩弄丰满少妇XXXXX性多毛 | 在线视频精品一区 | 国产伦精品一区二区三区免.费 | 日本成人在线免费观看 | 国产亚洲精品久久久性色情软件 | 久久久91精品国产一区二区 | 欧美黄色免费网址 | 四虎最近网站是多少 | 乱人妻人伦中文字幕 | av国产精品| 欧美精品18videosex性欧 | 日本19岁护士伦理在线 | 强奷漂亮的女邻居完整版 | 日操夜操 | 芊芊的被校长脔日常H | 一区二区三区精密机械 | 国产精品久久久久久免费 | 秋霞韩国伦理电线看 | 久草在线草a免费线看 | 久久久国产精品网站 | 丁香综合激情 | 一级做a爱过程免费观看 | 中文字幕乱码高清完整版 | 好爽插我添我BB | 欧美日韩精品无码免费看A片 | 99只有精品| 日日撸影院在线 | 久久88台湾三级香港三级 | 欧美日韩在线看 | 国精视频一卡二卡三卡四卡 | 五月婷婷六月丁香在线 | 国产jizzjizz视频全部免费 | 51国偷自产一区二区三区 | 97视频在线观看免费 | 国产剧情精品在线 | 亚州黄色网址 | 久在线| 久久日本精品在线热 | 国产激情无码激情A片免费软件 | 欧美日产国产AC | 色狠狠狠狠综合影视 | 日本JIZZ免费视频 | 午夜小网站| 国产三级黄色毛片 | 日韩精品中文乱码在线观看 | 欧美高清在线视频一区二区 | 日韩国产精品欧美一区二区 | 李梦大尺度照被曝光 | 成人福利网站 | 青草视频免费观看 | 麻豆MD传媒MD0049入口 | Jjzjizjizjiz日本老师水多 | 在线成人综合色一区 | 日本a级片免费 | 成人网站免费观看 | 国产骚b| 滋润岳的性饥渴花落伴官途 | 五月天激情视频在线观看 | 小说区图片区激情区视频区 | 中文字幕在线视频一区 | 欧美一区二区在线观看免费网站 | 九九99线视频在线观看 | 成人AV免费网址在线观看 | 老司机午夜免费福利视频 | 国产经典自拍 | 美女久久久久久久久久久 | 无人区乱码区1卡2卡三卡在线 | 漂亮的丰年轻的继坶3在线观看 | 精品国产人妻一区二区三级 | 欧美日韩在线观看视频 | 宅男噜噜66 | 日韩不卡在线播放 | 日日摸天天添天天添无码蜜臀 | 亚洲国内精品自在线影院牛牛 | 免费视频不卡一区二区三区 | 日本视频二区 | 日本亚欧色情 | 成人免费影院 | 欧美男生射精高潮视频网站 | 色婷婷在线视频 | 狂野欧美 | 国产在线精品福利大全 | 成人电亚洲在线 | 亚洲乱码一卡2卡3卡 | 高清无码在线苍井空 | 国产色综合天天综合网 | 久久久精品欧美一区二区免费 | 免费欧美黄色 | 日韩大片在线永久免费观看网站 | 91欧美视频 | 亚洲欧美日本 | 色啪视频 | 日韩电影一二三区 | 国产干美女 | 亚洲制服丝袜在线观看 | 精品国产青草久久久久福利 | 国色天香视频在线社区 | 久久精品中文字幕第一页 | 波多野吉衣一区二区 | 欧美人成在线观看ccc36 | 麻豆精品一卡2卡三卡4卡免费观看 | 青草视频青年娱乐 | 91老肥熟 | 色播五月激情五月 | 日本免费中文字幕 | 日本久久久久久久做爰片日本 | 国产最新一区二区三区天堂 | 午夜性啪啪A片免费播放 | 99SE久久爱五月天婷婷 | 免费观看日韩大尺码观看 | 中文字幕久久精品波多野结 | 亚洲色熟偷拍视频在线 | www黄色大片 | 久久久久久99精品 | 天美麻豆 | 欧美人与性动交a欧美精品 欧美人与物videos新另类性 | 五月天婷婷色综合 | 国产欧美日韩视频免费 | 成人综合国产乱在线 | 国产不卡在线看 | 2024一級特黃色毛片免費看 | 国产在线欧美精品中文一区 | 色综合桃花网 | 亚洲国产精品一区二区第一页 | 最近中文国语字幕在线播放 | 日日噜噜噜夜夜爽爽狠狠视频 | 人妻洗澡被强伦姧完整国产 | 韩国最污禁网站免费观看 | 最近最好看中文字幕免费 | 午夜在线观看视频免费成人 | 久久黄色片| 日韩亚洲精品无码一区二区 | 亚洲欧美网 | 欧美日韩福利视频一区二区三区 | 蝴蝶色综合综合成人网 | 男人都懂www深夜免费网站 | 精品无码一区二区三区不卡 | 久久er视频| 日日澡| 国产大片黄在线观看 | 色精品极品国产在线视频 | 久久亚洲国产成人亚 | 日本欧美一区二区三区片 | 97SE亚洲国产综合自在线不卡 | 欧美精品 在线观看 | 亚洲欧洲成人 | 9900LU永久跳转 | 国产一区二区三区无码A片 国产一区二区三区乱码在线观看 | 欧美一道本一区二区三区 | 亚洲综合AV色婷婷五月蜜臀 | 色人阁26uuu| 免费久久久久 | 影音先锋男人资源 站 | 少妇厨房出轨激情做爰 | 最新网站网址永久发布 | 九九久久看少妇高潮A片特黄 | 综综综综合网 | 国产成人久久精品二区三区 | 国产精品久久久久久小说 | 男男性纯肉小说 | 国产三级久久 | 亚洲精品成人在线 | 最好看免费视频大全在线观看 | 午夜西瓜视频在线观看 | 少妇伦子伦精品无吗 | 国产又湿又黄又硬又刺激视频 | 琪琪电影午夜理论片77网 | 欧美极品第一页 | 中文字幕人妻少妇引诱隔壁 | 狠狠色丁香久久婷婷综 | 公交车上荫蒂添的好舒服的电影 | 黄页在线观看免费 | 操欧美女 | 国产福利2021最新在线观看 | 日本韩国欧美在线观看 | 亚洲国产免费 | 欧美一区二区三区激情视频 | 成人瑟瑟| 欧美一区二区在线免费观看 | 国产做A爱片久久毛片A片高清 | 免费精品美女久久久久久久久久 | 国产精品久久久久久久免费A片 | 波多野结衣视频一区二区 | 日韩欧美在线观看视频一区二区 | 牛牛免费视频 | 中文字幕在线综合 | 人妻寂寞按摩中文字幕 | 囯产精品一区二区三区线 | 久久精品99久久香蕉国产色戒 | 四虎影视在线观看2024a | 亚洲精品色播一区二区 | 无人在线观看免费高清直播视频 | 色天天网 | 亚洲精品久久无码AV片亚洲 | 色噜噜综合熟女人妻一区 | 久久久免费观看 | 国产精品视频一区二区猎奇 | 亚洲天堂最新网址 | 亚洲AVAV天堂AV在线网爱情 | 国产亚洲精品久久久久久老妇 | 张津瑜 警察网 | 人人爽久久久噜噜噜丁香AV | 色综合天天娱乐综合网 | 波多野结衣全集在线观看 | ACG全彩绅士口工侵犯漫画 | 黄色片网站在线 | 亚洲综合中文字幕无线码 | 中文字幕高清在线中文字幕 | 她的两片蚌肉张开白浆直流 | 亚洲色婷婷久久精品AV蜜桃 | 成年人在线免费网站 | 黑人狂躁日本妞无码A片视频 | 免费在线亚洲视频 | 快穿之被系统肉到哭H | 深夜日韩 | 国产成人爱片免费观看视频 | 国产精品高潮呻吟AV久久无码 | 97在线视频免费观看97 | 国产精口品美女乱子伦高潮 | 欧美四房播播 | 亚洲精品蜜夜内射 | 国产AV久久人人澡人人爱 | 狠狠撸电影院 | 日日摸夜夜欧美一区二区 | 午夜视频网址 | www夜夜操com| 2019中文字幕乱码免费 | 色天情五月 | 国产精品原创永久在线观看 | 毛片观看网站 | 日韩国产欧美一区二区三区 | 少妇无码吹潮久久精品AV网站 | 蜜桃日本免费MV免费播放 | 一区二区无码精品AV | 天天摸夜夜添夜夜添A片小说 | 最近中文字幕视频国语中文字幕 | a级高清免费| 久久国产精品人妻中文 | 美女性爽视频国产免费 | 性xxxx视频在线观看 | 免费一级特黄欧美大片久久网 | 91一区二区三区四区五区 | 国产一起色一起爱 | 亚洲欧美日韩国产精品26u | 女主播在线观看 | 日韩免费高清视频 | 三级韩国2019在线现看 | v片在线观看 | 国产高潮A片羞羞视频涩涩 国产高潮抽搐在线观看 | 欧美特黄99久久毛片免费 | 欧美bbww| 少妇被躁爽到高潮无码久久 | 国产69精品久久久久99不卡 | 亚洲精品久久无码AV片WWW | 伊人久久免费 | 大陆一级毛片无遮挡 | 忘忧草日本在线WWW日本 | 亚洲日本国产综合高清 | 秋香蕉丝瓜榴莲污APP下载 | 青青青青青国产免费手机看视频 | 男女一边摸一边做爽爽的免费文字 | 性色在线视频 | 黄色毛片在线 | 欧美丰满大乳无码少妇 | 婷婷久月 | 亚洲高清二区 | 欧美中文字幕在线视频 | 国产午夜毛片 | 国产亚洲精品AV片在线观看播放 | 偷拍亚洲制服另类无码专区 | 成年人网站在线免费观看 | av在线观看地址 | 成人午夜A片产无码免费视频日本 | 爱插综合网 | 波多野结衣一区2区3区 | 四虎 在线播放 | 欧美变态口味重另类牲交视频 | 欧美性生交BBBXXXXX无码 | 免费国产在线观看老王影院 | 小片网| 撕开奶罩揉吮奶头的A片 | 日本高新1区2区3区 日本高清中文字幕 | 国产成人AV三级在线影院 | 歪歪漫画羞羞漫画国产 | 极品美女扒开粉嫩小泬图片 | 国产精品福利影院 | 日本无码人妻精品一区二区视频 | 色丁香久久 | 欧美噜噜| www精品久久 | 久久道| 国产目拍亚洲精品一区二区 | 五月婷婷激情视频 | 92kyy福利合集 | 久久国产露脸老熟女 | 色婷婷免费视频 | 2022国产成人精彩在线视频 | 91网在线 | 99在线观看国产 | 黄色三级网站在线观看 | 欧美噜噜 | 掀起衣服揉她的奶头亲吻视频 | 国产精选免费视频 | 终结的炽天使动漫免费观看第一季 | 黄色一级小视频 | 亚洲AV无码A片一区二区三区 | 中文字幕韩国三级少妇在线光看 | 色婷婷中文字幕在线一区天堂 | 自拍 另类 图片区 亚洲 | 国产九精品国产动漫人物 | 国产影片大全 | 玖玖在线资源站 | 亚洲日本激情 | 欧美女同在线观看 | 国产成人精品综合久久久软件 | 永久免费看MV网站入口亚洲 | 亚洲天堂.com | 日本三级日产三级国产三级 | 四虎永久地址WWW成人免费 | 日日噜噜夜夜爽爽 | 午夜精品成人毛片 | 免费网站看片成年 | gogo亚洲肉体艺术照片9090 | 国产精品一区二区免费 | 国产激情在线 | 色哟哟在线网站 | 少妇人妻AV毛片在线看 | 久cao在线香蕉69影院 | 黄色在线免费网站 | 日本院线影片 | 激情婷婷丁香 | 一个人看的免费观看日本电影 | 久久99精品久久久久久秒播 | AA级女人大片 | 亚洲欧美中文日韩在线v日本 | 99视频偷窥在线精品国自产拍 | 妈妈色成人网 | 黑人狂躁日本妞无码A片 | 女人下边被添全过程A片小说 | 亚洲成A人无码亚洲成WWW牛牛 | 熟女人妻久久中文字幕一二区 | 成熟人妻AV无码专区A片 | 欧美一区二区日韩一区二区 | 亚洲欧洲日本无在线码播放 | 樱花草免费视频在线观看WWW | 挺进去岳就不挣扎了的视频 | 束美阁影视传媒 | 国内自拍第五一页 | 国产护士在病房AV做爰小说 | 玫瑰之战电视剧免费 | 日韩人妻鲁交色情精品视频 | 日本美女性生活 | 动漫精品视频一区二区三区 | 少妇P毛又多又黑A片免费 | 亚洲欧洲一区二区三区在线 | 7723日本电影免费观看完整版 | 一区二区久久日韩一片棋牌 | 国产成人高清视频免费播放 | 日本久久精品视频 | 久久视频在线观看精品 | 国产精品久久毛片完整版 | 亚洲精品综合久久 | 国产精品日本一区二区在线播放 | 国产乱女乱子视频在线播放 | 亚洲色欲色欲www在线观看 | 91福利网址导航 | 欧美最猛性xxxxx喷水 | 欧美性xxxxxbbbbbb精品 | 最新精品国偷自产在线69 | 久久99国产精品久久 | 亚洲一区二区观看播放 | 日本无码看片视频一区 | 亚洲欧美日韩精品久久 | www.黄色片网站 | 国产极品JK白丝喷白浆在线观看 | 亚洲熟妇AV乱码在线观看 | 天天干夜夜骑 | 最近免费中文字幕完整5 | 成年人网站在线观看免费 | 中文字幕日本一区 | 中文字幕无码无卡视频 | 亚洲色女图 | 午夜影院视费x看 | 亚洲se吧 | 久久久久国产成人精品 | 天天草综合网 | 国产精品自产拍在线观看中文 | 国产精品无卡无在线播放 | 国产亚洲欧洲人人网 | 99视频国产精品免费观看app | 一级黄色a | 人妻少妇被粗大爽9797PW | 日日麻批免费视频播放高清 | 久久婷婷五月综合色国产 | 日本三区四区免费高清不卡 | 一个人看的www在线看视频 | 操美女免费视频 | 一个人看的视频观看免费高清 | 国产人妻午夜在线无码 | 三妻四妾免费播放电视剧大全 | 日本高清视频免费看 | 波多野结衣久久高清免费 | 欧美亅性猛交内射 | 麻豆91av | 国产成人精品亚洲精品一区色欲 | 国产亚洲精品久久yy50 | 老太婆毛片| 亚洲美女视频高清在线看 | 久久综合五月开心婷婷深深爱 | 小明永久成人一区二区 | 亚洲精品久久国产高清 | 成年在线观看网站免费 | 免费观看一级欧美在线视频 | 国产精品免费露脸视频 | 国产一卡三卡四卡无卡精品 | 国精产品一区二区三区有限公司 | H嗯啊高潮抽搐A片视频欧美 | 国产资源在线观看 | 草草在线影院 | 欧美日韩精品一区二区三区高清视频 | 毛片美国基地 | 久久精品国产亚洲AV成人 | 日韩免费一区二区三区在线 | 一个人免费完整在线观看日本 | 特级做A爰片毛片免费看无码 | 伊人久久香 | 伊人久久大香网 | 午夜网站视频 | 三级在线看中文字幕完整版 | 亚洲 欧美 自拍 制服 另类图片 | 3d肉蒲团观看地址 | 国产美女一级做视频爱 | 亚洲精品一卡2卡3卡4卡乱码 | 免费国产黄网站在线看品善网 | 精品久久一 | 久久受www免费人成_看片中文 | 人人做人人干 | 波多野结衣中文字幕久久 | 国产最新一区二区三区天堂 | 色婷婷中文字幕在线一区天堂 | 国产亚洲3p无码一区二区 | 中国大陆一级毛片免费 | 一级在线视频 | 色mimi| 中文字幕在线免费观看视频 | 午夜福利国产在线观看1 | 咪咪色影院| 少妇性BBB搡BBB爽爽爽 | 国产综合成人久久大片91 | 日日夜人人澡人人澡人人看免 | 国产精品卡一卡2卡三卡网站 | 斯大林格勒战役免费高清观看 | 91青青国产在线观看免费 | 殴美一级| 精品人妻无码一区二区三区9 | 三级黄色片网站 | 伊人2024视频免费观看 | 成人免费精品网站在线观看影片 | 91在线看视频 | 亚洲黄色网页 | 亚洲图片你懂得 | 国产精一品亚洲二区在线播放 | 最近中文字幕高清字幕MV | 国语对白免费观看网址 | 国产又色又爽又黄的A片 | 欧美日韩综合一区 | 一女多男np高辣文h 一女多男nP现代高H | 免费超级淫片日本高清视频 | v片在线播放| 亚洲另类激情专区小说 | 中文字幕乱人伦视频在线 | 性欧美大战久久久久久久野外黑人 | 久久久久国产亚洲日本 | 久久这里的只有是精品23 | 亚洲黄色网 | 久久精品国产72精品亚洲 | 五月婷六月婷婷 | 久久精品免看国产 | 邻居寂寞人妻中文字幕 | 欧美本道| 国产成人综合久久 | 在线观看国产久青草 | 久久精品免费看 | 俺去也成人 | 婷婷深爱 | 久久精品免费看 | 成人国成人国产SUV 成人好色网 | 日本加勒比在线精品视频 | 男女ppp视频| 欧洲肥女 yourlust.com | 麻豆人妻无码性色AV | 日本中文字幕网站 | 成人黄网18免费观看的网站 | 飞空精品影院首页 | 国产 精品 自在 线 囯精品人妻无码一区二区三区99 | 成人午夜羞羞爽爽视频欧美 | 777狠狠| 在线不卡日本v二区到六区 在线岛国片免费观看无码 在线高清无码欧美久章草 在线观看 有码 制服 中文 | 国产精品AV一区二区三区不卡蜜 | 国产美女无遮挡裸体毛片A片 |