<p>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$.</p>

<p>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.</p>

<p>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.</p>

<p>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.</p>

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

<p>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.</p>

CC BY-SA 3.0
2017-07-10T17:13:35.593Z
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
CC BY-SA 3.0
2017-07-11T00:22:59.217Z
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
CC BY-SA 3.0
2017-07-11T06:37:20.880Z
Yes well now it is better however I was thinking one could solve this from the derivate.
joojaa
CC BY-SA 3.0
2017-07-11T07:07:57.153Z
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
CC BY-SA 3.0
2017-07-11T12:19:51.173Z
Your example could easily be the inside region of a torus. Occluding or not occluding doesn't change the basic silhouette equation.
bubba
CC BY-SA 3.0
2017-07-09T10:11:17.017Z
2017-07-11T00:20:45.700Z
2017-07-11T00:20:45.700Z
bubba
<p>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.</p>

<p><a href="https://i.sstatic.net/NV4V3.png" rel="noreferrer"><img src="https://i.sstatic.net/NV4V3.png" alt="enter image description here"></a></p>

<p><strong>Image 1</strong>: Starting point.</p>

<p>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. </p>

<p><a href="https://i.sstatic.net/gWxcs.png" rel="noreferrer"><img src="https://i.sstatic.net/gWxcs.png" alt="enter image description here"></a></p>

<p><strong>Image 2</strong>: End result. How to transform the magenta curves?</p>

<p>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.</p>

<p><a href="https://i.sstatic.net/CsvkZ.png" rel="noreferrer"><img src="https://i.sstatic.net/CsvkZ.png" alt="enter image description here"></a></p>

<p><strong>Image 3</strong>: The shape was derived using an old draftsman's trick.</p>

<p>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.</p>

<p><a href="https://i.sstatic.net/2qJA5.png" rel="noreferrer"><img src="https://i.sstatic.net/2qJA5.png" alt="im perfectly capable of solving this with discretionary of the domain"></a></p>

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

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

CC BY-SA 3.0
2016-01-29T23:53:59.457Z
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
CC BY-SA 3.0
2016-01-30T06:56:11.890Z
@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
CC BY-SA 3.0
2016-01-30T08:29:24.650Z
@Dragonseel updated the question to refelect what i said
joojaa
CC BY-SA 3.0
2016-01-31T11:16:24.907Z
@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
CC BY-SA 3.0
2017-07-11T12:24:25.863Z
I'm sure SolidWorks (or any system based on the Parasolid kernel) can do this correctly.
bubba
<bezier-curve><silhouette>
Silhouette curve for isometric surface of revolution
joojaa
# Silhouette curve for isometric surface of revolution

(Asked by: username_0 on 2016-01-29)

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.

[![enter image description here](https://i.sstatic.net/NV4V3.png)](https://i.sstatic.net/NV4V3.png)

**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.

[![enter image description here](https://i.sstatic.net/gWxcs.png)](https://i.sstatic.net/gWxcs.png)

**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.

[![enter image description here](https://i.sstatic.net/CsvkZ.png)](https://i.sstatic.net/CsvkZ.png)

**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.

[![im perfectly capable of solving this with discretionary of the domain](https://i.sstatic.net/2qJA5.png)](https://i.sstatic.net/2qJA5.png)

**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.

**Tags:** bezier-curve, silhouette

> **Comments:**
> **username_1**: 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.  
> **username_0**: @username_1 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.  
> **username_0**: @username_1 updated the question to refelect what i said  
> **username_0**: @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 ;)  
> **username_2**: I'm sure SolidWorks (or any system based on the Parasolid kernel) can do this correctly.  

---

## 1 answers

### Answer by username_2 on 2017-07-09. Score: 2

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.

> **Comments:**
> **username_0**: 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.  
> **username_2**: 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.  
> **username_0**: Yes well now it is better however I was thinking one could solve this from the derivate.  
> **username_0**: See a torus is much more difficult than what i am asking here. As its perfectly fine to eliminate all curves that self occlude.  
> **username_2**: Your example could easily be the inside region of a torus. Occluding or not occluding doesn't change the basic silhouette equation.  

---

