我想创建这个如图所示
我得到了一个正常的物理球体,它具有动态、受重力影响并且可以旋转。 问题是,无论何时您将一个 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")
然后使用这张图片:
阴影版本看起来像:
干杯!
西蒙
关于ios - 在 Swift SpriteKit 中将静态阴影附加到动态 physicsBody 球的底部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38112437/