3D全景-SceneKit

SceneKit是用來構建3D場景的框架。包含了如光照、模型、材質、攝像機等高級引擎特性。

概述

每個SCNView中都帶有一個場景SCNScene,它用來承載那些帶有幾何結構、光度、相機以及其他屬性的節(jié)點SCNNode。一個SCNScene可以包含多個SCNNode子節(jié)點,它們一般都是呈樹狀結構。

SCNView && SCNScene

SCNScene相當于一個虛擬的 3D 空間

//1.創(chuàng)建一個3D場景
self.scnView = [[SCNView alloc]initWithFrame:self.bounds];
self.scnView.scene = [SCNScene scene];
[self addSubview:self.scnView];

SCNNode

一個SCNNode相當于一個物體,它包含很多內容屬性,以下是常見的:

  • 攝像機(SCNCamera)
  • 幾何結構 (SCNGeometry)
  • 光源 (SCNLight)
  • 材質(SCNMaterial)

SCNCamera

SCNCamera決定我們可以看到場景中的哪一塊區(qū)域

 //2.創(chuàng)建一個camera節(jié)點,用來觀察球體
 self.cameraNode = [SCNNode node];
 self.cameraNode.camera = [SCNCamera camera];
 self.cameraNode.camera.automaticallyAdjustsZRange = YES; //自動添加可視距離
 self.cameraNode.position = SCNVector3Make(0, 0,0);
 self.cameraNode.camera.xFov = 45;
 self.cameraNode.camera.yFov = 45;
 [self.scnView.scene.rootNode addChildNode:self.cameraNode];
SCNCamera.png

上圖中包含以下幾點信息:

  • SceneKit 中 SCNCamera 拍攝的方向始終為 z 軸負方向。
  • 視野(xFov/yFov)是攝像機的可視區(qū)域的極限角度。角度越小,視野越窄,反之,角度越大,視野越寬。
  • 視錐體(Viewing Frustum)決定著攝像頭可視區(qū)域的深度(z 軸表示深度)。任何不在這個區(qū)域內的物體將被剪裁掉(離攝像頭太近或者太遠),不會顯示在最終的畫面中。

SCNGeometry

SceneNode提供幾種幾何模型:六面體(SCNBox)、平面(SCNPlane,只有一面)、無限平面(SCNFloor,沿著x-z平面無限延伸)、球體(SCNSphere)等等。

//3.創(chuàng)建一個球體(視覺對象)
self.ballNode = [SCNNode node];
SCNSphere *ball = [SCNSphere sphereWithRadius:100];//半徑不要設置太小
self.ballNode.geometry = ball;
/* 球體有兩個表面
 * 一個外表面一個內表面,在vr模式下,我們的眼睛是在球體中間的,所以讓球體只需渲染內表面,提高性能
 */ 
self.ballNode.geometry.firstMaterial.doubleSided = NO; //設置只渲染一個表面
self.ballNode.geometry.firstMaterial.cullMode = SCNCullModeFront; //設置剔除外表面
self.ballNode.position = SCNVector3Make(0, 0, 0);
[self.scnView.scene.rootNode addChildNode:self.ballNode];
SCNMaterial

SceneNode提供8種屬性用來設置模型材質

  • Diffuse 漫發(fā)射屬性表示光和顏色在各個方向上的反射量
  • Ambient 環(huán)境光以固定的強度和固定的顏色從表面上的所有點反射出來。如果場景中沒有環(huán)境光對象,這個屬性對節(jié)點沒有影響
  • Specular 鏡面反射是直接反射到使用者身上的光線,類似于鏡子反射光線的方式。此屬性默認為黑色,這將導致材料顯得呆滯
  • Normal 正常照明是一種用于制造材料表面光反射的技術,基本上,它試圖找出材料的顛簸和凹痕,以提供更現(xiàn)實發(fā)光效果
  • Reflective 反射光屬性是一個鏡像表面反射環(huán)境。表面不會真實地反映場景中的其他物體
  • Emission 該屬性是由模型表面發(fā)出的顏色。默認情況下,此屬性設置為黑色。如果你提供了一個顏色,這個顏色就會體現(xiàn)出來,你可以提供一個圖像。SceneKit將使用此圖像提供“基于材料的發(fā)光效應”。
  • Transparent 用來設置材質的透明度
  • Multiply 通過計算其他所有屬性的因素生成最終的合成的顏色

每個屬性都擁有contents屬性,來呈現(xiàn)視覺內容,可以設置為顏色和圖片

// 4.設置場景內容
//image這里是一張3D圖片(UIImage)
self.ballNode.geometry.firstMaterial.diffuse.contents = image;

/*設置紋理濾波,紋理過濾決定了材料屬性的內容的外觀
 *SCNFilterModeNone
 *SCNFilterModeNearest  當這個位置沒有紋理顏色時,會采樣離他最近的顏色值
 *SCNFilterModeLinear  當這個位置沒有紋理顏色時,線性插值顏色作為自己的顏色
 */
self.ballNode.geometry.firstMaterial.diffuse.mipFilter = SCNFilterModeLinear;

//設置contentsTransform,否則渲染出來的畫面會反置,因為我們是在球體中觀察的,好比看鏡中的自己
self.ballNode.geometry.firstMaterial.diffuse.contentsTransform = SCNMatrix4Translate(SCNMatrix4MakeScale(-1, 1, 1), 1, 0, 0);

SCNLight

光源有許多種:

1.環(huán)境光源,它在整個場景內投射均勻光
2.泛光源,這是用的最多的,就是點光源,向各個方向投射光
3.平行光源,在單個方向投射光
4.聚光源,在給定方向從單個位置投射光

//添加光源,光源的類型-環(huán)境光源
SCNLight *ambientLight = [SCNLight light];
ambientLight.type = SCNLightTypeAmbient;
ambientLight.color = [UIColor colorWithRed:0 green:.2 blue:0 alpha:.1];
self.ballNode.light = ambientLight;

小結

以上就是構建一個簡單的3D場景,更多復雜,多功能的場景就需要我們更深入的學習。本人是一名菜鳥,只是有興趣有時間學習、總結前輩的知識。

這是網(wǎng)上一位大神的DEMO:720度全景圖展示控件-帶魚眼效果-仿insta360,我是通過這份代碼學習,感謝前輩的DEMO,更深入的知識還有待自己去學習。

參考資料:
SceneKit
ARKit如何將太陽系裝進iPhone
VR+全景播放器+頭控講解

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容