SceneKit是一组类,可以用来在App中创建和呈现3D场景。
它还可以和core animation和sprite kit无缝交互,这就意味着我们可以在多种上下文中使用SceneKit

1、SceneKit的结构
SceneKit通过SCNView来呈现一切。它是UIView(NSView For OS X)的一个子类。在SCNView的内部,创建和准备一个场景(SCNScene)。场景中包含节点,这些节点被编排为一个场景图:一个节点有0个或多个子节点, 但是只能有一个父节点。

2、添加SceneKit视图
创建一个新的iOS应用程序
添加SceneKit框架:在项目导航器的顶部选择项目,在项目设置内向下滚动至:linked frameworks and libraries部分,单击+,选择SceneKit.framework
将主视图控制器的类由UIView改成SCNView
在viewDidLoad中添加代码

import UIKit
import SceneKit
 class SceneKitViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let sceneView = self.view as! SCNView sceneView.backgroundColor = UIColor.grayColor() // Do any additional setup after loading the view. } }

这时运行,即可看到灰色的背景

3、添加场景:向viewDidLoad中添加如下代码

// 添加场景
        let sceneOne = SCNScene()
        sceneView.scene = sceneOne

SCNScene对象是所有SceneKit对象的容器。想要向用户显示的对象都要放在这个容器内。注意,尽管我们可以有多个场景,但是视图中一次只能有一个场景可见。

4、添加照相机
照相机是用户进入3D场景的门户,它们是你观察3D世界的虚拟眼睛。你看到的东西取决于照相机的位置,角度和一些其它参数。
如何添加照相机:

// 添加照相机 并指明水平和垂直视角都是45度
        let cameraOne = SCNCamera()
        cameraOne.xFov = 45
        cameraOne.yFov = 45

下面,需要将照相机附加到一个节点上:

// 将照相机附加到节点
        let cameraNode = SCNNode()
        cameraNode.camera = cameraOne
        cameraNode.position = SCNVector3(0,0,20)
        sceneOne.rootNode.addChildNode(cameraNode)

5、添加3D对象:一枚胶囊

// 添加3D对象
         let capsuleOne = SCNCapsule(capRadius: 2.5,height: 10)
        let capsuleNodeOne = SCNNode(geometry: capsuleOne)
        capsuleNodeOne.position = SCNVector3(0,0)
        sceneOne.rootNode.addChildNode(capsuleNodeOne)

此时可以看到一枚白色的胶囊。屏幕上木有光照,所以默认为全亮度的白色。

6、添加光源
有许多不同类型的光源可供使用:
*环境光源:在整个场景内投射均匀光
*泛光源:从单个点向所有方向辐射光线
*平行光源:在单个方向上投射光
*聚光源:在给定方向上从单个方向投射光

下面给胶囊添加一个环境光源和一个泛光源

// 添加环境光源
        let ambientLight = SCNLight()
        ambientLight.type = SCNLightTypeAmbient
        ambientLight.color = UIColor(white: 0.25,alpha: 1.0)
        let ambientNodeOne = SCNNode()
        ambientNodeOne.light = ambientLight
        sceneOne.rootNode.addChildNode(ambientNodeOne)
        // 添加泛光源
        let omniLight = SCNLight()
        omniLight.type = SCNLightTypeOmni
        omniLight.color = UIColor(white:1.0,alpha: 1.0)
        let omniNodeOne = SCNNode()
        omniNodeOne.light = omniLight
        omniNodeOne.position = SCNVector3(-5,8,5)
        sceneOne.rootNode.addChildNode(omniNodeOne)

swift 快速奔跑的兔几 本节的内容是:SceneKit 第一说 创建一个3D胶囊的更多相关文章

  1. 基于HTML5 WebGL的3D机房的示例

    这篇文章主要介绍了基于HTML5 WebGL的3D机房的示例的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. 基于HTML5 Canvas的3D动态Chart图表的示例

    这篇文章主要介绍了基于HTML5 Canvas的3D动态Chart图表的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  3. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  4. ios – SceneKit.哪种方式起来了?

    似乎大多数3D创作应用程序使用Z作为“向上”轴.而SceneKit使用Y作为’向上’轴.SceneKit允许您将场景加载为Collada.DAE文件.通过以下任一方式加载场景时:要么您可以指定选项,包括SCNScenesourceConvertToYUpKey和SCNScenesourceConvertUnitsToMetersKey.相应地设置这些,我期望当我将它们添加到从加载场景中的节点构造的

  5. 如何在iOS 11 ARKit-Scenekit中为SCNNode创建边框以指示其选择?

    如何绘制边框以突出显示SCNNode并向用户指示该节点已被选中?在我的项目中,用户可以放置多个虚拟对象,用户可以随时选择任何对象.选择后,我应该向用户显示高亮显示的3D对象.有没有办法直接实现这个或在SCNNode上绘制边框?

  6. ios – 如何使用blender和PowerVR SDK为cocos3d创建一个简单的3d球体

    我是cocos3d的新手.我想创建一个简单的项目–旋转的3d球体.我用搅拌机设计了一个3d球体.所以我想要帮助创建collada文件和pod文件.使用blender和PowerVRSDK创建这个简单的3d对象时应该注意什么.谢谢解决方法如何在搅拌机中制作简单的球体,然后使用JeffLamarche的Blender-to-iOSscript将其导出?这甚至不需要Cocos或PowerVR,但这是一个良好的开端.由于您可以在iOS中轻松地将Cocos与非Cocos类集成,因此可能会有所帮助.你可以更进一步,利

  7. ios – 在球体表面SceneKit上写文字?

    我想知道是否有一种方法可以在SceneKit中沿着球体对象的表面写入文本.我知道如果我有一个图像,我会在表面上放置纹理并实现这种效果,但我想知道我是否可以在球体表面上以某种方式动态添加文本.任何的想法?

  8. ios – Swift Scenekit – 居中SCNText – getBoundingBoxMin:Max问题

    享受SCNText上的alignmentMode选项.谷歌搜索周围看起来像alignmentMode和containerFrame有问题.我发现的替代方案建议使用获取边界框功能来查找文本大小,然后相应地手动调整.很棒,除了我不能让功能工作.当我试图得到两个向量时,我得到一个错误:‘SCNVector3’无法转换为’UnsafeMutablePointer”我在几何和节点上得

  9. ios – 如何将视频从AVAssetExportSession保存到相机胶卷?

    在此先感谢您的帮助.解决方法只需使用session.outputURL=…

  10. ios – 永远动画SCNNode – SceneKit,Swift

    我想永远动画2个立方体,直到用户点击其中一个.动画应该像∞一样.这些是我想要动画的sceneView中的我的立方体:我试图用嵌套动画做到这一点,它确实部分工作.现在,由于动画总是等到它们在开始新动画之前完成,它看起来并不光滑.在继续开发∞动画之前,我想知道是否有更好的方式.这是我目前的代码:输出显示以下内容:log0,log5,log6,log1,log2,log4,log2…解决方法如果要为SCNNode设置动画,请让节点运行SCNAction.迅速:Objective-C的:上面的代码将永久地上下调整

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部