6

I'm trying to create a spot light that illuminates a cube. The surface underneath should then show a shadow. Unfortunately I wasn't able to achieve this. The light ignores the cube and casts the light on both - the surface and the cube - regardless that the cube is in the way.

How it looks like:

enter image description here

The code, I just set castsShadow to YES on every node for testing, but nothing so far helped:

BOOL shadows = YES;

_baseNode.castsShadow = shadows;
_scene.rootNode.castsShadow = shadows;

SCNBox *box = [SCNBox boxWithWidth: 50 height: 50 length: 50 chamferRadius: 10];
box.firstMaterial.diffuse.contents = [UIColor colorWithRed: 0.0 green:0.0 blue: 0.8 alpha: 1.0];
box.firstMaterial.doubleSided = YES;
SCNNode *boxNode = [SCNNode nodeWithGeometry: box];

boxNode.position = SCNVector3Make(100, 100, 100);
boxNode.castsShadow = shadows;
[_baseNode addChildNode: boxNode];

SCNBox *plane = [SCNBox boxWithWidth: 1000 height:1000 length: 40 chamferRadius: 10];
plane.firstMaterial.diffuse.contents = [UIColor colorWithWhite: 0.2 alpha: 1.0];
SCNNode *planeNode = [SCNNode nodeWithGeometry: plane];
planeNode.position = SCNVector3Make(100, 100,  0);
planeNode.castsShadow = shadows;
[_baseNode addChildNode: planeNode];


SCNNode *lightNode = [SCNNode node];
lightNode.light = [SCNLight light];
lightNode.light.type = SCNLightTypeSpot;
lightNode.light.spotInnerAngle = 0;
lightNode.light.spotOuterAngle = 45;
lightNode.light.shadowRadius = 10.0;
lightNode.light.zFar = 10000;
lightNode.light.shadowColor = [UIColor colorWithRed: 0.0 green: 1.0 blue:0.0 alpha: 1.0];
lightNode.castsShadow = shadows;
lightNode.position = SCNVector3Make(100, 100, 170);
[_baseNode addChildNode:lightNode];

SCNNode *lightNode2 = [SCNNode node];
lightNode2.light = [SCNLight light];
lightNode2.light.type = SCNLightTypeAmbient;
lightNode2.light.color = [UIColor colorWithRed: 0.3 green: 0.3 blue:0.3 alpha: 1.0];
[_baseNode addChildNode: lightNode2];

[_scene.rootNode addChildNode: _baseNode];

}

Max
  • 2,699
  • 2
  • 27
  • 50

1 Answers1

10

you have to set castsShadow on the SCNLight (instead of on the SCNNode that holds the light).

Slipp D. Thompson
  • 33,165
  • 3
  • 43
  • 43
mnuages
  • 13,049
  • 2
  • 23
  • 40
  • I'm already doing that in the code I provided here. I now also tried turning castsShadow off on everything but the spotLight, but also this does not work. – Max Apr 23 '15 at 08:36
  • are you? I see `lightNode.castsShadow = shadows;` instead of `lightNode.light.castsShadow = shadows;` – mnuages Apr 23 '15 at 10:57
  • 1
    Sorry, I was being stupid. Now it works like a charm. At first I didn't understand what the docs wanted, then I didn't understand that you meant the actual light. Thank you!! – Max Apr 24 '15 at 11:41