【问题标题】:Add 2D Shape to SceneKit将 2D 形状添加到 SceneKit
【发布时间】:2018-02-09 21:01:31
【问题描述】:

我想在 SceneKit 中显示一个 3D 模型,但也想在模型中放置一些 2D 形状(例如,可以点击一个可以触发交互的圆圈)。

实现这一目标的最佳方法是什么?

它应该是什么样子:

不成功的方法:使用了一个小高度的常规SCNNode,但这不像二维图形(透视变化)

编辑:

  • 现在我将圆圈作为精灵工具包节点添加到叠加视图中

    sceneView.overlaySKScene = SKScene.init(size: sceneView.frame.size)
    sceneView.overlaySKScene?.addChild(circle)
    
  • 我还尝试获取相应节点的屏幕坐标,我想在其中显示 SpriteKit 圆圈在前面:

    func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
    
        let screenPoint = sceneView.projectPoint(interactionNode!.position)
    
        print(screenPoint)
    
        circle.position = CGPoint.init(x: CGFloat(screenPoint.x), y: CGFloat(screenPoint.y))
    

    }

但是,sceneView.projectPoint 给了我很奇怪的结果,即使节点显示在屏幕中间,也有离屏范围返回...

【问题讨论】:

  • 请展示你到目前为止所做的事情
  • 嘿,到目前为止,我只是添加了一个高度非常小的常规 SceneKit 节点(圆柱体)(例如 0.001)。但是,这并不像我想要的那样,因为它看起来更像是模型上的“贴纸”,这意味着它的视角发生了变化,相反,它应该始终以相同的方式显示(就像 HUD)
  • 你能显示一些代码吗?
  • 在 SCNView 上使用基于 Spritekit 的叠加层。例如,请参阅我的答案:stackoverflow.com/questions/46298338/…
  • 我看到您已经为此提出了一个新问题,只需在此处添加一个链接即可完成:stackoverflow.com/questions/48707732/… 是的,如果节点是子节点或已转换,请使用 worldposition 属性。

标签: ios swift xcode scenekit


【解决方案1】:

您想使用 overlaySKScene,这将允许您将(高性能)2D Spritekit 内容放置在您的 Scenekit 场景“顶部”。以下是我在应用中的操作方式:

首先在 HUD 中定义您想要的 Spritekit 内容:

class HUD: SKScene {
var shields: SKShapeNode(imageNamed: "shieldGrid")
var crosshairs = SKSpriteNode(imageNamed: "xenonHUD")
public var computerStatus = SKLabelNode()
public var enemyIndicator = SKLabelNode()

func shipHud.flashAlert( alert: String) {
   computerStatus.text = alert
}

然后,在您的主视图控制器(您在其中实例化 SceneView)中,将此类设为您的场景概览,并从那里控制它:

class MyGameViewController: UIViewController, SCNPhysicsContactDelegate, SCNSceneRendererDelegate {
var scnView: SCNView! 
// setup HUD
    shipHud = HUD(size: self.view.bounds.size)
    scnView.overlaySKScene = shipHud
    shipHud.flashAlert("Oh My God!")

}

使用 overlaySKScene 混合 SceneKit 和 Spritekit 内容

【讨论】:

  • 感谢使用overlaySKScene的提示!我现在可以将 2d 圆显示为精灵套件节点。但是:我仍然无法在正确的位置显示它(这意味着,在 3d 模型中相应节点的前面)......你知道如何始终在前面显示精灵套件节点场景套件节点?
  • 抱歉回复晚了。使用 projectPoint(_ point: SCNVector3) 将 SceneKit 节点的 3D 坐标转换为 2D 坐标 - 只需抓取 SCNVector3 的前两个元素 - 它们代表场景渲染器中的 X 和 Y 坐标。
猜你喜欢
  • 2014-12-31
  • 2013-04-15
  • 1970-01-01
  • 2017-03-13
  • 2014-08-29
  • 2013-11-03
  • 2015-03-15
  • 1970-01-01
  • 2020-06-13
相关资源
最近更新 更多