2016-06-30 61 views
0

我想創建這樣的圖片顯示附加靜態陰影動態physicsBody球的底部斯威夫特SpriteKit

enter image description here

我有一個正常的physicsBody球,動態,affectedByGravity和可以旋轉。 事情是,每當你將一個孩子連接到可以旋轉的球時,精靈將跟隨與球一樣的運動。

什麼是使陰影停留在球底的最佳方式?我可以直接做:

ball.addChild(shadow) 

有些屬性會保持底部靜態?或者我應該

self.addChild(shadow) 

,然後更新期間()

shadow.position(ball's position) 

在此先感謝。

+0

如果添加陰影成球的孩子,你會不會擔心的位置,但你將不得不修正球的旋轉。我有一段時間沒有使用SpriteKit,但應該有可能查詢球的旋轉,並應用與陰影相反的角度... –

回答

2

我建議使用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") 

..和,爲你的精靈節點,只需將shader屬性:

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

然後使用該圖片:

enter image description here

陰影的版本是這樣的:

enter image description here

乾杯!

西蒙

+0

omg,不知道有一個SKShader..i'm新在Swift裏感謝西蒙!我可以使用相同的着色器爲球地板陰影嗎?你知道,影子的省略號風格?這是否「足夠聰明」,足以通過球的高度調整其大小並改變其阿爾法?因爲現在我正在通過手動更新功能來處理所有這些...... – msqar

+0

您無法真正使用此技術來投射陰影 - 它實際上只能用於渲染精靈來渲染3D效果。同樣,它不知道球在太空中的位置 - 因此陰影完全由「lightPosition」和「max」的第一個參數控制。 –

+0

哦,我看到着色器也隨着球的旋轉而移動,它跟着它,而且,我看到這是一個黑色背景的着色器,我做錯了什麼?創建一個名爲shader.fsh的空文件並將其作爲ball.shader – msqar