美文网首页
iOS - SceneKit 3D模型显示与交互

iOS - SceneKit 3D模型显示与交互

作者: 爱迪生的小跟班 | 来源:发表于2019-04-23 17:26 被阅读0次

    如果将模型从服务器上下载下来再来显示会无法显示问题,然而只能是事先把素材放入项目中才能正常显示,这是不符合我们的需求的。如果我们把素材从服务器上下载到沙盒里,程序再直接从沙盒读取和初始化场景会出现为nil的问题。

    将素材拖至沙盒的Documents文件夹下,模拟素材已从服务器下载至本地

    image

    接下来拼接素材地址,运行后一片漆黑。从截图中可以看到了,scene为空,自然也就看不到任何东西。


    image

    那如果我们把素材Menchi.dae学demo一样放至scnassets文件夹中呢?

    image

    经过实践,结果还是一样,也是nil。


    image

    有人就说了demo中明明是scn文件,不是dae。,SceneKit是可以从scn文件或者dae文件初始化场景的,而如果换成从scn文件初始化场景,scene的确不为nil,但是一样是一片漆黑。

    scn是xcode能够识别的场景文件,该文件本身就是scene,所以不为nil,而如果是dae初始化场景,dae文件只是作为一个节点加入到新建的scene中,由于没有新建scene自然也就添加不了这个素材节点。

    探索阶段

    百思不得其解,只好来看看build过程有什么特殊动作了,果不其然有猫腻

    image

    取其精华,格式如下

    // artLXF只是事例做法,可以改为你想要显示的名字
    copySceneKitAssets art.scnassets -o  artLXF.scnassets
    
    

    现在就大致明了了,SceneKit使用了copySceneKitAssets脚本对art.scnassets进行了不为人知的处理,这个过程还需要用到另一个脚本工具scntool,这两个文件存放的目录如下:

    /Applications/Xcode.app/Contents/Developer/usr/bin/
    
    

    至于说它是不为人知的处理过程,是因为我没有看到苹果官方文档中有说明,也可能是我没找着~~

    大胆实践

    在桌面上新建并进入一个叫LXFScene的文件夹,再新建一个art文件夹并添加后缀【.scnassets】,存入素材Menchi.dae,将需要的两个文件(copySceneKitAssets和scntool)提取出来也放入LXFScene目录下

    image

    打开终端,先cd到LXFScene目录,如图打入命令

    ./copySceneKitAssets art.scnassets -o artLXF.scnassets
    
    
    image image

    将新的scnassets拖入沙盒的Document文件夹下,更名为art.scnassets,再次运行程序看看

    image

    测试成功!就是我们的素材小了点,改下尺寸就好了

    SCNNode *mechiNode = scene.rootNode.childNodes.firstObject;
    mechiNode.transform = SCNMatrix4MakeScale(5, 5, 5);
    
    

    这样我们就可以让后台先将处理好的scnassets文件夹打包放到服务器上,我们下载下来后解压使用就好了~

    给模型添加点击事件

    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapTest:)];
    [scnView addGestureRecognizer:tap];
    
    
    - (void)tapTest:(UITapGestureRecognizer *)tap {
        // 获取模型点击处的三维坐标
        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);
    }
    
    

    相关文章

      网友评论

          本文标题:iOS - SceneKit 3D模型显示与交互

          本文链接:https://www.haomeiwen.com/subject/xqlbgqtx.html