上篇文章iOS - SceneKit顯示與交互3D建模(一)中我們介紹了sceneKit的簡單使用,還提到一個(gè)需求孩饼,就是要從沙盒中動態(tài)加載場景
猜想階段
將素材拖至沙盒的Documents文件夾下睛琳,模擬素材已從服務(wù)器下載至本地
接下來拼接素材地址蕾殴,運(yùn)行后一片漆黑员舵,由于沒什么好看的就不放圖了棒仍。從截圖中可以看到了,scene為空抡蛙,自然也就看不到任何東西护昧。
那如果我們把素材Menchi.dae學(xué)demo一樣放至scnassets文件夾中呢?
經(jīng)過實(shí)踐溜畅,結(jié)果還是一樣捏卓,也是nil。
有人就說了demo中明明是scn文件慈格,不是dae怠晴。這里我要提一下,SceneKit是可以從scn文件或者dae文件初始化場景的浴捆,而如果換成從scn文件初始化場景蒜田,scene的確不為nil,但是一樣是一片漆黑选泻,不相信的朋友可以自己試下冲粤。
scn是xcode能夠識別的場景文件,該文件本身就是scene页眯,所以不為nil梯捕,而如果是dae初始化場景,dae文件只是作為一個(gè)節(jié)點(diǎn)加入到新建的scene中窝撵,由于沒有新建scene自然也就添加不了這個(gè)素材節(jié)點(diǎn)傀顾。
探索階段
百思不得其解,只好來看看build過程有什么特殊動作了碌奉,果不其然有貓膩
取其精華短曾,格式如下
// artLXF只是事例做法,可以改為你想要顯示的名字
copySceneKitAssets art.scnassets -o artLXF.scnassets
現(xiàn)在就大致明了了赐劣,SceneKit使用了copySceneKitAssets腳本對art.scnassets進(jìn)行了不為人知的處理嫉拐,這個(gè)過程還需要用到另一個(gè)腳本工具scntool,這兩個(gè)文件存放的目錄如下:
/Applications/Xcode.app/Contents/Developer/usr/bin/
至于說它是不為人知的處理過程魁兼,是因?yàn)槲覜]有看到蘋果官方文檔中有說明婉徘,也可能是我沒找著~~
大膽實(shí)踐
在桌面上新建并進(jìn)入一個(gè)叫LXFScene的文件夾,再新建一個(gè)art文件夾并添加后綴【.scnassets】咐汞,存入素材Menchi.dae,將需要的兩個(gè)文件(copySceneKitAssets和scntool)提取出來也放入LXFScene目錄下
打開終端判哥,先cd到LXFScene目錄,如圖打入命令
./copySceneKitAssets art.scnassets -o artLXF.scnassets
將新的scnassets拖入沙盒的Document文件夾下碉考,更名為art.scnassets塌计,再次運(yùn)行程序看看
測試成功!就是我們的素材小了點(diǎn)侯谁,改下尺寸就好了
SCNNode *mechiNode = scene.rootNode.childNodes.firstObject;
mechiNode.transform = SCNMatrix4MakeScale(5, 5, 5);
這樣我們就可以讓后臺先將處理好的scnassets文件夾打包放到服務(wù)器上锌仅,我們下載下來后解壓使用就好了~
給模型添加點(diǎn)擊事件
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapTest:)];
[scnView addGestureRecognizer:tap];
- (void)tapTest:(UITapGestureRecognizer *)tap {
// 獲取模型點(diǎn)擊處的三維坐標(biāo)
SCNVector3 projectedOrigin = [self.scnView projectPoint:SCNVector3Zero];
CGPoint vp = [tap locationInView:self.scnView];
SCNVector3 vpWithZ = SCNVector3Make(vp.x, vp.y, projectedOrigin.z);
SCNVector3 worldPoint = [self.scnView unprojectPoint:vpWithZ];
NSLog(@"x: --- %f y: --- %f z: --- %f", worldPoint.x, worldPoint.y, worldPoint.z);
}
最后附上DEMO LXF3DSceneDemo