第七节 - SCNCamera用法详解

SCNCamera

照相机原理分析

视角

视角

上图是一个游戏场景 照相机的位置为(10,0,0) 物体A的位置为(0,0-6),yFor 表示的是Y轴上的视角。图你可以不太理解,的确有点抽象。

举例说明:

在游戏引擎中,照相机好比就是你的眼睛,你眼睛在X轴(左右看)和Y轴(上下看)有个最大角度,这个角度我们叫做xFov和yFov,想想一下,如果是这视野大了,我们能看到的范围就会变大,这个时候,你拍一张照片,我的要求是,照片的大小和你手机大小一样,如果你视野小,你的照里面的物体就少,如果你视野大,你照片里面的物体就会变多,那么,对于同一个物体,当然在视野小的时候,显示的体积大,在视野大的时候,显示的体积小。就是这么简单。

视野小
视野大

焦距

焦距

f: 焦距 从图可以看出,焦距越大,视野越小,焦距越小视野越大

我相信你应该明白了游戏引擎中照相机的作用了吧! 记住:

我们显示在手机屏幕中的物体都是能被照相机看到的物体。


SCNCamera 详解

它的父类为NSObject

    @interface SCNCamera : NSObject <SCNAnimatable, SCNTechniqueSupport, NSCopying, NSSecureCoding>

创建对象的方法

 + (instancetype)camera;

给照相机对象设置名字

@property(nonatomic, copy, nullable) NSString *name;

X轴方向的视角(默认为60度)

@property(nonatomic) double xFov;

Y轴方向的视角(默认为60度)

@property(nonatomic) double yFov;

照相机能照到的最近距离(默认值为1)

@property(nonatomic) double zNear;

照相机能照到的最远距离(默认值为100)

@property(nonatomic) double zFar;

让照相机自动调节最近和最远距离(默认为关闭,开启后,没有最近和最远的限制)

@property(nonatomic) BOOL automaticallyAdjustsZRange NS_AVAILABLE(10_9, 8_0);

是否开启正投影模式

正投影就是说物体在远离或者靠近照相机是,大小保持不变

@property(nonatomic) BOOL usesOrthographicProjection;

设置正投影的比例 (默认为1)

注意,这里设置的比例越大,显示的图像越小,你可以这样理解scale = 屏幕的大小:图片的大小

@property(nonatomic) double orthographicScale NS_AVAILABLE(10_9, 8_0);

设置焦距(默认为10)

@property(nonatomic) CGFloat focalDistance NS_AVAILABLE(10_9, 8_0);

设置聚焦时,模糊物体模糊度(默认为0)

@property(nonatomic) CGFloat focalBlurRadius NS_AVAILABLE(10_9, 8_0);

决定进入焦点和离开焦点的过渡速度

@property(nonatomic) CGFloat aperture NS_AVAILABLE(10_9, 8_0);

用于检测节点碰撞使用

@property(nonatomic) NSUInteger categoryBitMask NS_AVAILABLE(10_10, 8_0);

走进代码的世界

第一步.创建工程

友情提示:我写的是系列教程,之前讲过的东西,代码注释不在写,如果看不懂,从入门1开始您的学习之旅。

让学习成为一种习惯
让学习成为一种习惯

第二步.添加框架

让学习成为习惯

第三步.添加游戏专用显示视图

// 添加scenekit 游戏专用视图SCNView
SCNView *scnView = [[SCNView alloc]initWithFrame:self.view.bounds];
scnView .backgroundColor = [UIColor blackColor];
[self.view addSubview:scnView ];
scnView .allowsCameraControl = true; // 开启操纵照相机选项

第四步.创建游戏场景

  scnView .scene = [SCNScene scene];

第五步.添加照相机

// 添加照相机
SCNCamera *camera = [SCNCamera camera];
SCNNode *cameraNode =[SCNNode node];
cameraNode.camera = camera;
cameraNode.position = SCNVector3Make(0, 0, 50);
[scnView.scene.rootNode addChildNode:cameraNode];

第六步.添加两个正方体

SCNBox *box1 = [SCNBox boxWithWidth:10 height:10 length:10 chamferRadius:0];
box1.firstMaterial.diffuse.contents = [UIImage imageNamed:@"1.png"];
SCNNode *boxNode1 =[SCNNode node];
boxNode1.geometry = box1;
[scnView .scene.rootNode addChildNode:boxNode1];

SCNBox *box2 = [SCNBox boxWithWidth:10 height:10 length:10 chamferRadius:0];
box2.firstMaterial.diffuse.contents = [UIImage imageNamed:@"2.png"];
SCNNode *boxNode2 =[SCNNode node];
boxNode2.position = SCNVector3Make(0, 10, -20);
boxNode2.geometry = box2;
[scnView .scene.rootNode addChildNode:boxNode2];

我们运行一下:

运行结果

接下来带大家感受以下上面几个重要属性的作用

调节X轴和Y轴视角

// 调节视角
camera.xFov = 20;
camera.yFov = 20;

运行结果:

学习是一件很开心的事情,就像玩一样

设置焦距

camera.focalDistance = 45;
camera.focalBlurRadius = 1;// 默认为0 你要有模糊度的值才能出现这种效果.

运行结果:

焦点我放在第一个物体上

看看性能吧

性能吃紧,君请珍惜

设置相机的最远能照到的物体

 camera.zFar = 60;
让学习成为一种习惯

设置正投影

 camera.usesOrthographicProjection = true;
设置正投影

设置正投影比例

 camera.usesOrthographicProjection = true;
 camera.orthographicScale = 10;

运行结果:

学习是一件很开心的事

补充点内容

上面我们有个操作是开启控制照相机

scnView .allowsCameraControl = true; 

到底如何操纵我详细讲解一下

1.一个手指头的时候,照相机对准(0,0,0)沿着球体表面旋转
2.两个手指头平移手势,照相机是在X轴和Y轴移动
3.捏合手势,是在Z轴移动

本节的内容相当重要,希望大家都动手操练一下,学习不在急,在于持之以恒!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,233评论 6 495
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,357评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,831评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,313评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,417评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,470评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,482评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,265评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,708评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,997评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,176评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,503评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,150评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,391评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,034评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,063评论 2 352

推荐阅读更多精彩内容

  • 一、实验目的 学习使用 weka 中的常用分类器,完成数据分类任务。 二、实验内容 了解 weka 中 explo...
    yigoh阅读 8,518评论 5 4
  • 分四部分,看相关书籍,看相关影相,看优秀的照片,拍照片。把每天看过的书籍和影相和优秀照片里自己可以吸收的部分总结出...
    Eleanorgan阅读 2,830评论 0 12
  • “ 别人笑我太疯癫,我笑他人看不穿!” 。于我看来,它映对了那句:我就是我! 生而为人,需历万千事,或难或易。何为...
    oneandone阅读 207评论 0 1
  • 在我看来,它们一直静静躺在电脑中,不带走一片云彩。 怀旧固然美好,但一味的沉溺于过去往昔并无半点裨益。 刚开始可能...
    伊索煜言阅读 442评论 0 0
  • 我透过晨光都记得 你握在手中牛奶的温度 那天 你拼命的跑 想要把那些温暖带给我 可是你走了 把温暖也带走了 ...
    阿火moete阅读 103评论 0 2