iOS使用assimpKit加載FBX模型步驟詳解

研究背景
體積:一個.dae模型大概有1M那么大  而.fbx模型0.5M
現(xiàn)狀
xcode現(xiàn)在不能直接讀取.fbx模型
方案
1.使用assimpKit加載
2.使用Wish3D加載
結(jié)果
1.使用assimpKit--可行
2.使用Wish3D-- 官方文檔有問題因痛,然后咨詢還不回復(fù)----直接丟棄
原理

原理篇

1.讀取模型的  頂點坐標(biāo)  紋理坐標(biāo)  法線  骨骼頂點  骨骼動畫 

2.調(diào)用以下方法畫出模型 

根據(jù)頂點坐標(biāo)和模型類型畫出模型,模型類型可以是點掺栅、線姜胖、三角形
為什么是三角形呢誉帅?因為三角形是最小邊幾何圖形

+ (instancetype)geometrySourceWithVertices:(const SCNVector3 *)vertices count:(NSInteger)count;

3.調(diào)用以下方法設(shè)置紋理
+ (instancetype)geometrySourceWithNormals:(const SCNVector3 *)normals count:(NSInteger)count;
用以下方法設(shè)置模型圖片 就是設(shè)置node的紋理
SCNGeometry *geo = [SCNGeometry geometryWithSources:sources elements:elements];
UIImage * image  = [UIImage imageNamed:@"xy.jpg"];
SCNMaterial *mat = [SCNMaterial material];
mat.diffuse.contents = image;
geo.firstMaterial = mat;
geo.firstMaterial.doubleSided = YES;

4.調(diào)用以下方法畫出法線
+ (instancetype)geometrySourceWithTextureCoordinates:(const CGPoint *)texcoord count:(NSInteger)count;

5.調(diào)用以下方法畫出骨骼頂點
+ (instancetype)geometrySourceWithData:(NSData *)data semantic:(SCNGeometrySourceSemantic)semantic vectorCount:(NSInteger)vectorCount floatComponents:(BOOL)floatComponents componentsPerVector:(NSInteger)componentsPerVector bytesPerComponent:(NSInteger)bytesPerComponent dataOffset:(NSInteger)offset dataStride:(NSInteger)stride;

6.調(diào)用以下方法設(shè)置與骨骼頂點向連接的部分
+ (instancetype)geometrySourceWithData:(NSData *)data semantic:(SCNGeometrySourceSemantic)semantic vectorCount:(NSInteger)vectorCount floatComponents:(BOOL)floatComponents componentsPerVector:(NSInteger)componentsPerVector bytesPerComponent:(NSInteger)bytesPerComponent dataOffset:(NSInteger)offset dataStride:(NSInteger)stride;

7.調(diào)用以下方法設(shè)置骨骼動畫皮膚那方面的
+ (instancetype)geometrySourceWithData:(NSData *)data semantic:(SCNGeometrySourceSemantic)semantic vectorCount:(NSInteger)vectorCount floatComponents:(BOOL)floatComponents componentsPerVector:(NSInteger)componentsPerVector bytesPerComponent:(NSInteger)bytesPerComponent dataOffset:(NSInteger)offset dataStride:(NSInteger)stride

8.調(diào)用以下方法設(shè)置把骨骼相信存放到一個SCNSkinner類
+ (instancetype)skinnerWithBaseGeometry:(nullable SCNGeometry *)baseGeometry bones:(NSArray<SCNNode *> *)bones boneInverseBindTransforms:(nullable NSArray<NSValue *> *)boneInverseBindTransforms boneWeights:(SCNGeometrySource *)boneWeights boneIndices:(SCNGeometrySource *)boneIndices API_AVAILABLE(macos(10.10));

9.調(diào)用以下方法設(shè)置骨骼動畫的值和類型
+ (SCNAction *)repeatActionForever:(SCNAction *)action;

10.調(diào)用以下方法運行骨骼動畫
- (void)runAction:(SCNAction *)action API_AVAILABLE(macos(10.10));

把assimpKit接入項目

1.到 assimpKit 下載 文件
文件很大的 要找到ios的

2.把assimpKit.frame 拖入工程里


image.png

3.把下面的文件導(dǎo)入工程里


image.png
image.png

4.然后再設(shè)置動態(tài)庫 (不是靜態(tài))


image.png

還有


image.png

如果出現(xiàn)了
"_compress", referenced from:
“_uncompress", referenced from:
"_compress2", referenced from:
"_inflateReset", referenced from:
"inflateInit", referenced from:
"_inflateEnd", referenced from:
"inflateInit2", referenced from:

有兩種解決方法

image.png

這個可以添加多個的 就是本來有其他的xxx 還是可以添加-lz的

image.png

主要是assimpKit里有.a 的壓縮文件 我們要添加壓縮的庫區(qū)解壓

5.設(shè)置bitcode為no


image.png
開發(fā)中遇到的問題
1.加載fbx模型的動畫 只有部分節(jié)點有動畫
2.控制動畫的播放但動畫結(jié)束的時候會很突兀
解決辦法

1.查看源碼 他是遍歷到每個子節(jié)點然后把動畫添加上去 但是有一些節(jié)點根本加不上去 所以我們需要改一下他的源碼

image.png

當(dāng)了這個bug他們開發(fā)團隊也知道了 并且標(biāo)為了bug


image.png

2.查看源碼 發(fā)現(xiàn)他是沒有用到fadeOutDuration這個屬性 可能是遺留了

image.png
后記
assimpKit這個庫   功能很強   雖然不是很成熟   但我們可以在他們基礎(chǔ)上修改一下代碼  來實現(xiàn)我們的功能   當(dāng)然了   如果發(fā)現(xiàn)bug    還可以和他們開發(fā)團隊提一下   讓這個框架幫助更多的開發(fā)人員 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蚜锨,更是在濱河造成了極大的恐慌档插,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亚再,死亡現(xiàn)場離奇詭異郭膛,居然都是意外死亡,警方通過查閱死者的電腦和手機氛悬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門则剃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人如捅,你說我怎么就攤上這事棍现。” “怎么了镜遣?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵己肮,是天一觀的道長。 經(jīng)常有香客問我悲关,道長谎僻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任寓辱,我火速辦了婚禮艘绍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘秫筏。我一直安慰自己鞍盗,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布跳昼。 她就那樣靜靜地躺著,像睡著了一般肋乍。 火紅的嫁衣襯著肌膚如雪鹅颊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天墓造,我揣著相機與錄音堪伍,去河邊找鬼。 笑死觅闽,一個胖子當(dāng)著我的面吹牛帝雇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蛉拙,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼尸闸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吮廉,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤苞尝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后宦芦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宙址,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年调卑,在試婚紗的時候發(fā)現(xiàn)自己被綠了抡砂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡恬涧,死狀恐怖注益,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情气破,我是刑警寧澤聊浅,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站现使,受9級特大地震影響低匙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜碳锈,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一顽冶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧售碳,春花似錦强重、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至艺智,卻和暖如春倘要,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背十拣。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工封拧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人夭问。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓泽西,卻偏偏與公主長得像,于是被迫代替她去往敵國和親缰趋。 傳聞我的和親對象是個殘疾皇子捧杉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,652評論 2 354

推薦閱讀更多精彩內(nèi)容