前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SceneKit- 画中画效果实现方案

SceneKit- 画中画效果实现方案

作者头像
酷走天涯
发布2019-06-15 11:20:24
7910
发布2019-06-15 11:20:24
举报

本节学习目标

  • 实现画中画效果

10FD7AC6-5600-4313-8775-0F8A12A06F19.png

如图所示

白的部分是一个plane几何的节点,我们需要将一个SCNScene渲染到这个节点上,来实现画中画效果

Scenekit_17.gif

接下来 我简单的说一下思路

1.首先我们需要一个SCNView 作为渲染的视图, 2.然后创建一个游戏场景SCNScene 给这个SCNView视图 3.给场景中添加一个地板节点和一个plane平面节点 4.我们还创建一个SCNScene 场景,将我们需要放置在plane上的3D 元素添加到这个场景中进去, 5.注意如果直接使用plane.firstMaterial?.diffuse.contents = scene 这样做是渲染不出来画面的,我们需要创建一个SCNView 来持有scene ,然后将SCNView 设置为plane渲染的内容

下面是全部代码

    let scene = SCNScene()
    
    // 创建照相机
    let cameraNode = SCNNode()
    cameraNode.camera = SCNCamera()
    cameraNode.camera?.automaticallyAdjustsZRange = true
    scene.rootNode.addChildNode(cameraNode)
    cameraNode.position = SCNVector3(x: 0, y: 10, z: 100)
    
    // 创建灯光
    let lightNode = SCNNode()
    lightNode.light = SCNLight()
    lightNode.light!.type = .omni
    lightNode.position = SCNVector3(x: 0, y: 10, z: 10)
    scene.rootNode.addChildNode(lightNode)
    
    let ambientLightNode = SCNNode()
    ambientLightNode.light = SCNLight()
    ambientLightNode.light!.type = .ambient
    ambientLightNode.light!.color = UIColor.darkGray
    scene.rootNode.addChildNode(ambientLightNode)
    
    // 设置相关属性
    let scnView = self.view as! SCNView
    scnView.scene = scene
    scnView.allowsCameraControl = true
    scnView.showsStatistics = true
    scnView.backgroundColor = UIColor.black
    
    
    // 创建一面墙
    let plane = SCNPlane(width: 50, height: 50)
    let planeNode = SCNNode(geometry: plane)
    planeNode.position = SCNVector3Make(0, 25, 0)
    scene.rootNode.addChildNode(planeNode)
    scnView.isPlaying = true
    
    
    // 创建一个地板
     let floorNode = SCNNode()
    floorNode.geometry = SCNFloor()
    floorNode.geometry?.firstMaterial?.diffuse.contents = "floor.jpg"
    scene.rootNode.addChildNode(floorNode)
    
    // 创建内画面
    let sceneShip = SCNScene(named: "art.scnassets/ship.scn")!
    let cameraNode1 = SCNNode()
    cameraNode1.camera = SCNCamera()
    sceneShip.rootNode.addChildNode(cameraNode1)
    cameraNode1.position = SCNVector3(x: 0, y: 0, z: 10)
    let ship = sceneShip.rootNode.childNode(withName: "ship", recursively: true)!
    ship.runAction(SCNAction.repeatForever(SCNAction.rotateBy(x: 0, y: 2, z: 0, duration: 1)))
    let view = SCNView(frame: CGRect(x: 0, y: 0, width: 1000, height: 1000))
    view.scene = sceneShip
    view.backgroundColor = UIColor.gray
    
    // 设置内画面视图为plane渲染的纹理
    plane.firstMaterial?.diffuse.contents = view
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.09.19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档