SceneKit一个加载3D模型的神奇框架

由于我们的项目需要使用3D模型,将3D模型展示到客户端,如果用OpenGL太麻烦,而且那个东西太接近于底层,个人还是稍微欠缺点,所以经过多方查询,得出了用SceneKit做这个是最佳的方案。

网上有很多关于初次使用SceneKit的例子,大多也就是交给你如何创建项目,然后把苹果官方给出的飞机模型的例子讲解下。这些我就不再累述,没什么意思。

这里我关键说几个点,一个是我们新建模型使用什么格式的模型?另一个是如何使用模型?最后一个我们可否手动创建或者修改模型?

下面我们从第一个问题开始:新建模型使用什么格式
官方给出的SCN格式的文件,并且附带了一张png的图片。我们当然可以依样画葫芦,使用同样的方式,不过我们同时可以使用DAE格式的文件,这个跟官方的SCN差别不大,只是我们在Xcode中打开的时候比SCN多几个文件夹而已。

第二个问题,如何使用模型?我这里使用的是DAE文件模型,就只讲述DAE模型了。
首先我们让设计用3DMax导出DAE格式的模型给我们,而导出的DAE模型这里需要特定的格式,我这里借鉴的时badboy的博客,这里给大家再次说下,就是需要设计人员安装OpenCollada这个东西,然后导出的时候才会有OpenCollada(.DAE)这样的模型格式,而我们才可以正常使用,不然的话我们是打不开的。也就无法显示到ipad上了。
其次,光有模型还不够,还需要贴图。网上说的是给Photoshop安装一个dds插件,其实就是在Photoshop安装路径下添加dds.8bi文件就可以了。但是我试过很多次,此路行不通,不过听说是使用Photoshop3可以成功,而我的是Photoshop6.并且这个文件是window独有的,然而我们是要给ipad换图片,你不给我一个Mac方案,却给我一个Windows的使用方式,这不是要捉弄我么?
最后说下我的解决方案,先利用Photoshop将dds导出为bmp格式的,然后从网上下载了一个DXTBmp软件,不过这个也只有Windows版本的。再讲bmp格式转成jpg的就可以使用了。
这个时候我们会有一个模型以及其需要的所有贴图。我们把模型copy到后缀名为scnaasets文件夹中,选中模型,我们会发现模型简直是个“裸体”,这个时候我们就需要给模型上贴图了。我们选中模型,然后在Diffuse中选出应该使用的贴图就可以了。

第三个问题:可否手动创建或者修改模型
这个当然是可以的了,我在开发的时候就完全按照苹果官方给出的方法。

// create a new scene
    SCNScene *scene = [SCNScene sceneNamed:@"art.scnassets/ship.scn"];

    // create and add a camera to the scene
    SCNNode *cameraNode = [SCNNode node];
    cameraNode.camera = [SCNCamera camera];
    [scene.rootNode addChildNode:cameraNode];

    // place the camera
    cameraNode.position = SCNVector3Make(0, 0, 15);

    // create and add a light to the scene
    SCNNode *lightNode = [SCNNode node];
    lightNode.light = [SCNLight light];
    lightNode.light.type = SCNLightTypeOmni;
    lightNode.position = SCNVector3Make(0, 10, 10);
    [scene.rootNode addChildNode:lightNode];

    // create and add an ambient light to the scene
    SCNNode *ambientLightNode = [SCNNode node];
    ambientLightNode.light = [SCNLight light];
    ambientLightNode.light.type = SCNLightTypeAmbient;
    ambientLightNode.light.color = [UIColor darkGrayColor];
    [scene.rootNode addChildNode:ambientLightNode];

    // retrieve the ship node
    SCNNode *ship = [scene.rootNode childNodeWithName:@"ship" recursively:YES];

    // animate the 3d object
    [ship runAction:[SCNAction repeatActionForever:[SCNAction rotateByX:0 y:2 z:0 duration:1]]];

    // retrieve the SCNView
    SCNView *scnView = (SCNView *)self.view;

    // set the scene to the view
    scnView.scene = scene;

    // allows the user to manipulate the camera
    scnView.allowsCameraControl = YES;

    // show statistics such as fps and timing information
    scnView.showsStatistics = YES;

    // configure the view
    scnView.backgroundColor = [UIColor blackColor];

这样的话,如果模型的摄像机位不正确的话我们无法像苹果官方的这个demo一样正好看到飞机模型,并且角度合适,这个时候我们就需要有一个camera。这个叫做摄像机,举个例子就好比我们的眼睛,我们把眼睛放到特定的位置和角度,我们程序进入的时候才能呈现出模型的初始位置。而设置好camera就可以达到我们的要求了。

好了,三个问题都介绍完了。我也是刚刚接触SceneKit,不过其强大程度,实在令在下钦佩,故而迫不及待的写下了这篇博客,聊表澎湃心情。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值