ios - 在 Swift SpriteKit 中将静态阴影附加到动态 physicsBody 球的底部

标签 ios swift sprite-kit

我想创建这个如图所示

enter image description here

我得到了一个正常的物理球体,它具有动态、受重力影响并且可以旋转。 问题是,无论何时您将一个 child 附加到可以旋转的球上, Sprite 都会跟随球进行相同的运动。

让阴影停留在球底部的最佳方法是什么?我可以直接做吗:

ball.addChild(shadow)

有某种属性可以让它在底部保持静态吗?或者我应该

self.addChild(shadow)

然后在 update() 期间

shadow.position(ball's position)

提前致谢。

最佳答案

我建议使用 SKShader 来应用简单的阴影效果。

您需要创建一个扩展名为 .fsh 的空文件,让我们使用 shader.fsh。着色器代码将生成一个 z 属性,它是基于每个像素到图像中心的距离的“伪”深度。使用 z,它计算法线,阴影强度是法线和光源位​​置的点积(这里我将光源放在场景的左上角):

void main()
{
    vec2 coord = (v_tex_coord - 0.5) * 2.0;

    if (length(coord) > 1.0) {
        discard;
    }

    vec3 diffuseColor = SKDefaultShading().rgb;

    vec3 lightPosition = normalize(vec3(-1.0, 1.0, 1.0));

    float z = sqrt(1.0 - coord.x * coord.x - coord.y * coord.y);
    vec3 normal = normalize(vec3(coord.x, coord.y, z));

    float shadow = max(0.0, dot(normal, lightPosition));

    diffuseColor *= shadow;

    gl_FragColor = vec4(diffuseColor, 1.0);
}

您现在可以像这样对形状节点进行着色:

    let ball = SKShapeNode(circleOfRadius: 50)
    ball.fillColor = .yellow()
    ball.strokeColor = .clear()

    ball.fillShader = SKShader(fileNamed: "shader.fsh")

..并且,对于您的 sprite 节点,只需设置 shader 属性:

    ball.shader = SKShader(fileNamed: "shader.fsh")

然后使用这张图片:

enter image description here

阴影版本看起来像:

enter image description here

干杯!

西蒙

关于ios - 在 Swift SpriteKit 中将静态阴影附加到动态 physicsBody 球的底部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38112437/

相关文章:

iphone - avaudiorecorder 在录制后播放时会扭曲声音

ios - Swift:如何更改 UIImagePickerController 的按钮 "Use Photo"、 "Cancel"、 "Shoot"、 "Retake"的默认行为

ios - Apple Reachability 未显示警报

sprite-kit - 如何在Spritekit中创建渐变?

objective-c - 转到新导航 Controller 动画后弹出键盘如何完成

ios - 如何在 iPhone X 上居中自定义标签栏项目

swift - 如何使用 Do-Try-Catch 修复 "Invalid conversion from throwing function of type X to non-throwing function type Y"

ios - 将 Swift 数组过滤器的结果限制为 X 以提高性能

ios - Spritekit 中的新场景没有显示任何内容?

ios - 如何阻止 Sprite Kit 使用 iAd 横幅重新初始化场景