【问题标题】:cheap shadow in SceneKitSceneKit 中的廉价阴影
【发布时间】:2016-02-07 20:41:57
【问题描述】:

是否可以在 SceneKit 中投射静态阴影?不知道静态是否是正确的词。我只想在我的物体下落时在它下面有一个光滑的黑色圆圈。对象在 y 和 x 方向上移动。我知道我可以使用 sampleRadius 属性,但这会对性能产生重大影响。我在其他游戏引擎中看到过这样的事情,我想知道我是否也可以在 SceneKit 中实现它。

编辑:

我用过这个,但我只拍了很少闪电的黑色场景。地板看起来完全是黑色的。我尝试了不同的图案片图像,但没有运气。我错过了什么?

    let spotNode = scene.rootNode.childNodeWithName("spot", recursively: true)
    let spotlight = spotNode?.light
    spotlight?.categoryBitMask = 1
    spotlight!.shadowMode = SCNShadowMode.Modulated
    spotlight?.gobo?.contents = UIImage(named: "goboImage")
    floorNode?.categoryBitMask = 1

//苹果代码:

// Use modulated mode
light.shadowMode = SCNShadowModeModulated;

// Configure the projected shadow 
light.gobo.contents = aShadowImage;

// Use bit masks to specify receivers 
light.categoryBitMask = kProjectorLightMask; 
floor.categoryBitMask = kProjectorLightMask;

【问题讨论】:

  • “Blob shadow”是我看到最多的术语。

标签: ios scenekit


【解决方案1】:

您需要使用SCNShadowModeModulated 阴影模式。 WWDC 2014 的 Building a Game with SceneKit 演示文稿中深入解释了不同的阴影技术。

【讨论】:

  • 感谢您的光临。我用我现在所拥有的内容编辑了我的问题。
  • SCNNode 实例的默认categoryBitMask 已经是1,因此灯光和地板没有绑在一起。尝试0x2 或任何位掩码,例如bitmask & 0x1 == 0x0
  • 我尝试了 0x1 用于地板和灯光,0x1 用于灯光,0x2 用于地板,0x2 用于两者......它总是导致完全黑色的地板。不完全确定 0x1 表示法代表什么..
【解决方案2】:

关于这个的一般:

categoryBitMask 代表“类别”。 因此,当您在灯光上设置 categoryBitMask 时,您是在说“此灯光只会照射此类别中的对象

例如:

static let WorldCategory: Int = 1 << 0 // Category for background objects
static let GameObjectsCat: Int = 1 << 1 // Category for monsters in the game :)

...
// When setting up the lights
spotlight.categoryBitMask = GameObjectsCat // Light will only affect game objects
spotlight.castsShadow = true

...

// Pretend this is a SCNNode representing a 3d fortress...
// Will not be affected the by spotlight or project it's shadows
fortress.categoryBitMask = WorldCategory

// Pretend this is a SCNNode representing a evil 3d monster...
// Affected by spotlight and projects shadows
orc.categoryBitMask = GameObjectsCat  
orc.castsShadow = true

这是对categoryBitMask 的普遍看法。

在您的情况下,我们希望:

  1. 创建调制光 (SCNShadowMode.Modulated)
  2. 设置gobo图片
  3. 将光照和地板设置为相同的categoryBitMask,但确保没有为任何其他节点(如游戏角色或其他)设置它。提示是创建一个新类别,如static let SimpleShadow: Int = 1 &lt;&lt; 2

这盏灯不会照亮场景中的任何东西(甚至是地板),它只会将您的gobo 投射到它所指向的地方。所以需要第二个光源才能看到某些东西(环境最简单)。

我没有机会对此进行测试,所以我根据我记得的内容来写。 :)

但请注意。通过正确使用categoryBitMask,您可以轻松创建一个“特殊灯光”,旨在将您的主角的真实阴影投射到地板节点上。这将非常便宜,因为仅针对单个节点计算阴影,并针对单个节点进行投影。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2016-06-11
    • 2010-11-10
    • 2017-11-17
    • 2015-07-01
    • 2021-02-19
    • 2020-05-06
    • 2019-03-10
    • 2016-09-16
    • 2015-06-29
    相关资源
    最近更新 更多