# Silhouette curve for isometric surface of revolution

I am trying to figure out how to convert a flat representation of a curve into the silhouette of a surface of revolution in a isometric projection. In essence in want the planar cut of the surface edge to be converted to the silhouette.

Image 1: Starting point.

The geometry in this case is a Bézier curve although if somebody has solutions for any functions or higher order curves would be fine. So in essence im open to conics and NURBS also.

Image 2: End result. How to transform the magenta curves?

The way I've done this now is by sampling several forms and in this case draw the new curve over the points. But id like to do this automatically and more precise. Please note: I am perfectly aware on how to do this with discrete data, I am looking for a more analytical solution if possible.

Image 3: The shape was derived using an old draftsman's trick.

Please note: Most applications polygonize NURBS or Bézier surface for rendering. Also trivial root finding does not really work well as result should not be pixels but a curve. Let us to avoid this, as I am perfectly capable of discretisizing the solution and project the edges on the back face culling edge, and doing a secondary fitting, or even fitting on the NURBS underworld and then to 2d*. That is exactly the same solution as I am using now. Seem to me there should be a somewhat analytical transformation possible.

Image 4: I am perfectly capable of doing this with subdivision/discretisation of the domain.

* Though if you know a robust way to do the projection to a curve on surface I'm interested in that too.

• Blender supports Nurbs surfaces and a "spin" operator for curves. Is that the operation you want? If so you could maybe lookup how Blender implemented the operation. – Dragonseel Jan 29 '16 at 23:53
• @Dragonseel No, i know how to make a revolved surface, im only interested in how to make a silhouette curve in my own 2d software. I can do a discrete solution for this like blender would in maya, max, creo, solidworks. The only app that ive ever seen to do this acceptably is Rhino. But since this is a special case seems to me there should be a analytic solution. – joojaa Jan 30 '16 at 6:56
• @Dragonseel updated the question to refelect what i said – joojaa Jan 30 '16 at 8:29
• If you figure out what happens in your first image when rotating around a vertical axis, the answer will generalize to all cases (others are rotations of that case in the image plane) - is that right? – Daniel M Gessel Jan 31 '16 at 11:10
• @DanielMGessel Most likely yes, at least in the case where your shape gets thinner towards you. When the situation gets thinker towards you you get all kinds of other possible self occlusion problems. Basically this case is most likely some evolution of the swept ovals shape. But im not really certain how to find the intersection point other than by binary search which isn't really good for analytical stuff ;) – joojaa Jan 31 '16 at 11:16

The silhouette curve of a quadric surface is a conic (ellipse, parabola, hyperbola, etc.). Suppose you have the quadric $\mathbf{X}^T \mathbf{M} \mathbf{X} = 0$ and your eye is at the point $\mathbf{Y}$. Then the silhouette curve is the intersection of the quadric and the so-called polar plane of $\mathbf{Y}$, which is $\mathbf{Y}^T \mathbf{M} \mathbf{X} = 0$.

For anything more complex than quadrics, things get nasty in a hurry, and you won't find any analytic solutions; you'll need numerical methods to trace the curve. Even the silhouette of a torus is pretty complex. So, in essence, the best you can do is compute discrete points along the curve, and use these to construct either a polyline or a spline of some sort. But, of course, you can always get a polyline just by tesselating the surface and finding the silhouette of the tesselation.

One approach would be to approximate your surface of revolution by quadrics, but that may not be any better than tesselating. You'd get a piecewise conic curve, instead of a polyline, which might be an improvement.

Note that if your surface is not G2, then it's silhouette will not be G1 (i.e. it may have sharp corners). Tracing a curve with corners is tricky.

There are silhouette generation functions in geometry kernels like Parasolid and ACIS. Maybe in OpenCascade, too.

To illustrate the difficulty, suppose we have a surface with parametric equations $(u,v) \mapsto \mathbf{S}(u,v)$, and we are viewing it from an eye- point $\mathbf{E}$. Let $\mathbf{N}(u,v)$ be the surface normal at parameter values $(u,v)$, which we can calculate as the cross product of partial derivatives: $\mathbf{N}(u,v) = \mathbf{S}^u(u,v) \times \mathbf{S}^v(u,v)$. If a point $\mathbf{P}$ is on the silhouette curve, then the surface normal at this point is perpendicular to the vector $\mathbf{P} - \mathbf{E}$. So, the silhouette curve is the locus of points where $$(\mathbf{S}(u,v) - \mathbf{E}) \cdot \mathbf{N}(u,v) = 0$$ Substituting for $\mathbf{N}(u,v)$, this becomes $$(\mathbf{S}(u,v) - \mathbf{E}) \cdot (\mathbf{S}^u(u,v) \times \mathbf{S}^v(u,v) ) = 0$$ If $\mathbf{S}(u,v)$ is even a very simple surface, like a torus or a biquadratic or bicubic patch, the silhouette equation will not have any analytic solution.

• I am only interested in description in analytic solutions though. I dont really care how complex they become i just need to see how pthers have approached the problem. It is easy to say it becomes hard but thats just waving hands. – joojaa Jul 10 '17 at 17:13
• The hand-waving was meant to convince you that seeking analytic solutions is hopeless without making you read a lot of justification. But, I added some justification, anyway. – bubba Jul 11 '17 at 0:22
• Yes well now it is better however I was thinking one could solve this from the derivate. – joojaa Jul 11 '17 at 6:37
• See a torus is much more difficult than what i am asking here. As its perfectly fine to eliminate all curves that self occlude. – joojaa Jul 11 '17 at 7:07
• Your example could easily be the inside region of a torus. Occluding or not occluding doesn't change the basic silhouette equation. – bubba Jul 11 '17 at 12:19