2015-04-21 21 views
5

Próbuję stworzyć światło punktowe, które oświetli sześcian. Powierzchnia pod spodem powinna pokazać cień. Niestety nie udało mi się tego osiągnąć. Światło ignoruje sześcian i rzuca światło zarówno na powierzchnię, jak i na kostkę - bez względu na to, że kostka jest na drodze.SceneKit - Oświetlenie i rzucanie cieni

Jak to wygląda:

enter image description here

kod, po prostu ustawić castsShadow YES na każdym węźle do testowania, ale nic do tej pory pomogli:

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]; 

}

Odpowiedz

6

musisz ustawić castsShadow na SCNLight (zamiast na SCNNode, który trzyma światło t).

+0

Już to robię w kodzie, który podałem tutaj. Teraz próbowałem także wyłączyć CastsShadow na wszystkich przedmiotach oprócz SpotLight, ale to też nie działa. – Max

+0

jesteś? Widzę 'lightNode.castsShadow = shadows;' zamiast 'lightNode.light.castsShadow = shadows;' – mnuages

+0

Przepraszam, byłem głupi. Teraz działa jak urok. Na początku nie rozumiałem, czego chcieli doktorzy, a potem nie rozumiałem, że chodzi ci o rzeczywiste światło. Dziękuję Ci!! – Max