日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NDK OpenGL ES 3.0 开发(二十):3D 模型

發布時間:2024/3/24 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NDK OpenGL ES 3.0 开发(二十):3D 模型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

該原創文章首發于微信公眾號:字節流動

OpenGLES 3D 模型


OpenGLES 3D 模型本質上是由一系列三角形在 3D 空間(OpenGL 坐標系)中構建而成,另外還包含了用于描述三角形表面的紋理、光照、材質等信息。

構建一些規則的 3D 物體,如立方體、球體、椎體等,我們自己可以手動輕易實現,但是在實際開發中往往會用到復雜的 3D 物體,如人體、汽車等,這就需要設計師和專業的建模工具軟件(像 3DS Max、Maya )來生成。

利用 3D 建模軟件,設計師可以構建一些復雜的形狀,并將貼圖應用到形狀上去,不需要去關注圖像技術細節。最后在導出模型文件時,建模工具會自己生成所有的頂點坐標、頂點法線和紋理坐標。

常用的模型文件格式有 .obj、.max、.fbx .3ds 等,其中 .obj 是 Wavefront 科技開發的一種幾何體圖形文件格式,包含每個頂點的位置、紋理坐標、法線,以及組成面(多邊形)的頂點列表等數據,應用較為廣泛。

OBJ 文件的結構

本文主要介紹 obj 3D 模型文件及其附屬文件 mtl ,下面是 obj 模型文件的數據結構(為了方便展示部分數據被略過)。

# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2019 guruware # File Created: 25.01.2019 02:22:51mtllib earth.mtlv -4.4189 340.8998 -4.2436 v -4.4189 339.2582 -37.6576 v -7.6941 339.2582 -37.4967 v -10.9377 339.2582 -37.0156 v -14.1185 339.2582 -36.2188 v -17.2059 339.2582 -35.1141 ... # 1986 verticesvn -0.0000 1.0000 0.0000 vn 0.0000 0.9950 -0.0995 vn -0.0098 0.9950 -0.0991 vn -0.0194 0.9950 -0.0976 vn -0.0289 0.9950 -0.0952 vn -0.0381 0.9950 -0.0920 vn -0.0469 0.9950 -0.0878 ... # 1986 vertex normalsvt 0.0000 1.0000 0.0000 vt 0.0000 0.9688 0.0000 vt 0.0156 0.9688 0.0000 vt 0.0156 1.0000 0.0000 vt 0.0313 0.9688 0.0000 vt 0.0313 1.0000 0.0000 ... # 2143 texture coordsusemtl 01___Default s 1 f 1/1/1 2/2/2 3/3/3 f 1/4/1 3/3/3 4/5/4 f 1/6/1 4/5/4 5/7/5 f 1/8/1 5/7/5 6/9/6 f 1/10/1 6/9/6 7/11/7 ...

OBJ 文件數據結構的簡單說明:

  • # 開頭的行表示注釋行;
  • mtllib 表示指定該 OBJ 文件所使用的 mtl 文件(材質文件);
  • v 開頭的行表示存放的是頂點坐標,后面三個數分別表示一個頂點的(x,y,z)坐標值;
  • vn 開頭的行表示存放的是頂點法向量,后面三個數分別表示一個頂點法向量的三維(x,y,z)分量值;
  • vt 開頭的行表示存放的是紋理坐標,后面三個數分別表示一個紋理坐標的(s,t,p)分量值,其中 p 分量一般用于 3D 紋理;
  • usemtl 01___Default 表示使用指定 mtl 文件中名為 01___Default的材質;
  • s 1 表示開啟平滑渲染;
  • f 開頭的行表示存放的是一個三角面的信息,后面有三組數據分別表示組成三角面的三個頂點的信息,每個頂點信息的格式為:頂點位置索引/紋理坐標索引/法向量索引。
  • mtl 文件的結構:

    # 3ds Max Wavefront OBJ Exporter v0.97b - (c)2019 guruware # File Created: 25.01.2019 02:22:51newmtl 01___DefaultNs 10.0000Ni 1.5000d 1.0000Tr 0.0000Tf 1.0000 1.0000 1.0000 illum 2Ka 0.0000 0.0000 0.0000Kd 0.0000 0.0000 0.0000Ks 0.0000 0.0000 0.0000Ke 0.0000 0.0000 0.0000map_Ka 4096_earth.jpgmap_Kd 4096_earth.jpgmap_Ke 4096_night_lights.jpgmap_bump 4096_bump.jpgbump 4096_bump.jpgnewmtl 02___DefaultNs 10.0000Ni 1.5000d 1.0000Tr 0.0000Tf 1.0000 1.0000 1.0000 illum 2Ka 0.5882 0.5882 0.5882Kd 0.5882 0.5882 0.5882Ks 0.0000 0.0000 0.0000Ke 0.0000 0.0000 0.0000map_Ka 4096_clouds.jpgmap_Kd 4096_clouds.jpgmap_d 4096_clouds.jpg

    mtl 文件結構說明:

  • newmtl 01___Default表示定義一個名為 01___Default 的材質;
  • Ns 表示材質的反射指數,反射指數越高則高光越密集,取值范圍在一般為 [0,1000];
  • Ni 表示材質的折射值(折射率),一般取值范圍是 [0.001,10] ,取值為 1.0,表示光在通過物體的時候不發生彎曲,玻璃的折射率為 1.5 ;
  • d 表示材質的漸隱指數(通透指數),取值為 1.0 表示完全不透明,取值為 0.0 時表示完全透明;
  • Tr 表示材質的透明度(與 d 的取值相反),默認值為0.0(完全不透明);
  • Tf 表示材質的濾光折射率,三維向量表示;
  • illum 表示材質的光照模型;
  • Ka 表示材質的環境光(Ambient Color)(r,g,b);
  • Kd 表示材質的散射光(Diffuse Color)(r,g,b);
  • Ks 表示材質的鏡面光(Apecular Color)(r,g,b);
  • Ke 表示材質的發射光,它與環境光,散射光和鏡面光并存,代表材質發出的光量;
  • map_Ka 表示為材質的環境反射指定紋理文件(紋理采樣值與環境光相乘作為輸出顏色的一部分加權);
  • map_Kd 表示為材質的漫反射指定紋理文件;
  • map_Ke 表示為材質的發射光指定紋理文件;
  • map_d 表示為材質的透明度指定紋理文件;
  • bump 表示指定材質的凹凸紋理文件,凹凸紋理修改表面法線,用于凹凸紋理的圖像表示相對于平均表面的表面拓撲或高度(沒用過)。
  • 模型加載庫 Assimp

    Assimp 全稱為 Open Asset Import Library,可以支持幾十種不同格式的模型文件的解析(同樣也可以導出部分模型格式),Assimp 本身是 C++ 庫,可以跨平臺使用。

    Assimp 可以將幾十種模型文件都轉換為一個統一的數據結構,所有無論我們導入何種格式的模型文件,都可以用同一個方式去訪問我們需要的模型數據。

    當導入一個模型文件時,Assimp 將加載該模型文件所包含的所有模型和場景數據到一個 scene 對象,為這個模型文件中的所有場景節點、模型節點都生成一個具有對應關系的數據結構,如下圖所示:

    一個模型往往是由很多小模型組成,這些小模型在 Assimp 中稱之為 Mesh ,Mesh 進行獨立渲染,Mesh 對象本身包含渲染所需的所有相關數據,比如頂點位置、法向量、紋理坐標以及物體的材質。

    編譯模型加載庫 Assimp

    Assimp 源代碼地址:https://github.com/assimp/assimp

    環境準備:

    Windows 7 Android Studio 版本> 2.3.0 (帶有 NDK 和 CMake) Python 3.5
  • 從 Github 下載 Assimp(本文使用的是 assimp-v.5.0.0) 源碼并解壓到一個新建文件夾 BuildAssimp 中;
  • 在 BuildAssimp 文件夾新建一個 make_standalone_toolchain.bat 文件用于創建編譯所需的工具鏈,該文件內容如下:
  • python D:/AndroidSDK/Sdk/ndk-bundle/build/tools/make_standalone_toolchain.py --arch=arm --stl=libc++ --api=24 --install-dir=android-toolchain-24-llvm-arm

    D:/AndroidSDK/Sdk/ndk-bundle/build/tools/make_standalone_toolchain.py 需要換成你本地的 Android SDK 中的工具鏈構建腳本。

    雙擊腳本,執行完成后,會在當前目錄下(BuildAssimp 文件夾中)生成一個新的文件夾 android-toolchain-24-llvm-arm ,它是我們用于編譯 32 位的 assimp 庫用到的工具鏈。

  • 在 BuildAssimp 文件夾中新建一個 build_assimp.bat 文件,用于編譯生成 assimp.so 文件,其內容如下:
  • @echo off clsREM *NOTE* Change these based on SET ASSIMP_DIR=assimp-v.5.0.0 SET OUTPUT_DIR=assimp-build-arm SET ANDROID_PATH=D:\AndroidSDK\Sdk SET NDK_PATH=D:\AndroidSDK\Sdk\ndk-bundle SET NDK_TOOLCHAIN=%~dp0android-toolchain-24-llvm-arm SET CMAKE_TOOLCHAIN=%NDK_PATH%\build\cmake\android.toolchain.cmake SET CMAKE_PATH=%ANDROID_PATH%\cmake\3.6.4111459REM *NOTE* Careful if you don't want rm -rf, I use it for testing purposes. del /F /S /Q %OUTPUT_DIR% mkdir %OUTPUT_DIR%REM pushd doesn't seem to work ):< cd %OUTPUT_DIR%if not defined ORIGPATH set ORIGPATH=%PATH% SET PATH=%CMAKE_PATH%\bin;%ANDROID_PATH%\tools;%ANDROID_PATH%\platform-tools;%ORIGPATH%cmake ^-GNinja ^-DCMAKE_TOOLCHAIN_FILE=%CMAKE_TOOLCHAIN% ^-DASSIMP_ANDROID_JNIIOSYSTEM=ON ^-DANDROID_NDK=%NDK_PATH% ^-DCMAKE_MAKE_PROGRAM=%CMAKE_PATH%\bin\ninja.exe ^-DCMAKE_BUILD_TYPE=Release ^-DANDROID_ABI="armeabi-v7a" ^-DANDROID_NATIVE_API_LEVEL=24 ^-DANDROID_FORCE_ARM_BUILD=TRUE ^-DCMAKE_INSTALL_PREFIX=install ^-DANDROID_STL=c++_static ^-DCMAKE_CXX_FLAGS=-Wno-c++11-narrowing ^-DANDROID_TOOLCHAIN=clang ^-DASSIMP_BUILD_TESTS=OFF ^../%ASSIMP_DIR%cmake --build .cd ..pause

    這里需要配置你的 Android SDK 和 NDK path 。

    雙擊腳本,執行完成后,會在 BuildAssimp 文件夾下生成一個新的文件夾 android-toolchain-24-llvm-arm ,編譯通過后會在 android-toolchain-24-llvm-arm/code/ 下生成 32 位的 assimp.so 文件。

    下一節中將會使用 assimp.so 去加載 obj 模型文件,然后利用 OpenGL ES 渲染模型。

    聯系與交流

    總結

    以上是生活随笔為你收集整理的NDK OpenGL ES 3.0 开发(二十):3D 模型的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 丁香啪啪综合成人亚洲 | 日韩少妇高潮抽搐 | 成年人免费看毛片 | 一级片黄色的 | 精品国产av一区二区三区 | 视频二区在线观看 | 影音先锋成人资源网 | 国产精品主播视频 | 日韩精品91 | 日韩欧美一区二区视频 | 传媒一区二区 | 丝袜操| 93久久精品日日躁夜夜躁欧美 | 手机看片1024在线 | 伊人日本| 国产精品呻吟久久 | www,99| 日韩欧美精品中文字幕 | 五月天婷婷在线观看 | 99这里只有精品 | 亚洲最新av网址 | 日本亚洲国产 | 国产一区在线观看视频 | 麻豆网站在线播放 | 99国产揄拍国产精品 | av色在线观看 | 五月天综合激情网 | juliaann精品艳妇hd | 在线观看www视频 | 欧美性高潮 | 污网站在线观看免费 | 国产性猛交xxxx免费看久久 | 正在播放超嫩在线播放 | 国产性猛交xxxⅹ交酡全过程 | 一级aa毛片 | 操操操网站 | 欧美午夜精品久久久久免费视 | 极品蜜桃臀肥臀-x88av | 日韩av一区二区在线 | 99精品小视频 | 国产情侣久久久久aⅴ免费 caoporn成人 | 1000部国产精品成人观看 | 成人av播放 | 国产色综合网 | 国产精品一区二区三区不卡 | 国产视频精品免费 | 国产一级淫片免费 | 久久视频精品在线 | 亚洲夜夜爱 | 国产传媒在线 | 99久久国产综合 | 91九色偷拍| 爱情岛亚洲论坛入口 | 久久精品97 | 艳妇臀荡乳欲伦交换电影 | 亚洲精品韩国 | 97香蕉超级碰碰久久免费软件 | 欧美又粗又大aaa片 老熟妇仑乱视频一区二区 亚洲妇女体内精汇编 | 国产视频欧美视频 | 在线看a网站 | 国产99久久久久 | 国产精品人妖 | 丰满岳乱妇在线观看中字无码 | 欧美午夜三级 | 亚洲免费一级片 | 国产精品v欧美精品v日韩 | 免费在线看黄网站 | 欧美精品一 | 精品国产欧美一区二区三区成人 | 国产一级精品毛片 | 日韩激情电影在线 | 精品国产免费观看 | 国产大片一区二区 | 视频一区二区三区在线观看 | 中文字幕三级电影 | 成年免费在线观看 | 免费欧美一级视频 | 91精品视频免费观看 | 精品国产乱子伦 | 三级网站在线播放 | 国产精品自拍片 | 黄色字幕网| 精品欧美一区二区久久久 | 在线看的av网站 | 色婷婷在线观看视频 | 天天弄天天操 | 国产1级片| 老女人做爰全过程免费的视频 | 欧美色图狠狠干 | 你操综合| 欧美日韩国产大片 | 国产美女无遮挡网站 | 日韩草逼 | 好吊视频在线观看 | 亚洲精品九九 | 国产高清自拍一区 | 桃色在线视频 | 欧美日韩中文国产一区发布 | 亚洲欧美在线视频观看 |