2016-03-19 17:07:54 niuhailei 阅读数 9528
  • ARKit视觉风暴

    课程介绍 本套课程从技术理念到项目实践,教大家系统掌握ARKit技术开发,随心打造iOS端AR增强现实应用。由一开始的开发环境搭建,到Unity ARKit Plugin、ARFoundation ARKit等不同时期技术的讲解。从平面模型放置、识别图片、手势交互、3D物体识别、面部AR贴纸、光照估计、环境探针、多人 AR技术,甚至包含ARKit3.0的动作捕捉技术等。除了以上课程内容,更加入了随着技术更新与时俱进更新的ARKit连载技术教学内容。 课程收益 轻松理解ARKit的技术原理,从零到一创建自己的第一个AR项目。 学习Unity ARKit Plugin经典技术,了解ARKit中的常见概念和原理。 学会在 ARFoundation 中使用ARKit,进行企业级AR项目开发。 学会如何在AR项目里播放模型动画,通过触屏手势交互实现模型的旋转和缩放。 了解ARKit的图片识别,掌握AR卡片、AR书籍的实现方法。 学会使用面部增强技术,实现热门短视频应用的AR贴纸效果,实现面部表情追踪。 学会使用ARKit物体检测技术,实现3D物体识别,可以广泛应用于工业、建筑、古董、玩具手办、艺展览等不同场景。 学习ARKit中的经典交互案例,优化AR项目的用户体验。 熟练使用环境纹理、光照估计技术,让AR内容随当前现实场景自动变化调节,看起来更加真实。 基于World Map、Collaborative Session AR技术,实现AR场景的持久化及多人AR体验效果。

    88 人正在学习 去看看 翟喜峰

     之前做一个项目时,需要一个界面展示3D模型并进行交互。所以针对这个问题研究了很久,并总结了一些经验。在论坛中总遇到相同需求的人,也有很多人问我,所以写出这篇博客供大家参考。网上资料很少,即时有也比较模糊,所以接下来我尽量说的详细些,看完之后还有不懂得可以继续问我,QQ:1414819100.

   一、如果项目紧紧是展示3d模型,并进行简单的手势交互,这个时候,最好不要选择使用U3D和iOS混编,这个样做起来会比较麻烦,逻辑关系复杂,安全隐患严重。Opengl能很好的解决这个问题,iOS封装成GLView,用起来很简单实用(可以进行交互,缩放,旋转,增删,调整透视等)。附上Demo,弄懂里面的一些主要参数,变量,实现你要的效果不难。有参数不明白可以继续联系我,这个就不多说了,接下来讲解比较棘手的。

  

   二、项目要求3D效果比较绚丽,交互复杂,GLView已经不能满足我们的需求,这个时候我们可以考虑一下U3D和iOS混编。我把自己在这个过程中遇到的问题的感悟分享给大家。

         首先,Unity3d会导出一个工程文件,这个工程文件和我们的iOS项目结构很相似。拿到之后,用打开,并运行。如果遇到报错,

         ld: warning: path '/Users/MAC/Desktop/ZiTest/Libraries/libiPhone-lib.a' following -L not a directory
         ld: library not found for -liPhone-lib
         clang: error: linker command failed with exit code 1 (use -v to see invocation)

        不要紧张,虽然错很多,但只是一个问题。U3D导出的xcode工程文件不支持模拟器运行,换成真机运行,问题就没有了。如果真机感觉每次都是真机测试很麻烦,你可以让u3d导出一份可以模拟器运行的工程文件。

        也有可能你会不能选择模拟器,找到TARGETS---Build Settings---  Supported Platforms   改成iOS。

       解决混编的方法有很多种,总结起来就两大类,一个是u3d导入iOS,一个是iOS导入u3d中。这个可以看看我之前看的一些文章,试过好多,没有成功,大家可以参考下,即时不行,了解一下原理。版本不同,方法可能有些不同,但是原理是一样的。(目前自己找到资料仅仅只有这些,大家好好参考一下)

                          http://blog.sina.com.cn/s/blog_48a8af640102vh2q.html

                          http://segmentfault.com/q/1010000000392448
                         http://www.cnblogs.com/shawn-zp/p/3225477.html

                         原文:http://alexanderwong.me/post/29949258838/building-a-ios-unity-uiview-uiviewcontroller
                          翻译:http://blog.163.com/savage_cui/blog/static/64335507201332834915876/
                         补充:http://user.qzone.qq.com/1523511691/infocenter#!app=2&via=QZ.HashRefresh&pos=1375185802
                         其他参考:http://www.scio.de/en/blog-a-news/scio-development-blog-en/entry/iphone-a-unity3d-integrating-3rd-party-static-libraries-in-unity3d-generated-    

                                         xcode-projects


       u3d导入iOS中会比较麻烦一些,u3d产生的文件很大,setting的参数也要详细设置。

       iOS导入u3d中相对简单,下面介绍这个方法。

       打开u3d导出的xcode工程文件,运行一下。

   

                                                    文件是这个样子。

   运行的时候提示(报错200+个)

说明不支持模拟器运行,这个时候改用真机运行就可以了。最方便的办法就是让u3d导出可以真机运行的工程文件。

好了,能运行之后,拖入或者创建我们自己的ViewController。


打开Classes文件,找到UnityAppController(这个文件相当于我们认知的Appdelegate文件),找到这个方法,改变程序初始视图,由unityView改成我们自己的View。

改成这个样子:

- (void)applicationDidBecomeActive:(UIApplication*)application
{
    ::printf("-> applicationDidBecomeActive()\n");
    
    
    static dispatch_once_t disOnce;
    dispatch_once(&disOnce,  ^ {
    [self performSelector:@selector(startViewC:) withObject:application afterDelay:0];    
    });
    
    NSLog(@"_window22222222%@",_window.rootViewController);
//        [_snapshotView removeFromSuperview];
//        _snapshotView = nil;
    

    if(_unityAppReady)
    {
        if(UnityIsPaused())
        {
            UnityPause(0);
            UnityWillResume();
        }
        UnitySetPlayerFocus(1);
    }
    else if(!_startUnityScheduled)
    {
//        _startUnityScheduled = true;
//        [self performSelector:@selector(startUnity:) withObject:application afterDelay:0];
           }

    _didResignActive = false;
}

-(void)startViewC:(UIApplication *)application{

 //我们自己需要进入的视图

    MyViewController *root = [[MyViewController alloc] init];
    _window.rootViewController = root;
    //[UnityGetMainWindow() makeKeyAndVisible];
}

现在程序启动之后,首先进入的就是我们的视图了,接下来就是怎么在我们的视图中进入到u3d界面视图。[self.UnityAC startUnity:[UIApplication sharedApplication]];方法只能调用一次,所以我们需要设置全局变量观察是第几次启动u3d界面。



//第一次启动
-(void)firstStarUnity{
   [self.UnityAC startUnity:[UIApplication sharedApplication]];
}
//再次启动
-(void)againStarUnity{
    
    
    [self.UnityAC againStartUnity];
}

在UnityAppController里面实现再次启动打方法

//再次启动
-(void)againStartUnity{
    
   
    
    _window            = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    _window.rootViewController = _rootController;
    _unityView        = [self createUnityView];
    
    //[DisplayManager Initialize];
    _mainDisplay    = [DisplayManager Instance].mainDisplay;
    [_mainDisplay createWithWindow:_window andView:_unityView];
    
    [self createUI];
    [self preStartUnity];
    
    UnityPause(true);
    _didResignActive = YES;
    Profiler_UninitProfiler();
    
    NSLog(@"22222%@",_window.rootViewController);
    [self showGameUI];
    [self createDisplayLink];

    
    [[[UnityGetMainWindow() rootViewController] view] setHidden:NO];
//

    
        if (_didResignActive) {
        UnityPause(false);
        _didResignActive = NO;
    }
}



在UnityAppController---- (void)startUnity:(UIApplication*)application方法改成:

- (void)startUnity:(UIApplication*)application
{
    NSAssert(_unityAppReady == NO, @"[UnityAppController startUnity:] called after Unity has been initialized");

    _window            = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    _unityView        = [self createUnityView];
    
    //[DisplayManager Initialize];
    _mainDisplay    = [DisplayManager Instance].mainDisplay;
    [_mainDisplay createWithWindow:_window andView:_unityView];
    
    [self createUI];
    [self preStartUnity];
    
    
    UnityInitApplicationGraphics();

    // we make sure that first level gets correct display list and orientation
    [[DisplayManager Instance] updateDisplayListInUnity];

    UnityLoadApplication();
    Profiler_InitProfiler();

    [self showGameUI];
    [self createDisplayLink];

    UnitySetPlayerFocus(1);
}

现在我们就可从我们的界面进入u3d界面了,现在写在u3d退出后回到我们的界面中。

找到u3d预留的返回按钮的方法,在里面实现如何返回。在这里我没有用按钮,写在了UnityView.mm的touch的方法里。

在UnityAppController里实现:

//退出的方法
-(void)exitUnity{
    _window            = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    _unityView        = [self createUnityView];
    
    //[DisplayManager Initialize];
    _mainDisplay    = [DisplayManager Instance].mainDisplay;
    [_mainDisplay createWithWindow:_window andView:_unityView];
    
    [self createUI];
    [self preStartUnity];
    
    UnityPause(true);
    _didResignActive = YES;
    Profiler_UninitProfiler();
    NSLog(@"1111%@",_window.rootViewController);
    [[UnityGetMainWindow() rootViewController] view].hidden = YES;
//    _window            = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.myViewC = [[MyViewController alloc] init];
    _window.rootViewController = self.myViewC;
    NSLog(@"%@",self.window);
    NSLog(@"33333%@",_window.rootViewController);
    NSLog(@"%@",self.myViewC);
    
    //[UnityGetMainWindow() makeKeyAndVisible];
    
}


好了,现在就可以都实现了。本人目前还不是很精通,但经过好几天日夜的研究,基本的已经没有问题。欢迎各位优化,并通知我QQ:1414819100,谢谢!


GLview Demo下载地址:http://download.csdn.net/detail/niuhailei/9463994。

iOS,u3d混编Demo下载地址:https://yunpan.cn/cYX7fTFQXLeSc (提取码:ed6b)






2014-03-21 18:22:06 u011779982 阅读数 2513
  • ARKit视觉风暴

    课程介绍 本套课程从技术理念到项目实践,教大家系统掌握ARKit技术开发,随心打造iOS端AR增强现实应用。由一开始的开发环境搭建,到Unity ARKit Plugin、ARFoundation ARKit等不同时期技术的讲解。从平面模型放置、识别图片、手势交互、3D物体识别、面部AR贴纸、光照估计、环境探针、多人 AR技术,甚至包含ARKit3.0的动作捕捉技术等。除了以上课程内容,更加入了随着技术更新与时俱进更新的ARKit连载技术教学内容。 课程收益 轻松理解ARKit的技术原理,从零到一创建自己的第一个AR项目。 学习Unity ARKit Plugin经典技术,了解ARKit中的常见概念和原理。 学会在 ARFoundation 中使用ARKit,进行企业级AR项目开发。 学会如何在AR项目里播放模型动画,通过触屏手势交互实现模型的旋转和缩放。 了解ARKit的图片识别,掌握AR卡片、AR书籍的实现方法。 学会使用面部增强技术,实现热门短视频应用的AR贴纸效果,实现面部表情追踪。 学会使用ARKit物体检测技术,实现3D物体识别,可以广泛应用于工业、建筑、古董、玩具手办、艺展览等不同场景。 学习ARKit中的经典交互案例,优化AR项目的用户体验。 熟练使用环境纹理、光照估计技术,让AR内容随当前现实场景自动变化调节,看起来更加真实。 基于World Map、Collaborative Session AR技术,实现AR场景的持久化及多人AR体验效果。

    88 人正在学习 去看看 翟喜峰
由于项目需要osg展示3d模型,小子我可算煞费苦心才找到这个方法,这份提问邮件是一个开发者在提交问题代码时贴出了代码,才解决了小子我的一大问题,不胜感激,鉴于osg的材料比较少,在这里贴出代码,希望对搞osg的小伙伴们能有所帮助!
问题地址:
http://forum.openscenegraph.org/viewtopic.php?t=12566


//.h文件里定义的
//导入的文件
#include <osgDB/ReadFile>
#include <osg/MatrixTransform>
#include <osgViewer/Viewer>


osg::ref_ptr<osgViewer::Viewer> _viewer;
osg::ref_ptr<osg::MatrixTransform> _root;


//这段代码写在uiviewcontroller类.mm文件里的,
// self.osgView 为 iOS的UIView子类


//导入的文件


#include <osgGA/TrackballManipulator>
#include <osgGA/MultiTouchTrackballManipulator>
#include <osg/ShapeDrawable>
#include <osg/DisplaySettings>
#include <osgViewer/api/IOS/GraphicsWindowIOS>


   self.osgView = [[UIView alloc]initWithFrame:CGRectMake(0, 0,self.view.frame.size.width, 300)];
    [self.view addSubview:self.osgView];
    self.osgView.backgroundColor =  [UIColor greenColor];
    
    osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
    CGRect lFrame = [self.osgView convertRect:self.osgView.frame fromView:[UIApplication sharedApplication].keyWindow];
    NSLog(@"[[UIScreen mainScreen] scale] =  %f",[[UIScreen mainScreen] scale]);
    unsigned int w  = lFrame.size.width * [[UIScreen mainScreen] scale];
    unsigned int h  = lFrame.size.height * [[UIScreen mainScreen] scale];
    
    osg::DisplaySettings* settings = osg::DisplaySettings::instance();
    settings->setNumMultiSamples(4);
    
    osg::ref_ptr<osgViewer::GraphicsWindowIOS::WindowData> windata = new osgViewer::GraphicsWindowIOS::WindowData(self.osgView, osgViewer::GraphicsWindowIOS::WindowData::LANDSCAPE_LEFT_ORIENTATION, -1.0f);
    
    // Setup the traits parameters
    traits->x = lFrame.origin.x * [[UIScreen mainScreen] scale];
    traits->y = lFrame.origin.y * [[UIScreen mainScreen] scale];
    traits->width = w;
    traits->height = h;
    
    traits->windowDecoration = false;
    traits->doubleBuffer = true;
    traits->sharedContext = 0;
    traits->setInheritedWindowPixelFormat = false;
    traits->inheritedWindowData = windata;
    
    // Create the Graphics Context
    osg::ref_ptr<osg::GraphicsContext> graphicsContext = osg::GraphicsContext::createGraphicsContext(traits.get());
    
    _root = new osg::MatrixTransform();
    
    osg::ref_ptr<osg::Node> model = (osgDB::readNodeFile("/Users/cnmobi/Desktop/osg-iphone/IPhone_Project/1.ive"));
    _root->addChild(model);
    _viewer = new osgViewer::Viewer();
    
    
    if(graphicsContext)
    {
        _viewer->getCamera()->setGraphicsContext(graphicsContext);
        _viewer->getCamera()->setViewport(new osg::Viewport(traits->x, traits->y, traits->width, traits->height));
    }
    
    _viewer->setSceneData(_root.get());
   osgGA::MultiTouchTrackballManipulator * _cameraManipulator = new osgGA::MultiTouchTrackballManipulator();
    _viewer->setCameraManipulator(_cameraManipulator);
    _viewer->realize();
    
    // draw a frame
    _viewer->frame();
    
    osg::setNotifyLevel(osg::INFO);
    //add
    //旋转和放大缩小,可能与以下代码有关
    [NSTimer scheduledTimerWithTimeInterval:1.0/30.0 target:self selector:@selector(updateScene) userInfo:nil repeats:YES];

//Configure and start accelerometer
[[UIAccelerometer sharedAccelerometer] setUpdateInterval:(1.0 / kAccelerometerFrequency)];
[[UIAccelerometer sharedAccelerometer] setDelegate:self]


//updateScene 方法


- (void)updateScene {
    _viewer->frame();
}
2013-08-06 18:00:24 x1135768777 阅读数 7256
  • ARKit视觉风暴

    课程介绍 本套课程从技术理念到项目实践,教大家系统掌握ARKit技术开发,随心打造iOS端AR增强现实应用。由一开始的开发环境搭建,到Unity ARKit Plugin、ARFoundation ARKit等不同时期技术的讲解。从平面模型放置、识别图片、手势交互、3D物体识别、面部AR贴纸、光照估计、环境探针、多人 AR技术,甚至包含ARKit3.0的动作捕捉技术等。除了以上课程内容,更加入了随着技术更新与时俱进更新的ARKit连载技术教学内容。 课程收益 轻松理解ARKit的技术原理,从零到一创建自己的第一个AR项目。 学习Unity ARKit Plugin经典技术,了解ARKit中的常见概念和原理。 学会在 ARFoundation 中使用ARKit,进行企业级AR项目开发。 学会如何在AR项目里播放模型动画,通过触屏手势交互实现模型的旋转和缩放。 了解ARKit的图片识别,掌握AR卡片、AR书籍的实现方法。 学会使用面部增强技术,实现热门短视频应用的AR贴纸效果,实现面部表情追踪。 学会使用ARKit物体检测技术,实现3D物体识别,可以广泛应用于工业、建筑、古董、玩具手办、艺展览等不同场景。 学习ARKit中的经典交互案例,优化AR项目的用户体验。 熟练使用环境纹理、光照估计技术,让AR内容随当前现实场景自动变化调节,看起来更加真实。 基于World Map、Collaborative Session AR技术,实现AR场景的持久化及多人AR体验效果。

    88 人正在学习 去看看 翟喜峰

                    载入blender文件产生的*.obj文件

       3d的模型可以用3dMAX 和blender 等的软件制作,而导出的.obj文件ios是不能直接识别的,

需要通过perl脚本编译执行产生的.h文件,使用里面的三个数组。代码就不写了网上有很多代码

自己去下就行了。先打开Mac的终端cd 到perl脚本目录然后 敲入  perl obj2opengl.pl  test.obj 

然后就会生成test.h 文件。如下图:



2016-07-30 23:29:49 a547720714 阅读数 4878
  • ARKit视觉风暴

    课程介绍 本套课程从技术理念到项目实践,教大家系统掌握ARKit技术开发,随心打造iOS端AR增强现实应用。由一开始的开发环境搭建,到Unity ARKit Plugin、ARFoundation ARKit等不同时期技术的讲解。从平面模型放置、识别图片、手势交互、3D物体识别、面部AR贴纸、光照估计、环境探针、多人 AR技术,甚至包含ARKit3.0的动作捕捉技术等。除了以上课程内容,更加入了随着技术更新与时俱进更新的ARKit连载技术教学内容。 课程收益 轻松理解ARKit的技术原理,从零到一创建自己的第一个AR项目。 学习Unity ARKit Plugin经典技术,了解ARKit中的常见概念和原理。 学会在 ARFoundation 中使用ARKit,进行企业级AR项目开发。 学会如何在AR项目里播放模型动画,通过触屏手势交互实现模型的旋转和缩放。 了解ARKit的图片识别,掌握AR卡片、AR书籍的实现方法。 学会使用面部增强技术,实现热门短视频应用的AR贴纸效果,实现面部表情追踪。 学会使用ARKit物体检测技术,实现3D物体识别,可以广泛应用于工业、建筑、古董、玩具手办、艺展览等不同场景。 学习ARKit中的经典交互案例,优化AR项目的用户体验。 熟练使用环境纹理、光照估计技术,让AR内容随当前现实场景自动变化调节,看起来更加真实。 基于World Map、Collaborative Session AR技术,实现AR场景的持久化及多人AR体验效果。

    88 人正在学习 去看看 翟喜峰

一.小记

最近公司有个需求,需要用unity3D建立3D模型,并且实现切换功能,由于做开发时间不算长,又没有接触过unity3D, 所以只能一头雾水去网上查找资料,也看了雨松MOMO的文章,不过都是几年前的了,有些东西已经不适用了,只能边看边研究,今天终于有点眉目了,可以在unity3D导出的iOS工程文件的基础上,对3D建模的页面进行修改,并能够执行一些操作了。


二.实现细节

unity3D 版本: 5.3.4

Xcode    版本: 7.3.1

首先就是需要做unity3D的人员将相应的模型上绑定好脚本,并告知你模型或者说要操作的对象的名称和要调用的方法名称,这里由于我要实现的是切换摄像机的角度,所以名称为mycamera(我希望是驼峰命名myCamera,可惜unity3D那边不是我写的,就不要在意这些细节了,自己注意就好),导出的时候在playerSetting中做好各种设置,选择使用模拟器调试、SDK版本什么的,这里就不赘述了。

导出的包如果是压缩后传过来的,那么解压后需要稍等一会才能看见文件夹中的xcodeproj文件,不知道什么原因可能是文件太大了吧......

打开xcodeproj文件,首先编译一下试试,很大可能报一个错误


编译报错

意思是说MapFileParser.sh文件没有权限执行,这样我们进入中端,给予这个文件权限


给MapFileParser.sh权限

这样,报错就能够成功解决了,再次运行就会出现没有加工处理过的原生的unity3D的内容了


比如像这个杯子的3D模型

文件能正常编译运行,我们就可以进行下一步了。

我们在导出的工程中自己添加文件MyViewInit


添加自己的文件

在文件中写入自己想要实现的代码


MyViewInit.h

MyViewInit.m

MyViewInit.m

当一个简单的界面搭建好之后,我们就要先测试一下是否能够添加到U3D模型界面,在工程文件夹中找到Classes文件夹,点击展开,找到UnityAppController.mm文件,该文件是U3D工程的启动文件


找到UnityAppController.mm文件

在文件的最上部分,导入自己写的文件的头文件

#import "MyViewInit.h"

找到方法


didFinishLaunching

在方法最底部添加布置UI的代码


布置UI

其中UnityGetGLViewController() 是U3D模型视图中的根视图控制器

(如果在老版本的unity3D中可能需要对此进行更改)

然后就可以点击运行进行测试了,不出什么意外的话,就可以显示在模型视图上了


添加UI控件后的视图

怎么样,效果立竿见影吧!

下面进行最重要的一步,向U3D模型发送消息,回到MyViewInit.m文件,为两个button添加的点击事件完成实现,别忘了在.h文件声明


实现button点击事件

为了防止发生小意外找不到错误,可以先在这里打印,看看按钮是否响应点击事件,如果能成功打印,那就万事大吉了。


这里要着重说一点,雨松MOMO在他的一篇文章中讲述了这方面的内容,他使用的是继承自UIViewController的文件,并使用对象方法来写UI和点击事件,不知道为什么,添加的UI空间可以显示,但是button不响应点击事件,我还暂时没有深究原因,待后续更新。


在点击事件中,使用U3D已经写好的方法

UnitySendMessage("mycamera", "changeModel", "");

第一个参数 填写接受方法的物品或者模型名称。

第二个参数 填写方法名字。

第三个参数 填写要传的参数,没有要传的参数直接写"",这里不能写nil,会crash。

这样再次运行,就可以啦,我这里实现的是点击按钮切换模型

------------------------------------------------------------------------------------------------------------------------------------------------------------

2017年03月10日09:49:20  更新

------------------------------------------------------------------------------------------------------------------------------------------------------------

有很多朋友会问,自己添加的点击事件不响应,实例方法不响应,但是类方法却响应。这里其实是在程序运行的时候,你所添加button的视图控制器被U3D的系统方法替换掉了,导致按钮被释放,所以肯定也不会有事件响应了,下图注释的部分就是U3D系统替换你的ViewController的方法。


所以想要保证视图控制器不被释放,在创建的时候要加一个static即可解决。


需要demo的可以加我
欢迎支持

2019-04-10 10:07:33 yaojinhai06 阅读数 37
  • ARKit视觉风暴

    课程介绍 本套课程从技术理念到项目实践,教大家系统掌握ARKit技术开发,随心打造iOS端AR增强现实应用。由一开始的开发环境搭建,到Unity ARKit Plugin、ARFoundation ARKit等不同时期技术的讲解。从平面模型放置、识别图片、手势交互、3D物体识别、面部AR贴纸、光照估计、环境探针、多人 AR技术,甚至包含ARKit3.0的动作捕捉技术等。除了以上课程内容,更加入了随着技术更新与时俱进更新的ARKit连载技术教学内容。 课程收益 轻松理解ARKit的技术原理,从零到一创建自己的第一个AR项目。 学习Unity ARKit Plugin经典技术,了解ARKit中的常见概念和原理。 学会在 ARFoundation 中使用ARKit,进行企业级AR项目开发。 学会如何在AR项目里播放模型动画,通过触屏手势交互实现模型的旋转和缩放。 了解ARKit的图片识别,掌握AR卡片、AR书籍的实现方法。 学会使用面部增强技术,实现热门短视频应用的AR贴纸效果,实现面部表情追踪。 学会使用ARKit物体检测技术,实现3D物体识别,可以广泛应用于工业、建筑、古董、玩具手办、艺展览等不同场景。 学习ARKit中的经典交互案例,优化AR项目的用户体验。 熟练使用环境纹理、光照估计技术,让AR内容随当前现实场景自动变化调节,看起来更加真实。 基于World Map、Collaborative Session AR技术,实现AR场景的持久化及多人AR体验效果。

    88 人正在学习 去看看 翟喜峰
  • CATransformLayer 3D渲染层

CATransformLayer是一个用来渲染3d模型的层,显示的是3维空间,不同于2维平面,所以会忽略filters, backgroundFilters, compositingFilter, mask, masksToBounds, shadow等2维平面的属性,并且也不会调用hitTest:方法。

设备:xcode 10.1

语言:swift 4.2

我们在CATransformLayer上建立子层用来显示3d动画。我们先来看下效果。

 

整体思路:

创建一个CATransformLayer为containLayer,并且设M34做深景模式,然后在containLayer上面添加6个面,对成一个立体图,然后旋转containLayer。

代码实现:

定义一个 CATransformLayer

var containLayer: CATransformLayer!

创建一个CATransformLayer

containLayer = CATransformLayer();
containLayer.backgroundColor = UIColor.green.cgColor;
containLayer.frame = sRect;
view.layer.addSublayer(containLayer);
containLayer.position = self.view.center;

创建6个面,组成一个立体形状:

func createSubLayer() -> Void {
        var tranfrom = CATransform3DMakeTranslation(0, 0, sRect.width/2);
        addSubLayerTo(trans: tranfrom,index: 1);
        
        tranfrom = CATransform3DMakeTranslation(0, 0, -sRect.width/2);
        addSubLayerTo(trans: tranfrom, index: 2);
        
        tranfrom = CATransform3DMakeTranslation(0, sRect.height/2,0);
        tranfrom = CATransform3DRotate(tranfrom, .pi/2, 1, 0, 0);
        addSubLayerTo(trans: tranfrom, index: 3);
        
        tranfrom = CATransform3DMakeTranslation(0, -sRect.height/2, 0);
        tranfrom = CATransform3DRotate(tranfrom, .pi/2, 1, 0, 0);
        addSubLayerTo(trans: tranfrom, index: 4);
        
        tranfrom = CATransform3DMakeTranslation(sRect.width/2, 0, 0);
        tranfrom = CATransform3DRotate(tranfrom, .pi/2, 0, 1, 0);
        
        addSubLayerTo(trans: tranfrom, index: 5);
        tranfrom = CATransform3DMakeTranslation(-sRect.width/2, 0, 0);
        tranfrom = CATransform3DRotate(tranfrom, .pi/2, 0, 1, 0);
        
        addSubLayerTo(trans: tranfrom, index: 6);
        
    }
    func addSubLayerTo(trans: CATransform3D,index: Int) -> Void {
        let layer = CATextLayer();
        layer.frame = .init(x: 0, y: 0, width: sRect.width, height: sRect.height);
        
        containLayer?.addSublayer(layer);
        layer.transform = trans;
        layer.backgroundColor = UIColor.random.cgColor;
        layer.string = "\(index)";
        layer.alignmentMode = .center;
        layer.contentsGravity = .center;
        layer.fontSize = 40;
        layer.foregroundColor = UIColor.random.cgColor;
    }

运行动画:

func runAnimation() -> Void {
        
        var frame = CATransform3DIdentity;
        frame.m34 = -1.0/500.0;
        frame = CATransform3DRotate(frame, degree, 0, 1, 0);
        
        degree += .pi * 1.1
        var toend = CATransform3DIdentity;
        toend.m34 = -1.0/500;
        toend = CATransform3DRotate(toend, degree, 1, 1, 1);
        
        let transform3d = CABasicAnimation(keyPath: "transform");
        transform3d.duration = 5;
        transform3d.fromValue = frame;
        transform3d.toValue = toend;
        transform3d.repeatCount = 100;
        transform3d.fillMode = .forwards;
        transform3d.isAdditive = true;
        transform3d.autoreverses = true;
        
        containLayer?.add(transform3d, forKey: "transform3d");
    }

 

最后demo地址猛戳这里 

没有更多推荐了,返回首页