Backface and Frontface Culling
By default, Panda3D automatically culls (doesn't render) backfaces of
polygons. In other words, the polygon acts like a one-way mirror: you
can see it from one side, but from the other side, it's see-through.
Backface culling is a very
useful performance optimization. Without it, the 3D engine would have to
render the inside surface of 3D models. Since this surface is not
visible anyhow, this is entirely wasted work. Since the surface area
of the inside is equal to the surface area of the outside, this would
roughly double the amount of work the video card has to do. This is why
backface culling is enabled by default.
Interestingly, this means that if you move the camera inside of a
closed 3D model, you can usually see out. This is actually pretty convenient
most of the time.
However, there are cases when you do want to be able to see backfaces.
There are also very rare cases when you don't want to see front-faces.
Therefore, backface and frontface culling can be controlled.
Caution: inexperienced 3D modelers sometimes create models with the polygons
facing inward: ie, the visible side of the polygon is on the inside
of the 3D model, and the see-through side is on the outside. As a result,
the 3D model can look very weird - it can have holes, or it can look inside-out.
Turning off backface culling can sort of "fix" these models, at a heavy cost:
first, it makes them render half as fast, and second, it causes weird
lighting artifacts (because the video card is calculating the lighting
for the inside of the model, not the outside). This is not a real solution
to bad 3D modeling: the only real fix is to make the 3D models correctly
in the first place.
In other words, don't alter the backface or frontface culling unless you're
using an algorithm that requires it, such as stencil shadows.
Rendering Double-Sided
There is a quick way to render a certain NodePath in your scene double-sided, which means no culling is performed at all and both sides are visible, without hassling with attribs:
nodePath.setTwoSided(True)
If you want more advanced control over the culling you might want to look at the CullFaceAttrib:
Controlling Backface and Frontface Culling
There are three valid settings for culling:
nodePath.setAttrib(CullFaceAttrib.make(CullFaceAttrib.MCullNone))
nodePath.setAttrib(CullFaceAttrib.make(CullFaceAttrib.MCullClockwise))
nodePath.setAttrib(CullFaceAttrib.make(CullFaceAttrib.MCullCounterClockwise))
None means that all faces are visible, both back and front. Clockwise is the default setting, it causes backfaces to be culled. Counter-clockwise is the reverse setting, it causes frontfaces to be culled.