美文网首页
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 - 3D

    SceneKit iOS - SceneKit显示与交互3D建模(一)https://yiweifen.com/h...

  • iOS - SceneKit显示与交互3D建模(二)

    上篇文章iOS - SceneKit显示与交互3D建模(一)中我们介绍了sceneKit的简单使用,还提到一个需求...

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

    如果将模型从服务器上下载下来再来显示会无法显示问题,然而只能是事先把素材放入项目中才能正常显示,这是不符合我们的需...

  • iOS原生3D渲染--SceneKit框架学习笔记

    1、ios 3D引擎 SceneKit 开发(1) --起始篇 2、ios 3D引擎 SceneKit 开发(2)...

  • .dae 格式的3D模型的动画大战

    最近在看利用Scenekit显示3D模型,选用了自带动画的模型。需求是要求能自己控制模型的动画。 .dae格式模型...

  • iOS - SceneKit显示与交互3D建模(一)

    最近公司要求在手机上显示3D模型,并且要获取点击的模型坐标,找了很多相关资料,发现有两种实现方式,一种是集成Uni...

  • SceneKit常用类简介

    1.SCNView SCNView用于显示SceneKit的3D内容,在iOS系统上是UIView的子类,因此可以...

  • SceneKit基本概念

    1.SCNView SCNView主要作用是显示SceneKit的3D内容,在iOS系统上是UIView的子类,所...

  • SceneKit

    概述 SceneKit是用来构建3D场景的框架,且可以与Core Animation和SpriteKit无缝交互。...

  • SceneKit 自定义手势

    最近有用到SceneKit来展示3D模型,目前SceneKit的学习资料有不少,但发现没有讲自定义手势的文章(可能...

网友评论

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

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