Re: Why aren't both sides of a surface equally
- To: mathgroup at smc.vnet.net
- Subject: [mg81009] Re: [mg80974] Why aren't both sides of a surface equally
- From: Chris Hill <chill at wolfram.com>
- Date: Fri, 7 Sep 2007 02:15:21 -0400 (EDT)
- References: <200709060938.FAA15758@smc.vnet.net>
At 04:38 AM 9/6/2007, David Park wrote: >The following illustrates a strange behavior of surfaces with respect to >opacity. The code draws a narrow cylinder with a red line on the inside of >the cylinder and a black line on the outside of the cylinder. The cylinder >is completely opaque. The inside red line does not show through the >cylinder, which is proper behavior. However, the black outside line does >show through the back face for a considerable range, which is certainly >improper behavior. > >cylinder = > First[ParametricPlot3D[{5 Cos[\[Theta]1], 5 Sin[\[Theta]1], > z}, {\[Theta]1, 0, 2 \[Pi]}, {z, -1, 1}, > PlotStyle -> {FaceForm[Orange, LightGray]}, > PlotPoints -> {41, 5}, > Mesh -> None]]; > >outsideline = > First[ParametricPlot3D[{5.1 Cos[\[Theta]1], 5.1 Sin[\[Theta]1], > 0.2}, {\[Theta]1, 0, 2 \[Pi]}, > PlotStyle -> {Black}, > PlotPoints -> 41]]; > >insideline = > First[ParametricPlot3D[{4.9 Cos[\[Theta]1], > 4.9 Sin[\[Theta]1], -0.2}, {\[Theta]1, 0, 2 \[Pi]}, > PlotStyle -> {Red}, > PlotPoints -> 41]]; > >Show[Graphics3D[ > {cylinder, > outsideline, > insideline}], > Lighting -> "Neutral", > ViewPoint -> {1.718, -2.747, 0.975}, > Boxed -> False As part of the default hidden surface removal algorithm, Mathematica pushes lines towards the viewer to achieve the correct sorting. Given a polygon and a line which are coplanar and overlapping this makes the line draw consistently in front of the polygon as is expected. In some cases such the one you've discovered, this can also incorrectly make lines that are behind polygons appear to be in front. The problem is not related to the sides of the surface. The black line happens to poke though the cylinder when it passes behind the cylinder at the part of the cylinder that is most distant from the view point (the red line passes behind the cylinder closer to the view point). Inaccuracies of this nature are more likely to be observed at a greater distance from the view point all other things being equal. One way to avoid the problem you have encountered is to introduce transparency which causes Mathematica to automatically use a different hidden surface removal algorithm that is slower and consumes more memory but that better handles cases like this. Here I use Opacity[0.999] which is enough transparency to trigger a change in the hidden surface algorithm, but not so much as to make objects in the scene appear transparent. Show[Graphics3D[{Opacity[0.999], cylinder, outsideline, insideline}], Lighting -> "Neutral", ViewPoint -> {1.718, -2.747, 0.975}, Boxed -> False] Chris Hill Wolfram Research
- References:
- Why aren't both sides of a surface equally opaque?
- From: "David Park" <djmpark@comcast.net>
- Why aren't both sides of a surface equally opaque?