我想按照图片所示创建这个
ios - 将静态阴影附加到动态物理的底部Swift SpriteKit中的 body 球-LMLPHP
我有一个正常的身体球,有动力,受重力影响,可以旋转。
问题是,每当你把一个孩子附加到一个可以旋转的球上时,雪碧就会跟随和球一样的运动。
什么是使阴影停留在球底部的最佳方法?我可以直接做:

ball.addChild(shadow)

有一些属性会让它在底部保持静态?或者我应该
self.addChild(shadow)

然后在更新期间()
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")

然后使用此图像:
ios - 将静态阴影附加到动态物理的底部Swift SpriteKit中的 body 球-LMLPHP
阴影版本看起来像:
ios - 将静态阴影附加到动态物理的底部Swift SpriteKit中的 body 球-LMLPHP
干杯!
西蒙

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

10-14 21:20