Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Defective Mesh lines in ContourPlot3D

177 views
Skip to first unread message

Alexey Popkov

unread,
Aug 29, 2011, 3:47:22 AM8/29/11
to
Hello,

I have a problem with rendering of Mesh lines on a 3D surface produced by
ContourPlot3D in Mathematica 7.0.1:

p=ContourPlot3D[x^4+y^4+z^4-(x^2+y^2+z^2)^2+3(x^2+y^2+z^2)==3,
{x, -2,2}, {y, -2, 2}, {z,-2,2},
BoundaryStyle->Directive[Black,Thickness[.003]],
ContourStyle->Directive[Orange,Opacity[0.5],Specularity[White,300]],
PlotPoints->90,Ticks->None,
MeshStyle->Directive[GrayLevel[.7],Thickness[.001]],
Lighting->{{"Directional",RGBColor[1,1,1],
{ImageScaled@{1,0,1},ImageScaled@{0,0,0}}}}];
p=Graphics[Inset[p,{0,0},Center,{1,1}],
PlotRange->{{-.5,.5},{-.5,.5}},Frame->True]

(see screenshot here: http://i.stack.imgur.com/zBtYC.png )

Let us to look closer on Mesh lines:

Show[p, PlotRange -> {{-.16, -.05}, {0, .1}}]

(see screenshot here: http://i.stack.imgur.com/JBkcc.png )

You can see that gray Mesh lines are overlapped by surface-forming triangles
in many places and even look dashed. Is there a way to avoid this?

John Fultz

unread,
Aug 29, 2011, 8:02:47 PM8/29/11
to
Version 8 has three rendering methods, controlled by the
RenderingOptions->{"Graphics3DRenderingEngine"} option:

DepthBuffer
Advantage - very fast
Disadvantage - absolutely unusable with transparency

BSPTree
Advantage - renders everything
Disadvantage - divvies up the polygons into a bazillion sub-polygons, which are
reordered during rotation. Most of this happens in the CPU, not the GPU. By
far, the slowest rendering method.

DepthPeeling
Advantage - renders most transparency fine, uses GPU hardware.
Disadvantage - some older video cards don't support it, a few (but rare)
outlying transparent cases don't work well.

V7 only had the first two options. What you're seeing is a complication
stemming from the facts that:

* There's a great deal of polygonal subdividision
* The mesh is also highly subdivided
* The mesh and the polygons are nearly (or sometimes exactly) coplanar polygons

In v7, there are two ways out of this. One is to prevent the BSPTree method
from being used by removing the transparency from the graphic. The second is to
prevent the coplanarity by changing how the mesh is rendered. There's an
undocumented usage of the MeshStyle option which would do this:

MeshStyle -> {{GrayLevel[.7], Tube[0.01]}}

In v8, the DepthPeeling method does a vastly better job with the transparent
version of the graphic. And, if your hardware supports it, DepthPeeling is what
Mathematica will use by default.

Sincerely,

John Fultz
jfu...@wolfram.com
User Interface Group
Wolfram Research, Inc.

Alexey Popkov

unread,
Aug 30, 2011, 6:37:54 AM8/30/11
to
John,

The option

MeshStyle -> {{GrayLevel[.7], Tube[0.01]}}

solves the problem with overlapped Mesh lines. Now another problem: FrontEnd
crashes when I add a set of 200 little non-tranparent spheres to the plot. I
am forced to use Spheres instead of Points primarily because Points are not
scaled with distance in 3D.
It seems that the crash happens because the number of 3D-objects becomes
large when Mesh is also rendered as 3D. Crash also happens when I increase
PlotPoints option:

ContourPlot3D[
x^4 + y^4 + z^4 - (x^2 + y^2 + z^2)^2 + 3 (x^2 + y^2 + z^2) ==
3, {x, -2, 2}, {y, -2, 2}, {z, -2, 2},


BoundaryStyle -> Directive[Black, Thickness[.003]],
ContourStyle ->
Directive[Orange, Opacity[0.5], Specularity[White, 300]],

Ticks -> None, PlotPoints -> 60,
MeshStyle -> {{Glow[GrayLevel[.7]], Black, Tube[0.005]}},
Lighting -> {{"Directional",
RGBColor[1, 1, 1], {ImageScaled@{1, 0, 1},
ImageScaled@{0, 0, 0}}}}]

Is there any workaround for this (I need semi-transparent surface)?

(I use Lenove R500 laptop with 32bit Windows XP SP3 installed and
Mathematica 7.0.1.)

Thank you for your help,
Alexey

John Fultz

unread,
Aug 31, 2011, 6:04:40 AM8/31/11
to
As I said, the BSPTree method involves a massive amount of subdivision of the polygons. Yes, when you add a lot more, the memory usage is going to explode. Although you could, at least, reduce the number of new polygons being used in this case using the "SpherePoints" method option...

Graphics3D[Sphere[], Method -> {"SpherePoints" -> 5}]

That example, of course, looks horrible, but if your Sphere[]s are effectively points, nobody will ever notice.

Upgrading to v8 is, of course, an option as well. The DepthPeeling method is
superior for most transparent renderings, and definitely for the example you
included here.

Sincerely,

John Fultz
jfu...@wolfram.com
User Interface Group
Wolfram Research, Inc.

John Fultz

unread,
Aug 31, 2011, 6:05:10 AM8/31/11
to
I forgot to mention that you could reduce the number of polygons in the tubes, too.

Graphics3D[{Tube[{{0, 0, 0}, {1, 1, 1}}, .25]},
Method -> {"TubePoints" -> {3, 2}}]

Adding both "TubePoints" and "SpherePoints" would, I imagine, make the result considerably more manageable. Furthermore, I don't know how you're adding the Sphere[]s, but I strongly recommend that you use multi-Sphere[]s. I.e.,

(* not this *) {Sphere[p1, r], Sphere[p2, r], ...}

(* but this *) Sphere[{p1, p2, ...}, r]

Sincerely,

John Fultz
jfu...@wolfram.com
User Interface Group
Wolfram Research, Inc.

Roger Bagula

unread,
Aug 31, 2011, 6:06:12 AM8/31/11
to
John Flutz,
I tried two experiments with the mesh-tubes
and only one worked:
Clear[x, y, a, g, p, k]
x[t_, p_] := (1 - p)*Cos[t]
y[t_, p_] := (1 + p)*Sin[t]
p = (k + 1)/10
ga = ParametricPlot3D[{x[Pi*t, p], y[Pi*t, p], p}, {t, -1, 1}, {p, -1,
1}, Axes -> False, Boxed -> False, PlotPoints -> 60,
MeshStyle -> {{GrayLevel[.7], Tube[0.1]}}]
Export["RuledTetrahedron_tubelines.stl", ga]

The Mesh tubes show up in the stl model.
Roger Bagula


Roger Bagula

unread,
Aug 31, 2011, 6:06:43 AM8/31/11
to

John Fultz
That mesh-tubes effect is nice:
I wonder if it shows up in 3d models?
Is there any way to get Mathematica
to send surface colors to a 3d model
that will be seen by other modeling software?
Roger Bagula

Roger Bagula

unread,
Aug 31, 2011, 6:07:13 AM8/31/11
to
John Furth,
The Mesh Tubes use a lot of memory
( as seen in the model being much larger as output),
so that the real time effect
doesn't work as well in 8.
The last/ first tube mesh line doesn't print:
Clear[g1, g2, x1, x2x3, x, y, z, t, p]
x1 = Cos[t]; x2 = Cos[t + 2*Pi/3]; x3 = Cos[t - 2*Pi/3];
z = x1*p;
x = x2*(-1 + p);
y = x3*(1 - p);
g1 = ParametricPlot3D[{x, y, z}, {t, 0, 2*Pi}, {p, 0, 1},

Axes -> False, Boxed -> False, PlotPoints -> 60,
MeshStyle -> {{GrayLevel[.9], Tube[0.025]}}]
g2 = ParametricPlot3D[{x, y, -z}, {t, 0, 2*Pi}, {p, 0, 1},

Axes -> False, Boxed -> False, PlotPoints -> 60,
MeshStyle -> {{GrayLevel[.9], Tube[0.025]}}]
Show[{g1, g2}]
Export["Ruledellipsedouble_tubelines.stl", %]

For getting color out the web suggests the *.coff
file format: Mathematica gives
Export::infer: "Cannot infer format of file \!\
(\"Ruledellipsedouble_tubelines.coff\"\)."
but will do an *.off file.
Roger Bagula


Yves Klett

unread,
Aug 31, 2011, 6:09:48 AM8/31/11
to
Not sure if this is any help, but you could try to use the
multi-primitive syntax Sphere[{{x1,y1,z1},{x2,y2,z2},...},r].

Also, Tube primitives slow down rendering of plots no end and probably
also use a fair amount of memory. My ByteCount of your plot with Tubes
is at 9.1MB, without Tubes at ~2MB.

Regards,
Yves

Roger Bagula

unread,
Sep 1, 2011, 6:06:16 AM9/1/11
to
Getting the color out...
*.mtl files are generated when you make a Mathematica *.obj export.
They are said to contain the color information.
*.3ds will transfer color and are made with Mathematica as well.

There is still the problem of what the printers call:
Non-Manifold
model outputs in Mathematica.
It appears that Mathematica models leave holes
that 3d Printers can't stand. They all have to be repaired
and mesh holes closed.
They all deal with me like I'm the village idiot
for having such bad mesh files, LOL.
Roger Bagula

0 new messages