4

I'm trying to understand all primitives In this article.After hard work I just learn Sphere and Cube , I wrote description here.

I could draw 2D shapes but I have trouble understanding 3D below codes:

Tours 2D

Torus - signed - exact

Tour 3D

float sdTorus( vec3 p, vec2 t )
{
  vec2 q = vec2(length(p.xz)-t.x,p.y);
  return length(q)-t.y;
}

Length

I can't imagine how this shape drew and I don't know why two length used here.


Cone 2D

Cone - signed - exact

Cone 3D

float sdCone( vec3 p, vec2 c )
{
    // c must be normalized
    float q = length(p.xy);
    return dot(c,vec2(q,p.z));
}

I don't know why dot product used here?

I'm confused please help me to understand this shapes.I hope someone explain each shape.

  • What about them do you have trouble understanding? It's hard to explain without knowing what the specific problem is. – Dan Hulme Apr 10 '18 at 07:54
  • @DanHulme my specific problem Is that I don't know how functions used to draw 3d shapes like dot product in cone shape and like using two length in tours shape – Seyed Morteza Kamali Apr 10 '18 at 07:55
  • @DanHulme I edit my question and add some detail that what is my problem I hope you help me to understanding this shapes. – Seyed Morteza Kamali Apr 10 '18 at 08:58
  • Please do not edit your question after an answer has been posted. If you have follow up questions, post them separately. – Federico Apr 11 '18 at 08:59
  • @Federico I'm sorry I removed new part , I wanted ask as a new question but I thought Instead of asking several questions It's better to ask one question. – Seyed Morteza Kamali Apr 11 '18 at 13:01
  • No, the opposite is quite true instead, SE sites prefer several well defined questions to one overly broad question – Federico Apr 11 '18 at 13:27
  • I think your edit made it clear that you have a wider problem understanding linear algebra or signed distance fields, that explaining a bunch of shapes to you one at a time won't fix. Perhaps if you could isolate the common factor that's hard to understand about all the shapes, that would make a better question. – Dan Hulme Apr 11 '18 at 13:34
  • @DanHulme that's right I should learn more algebra and ask my specific problems thanks. – Seyed Morteza Kamali Apr 11 '18 at 13:42
  • I'm a bit late tot he game but I had a similar issue, I have no idea how to simplify the Cone but I rewrote the Torus function in a way that seemed more natural to me below.

    float SdTorus(float3 position, float innerRadius, float outerRadius) { float thickness = .5 * (outerRadius - innerRadius); float2 q = float2(length(position.xz) - outerRadius + thickness, position.y); return length(q) - thickness; }

    – Benjamin Danger Johnson Jun 07 '19 at 08:47

1 Answers1

6

Torus

A torus is defined by two parameters: the major radius, and the minor radius. The major radius (t.x) is the radius of the big ring (in red in the diagram), and the minor radius (t.y) is the radius of the circular cross-section. The x and y here are just indices into the vector: they're unrelated to the x and y axes.

The left side of the diagram shows the xz plane, and the right side shows a cross-section with y going horizontally.

enter image description here

p.xz is the projection of the point onto the plane of the torus, so length(p.xz)-t.x gives the distance from that projected point to the inside of the torus. (I've labelled it $r$ on the diagram.) p.y is the distance from the point to the plane of the torus, so the length of the vector ($r$, p.y) is the distance from the point to the inside of the torus. (Computing the length of a two-element vector is a handy way to use Pythagoras' theorem to find the hypotenuse of the triangle.)

Cone

Like the torus, the cone code uses the fact that the shape is symmetric about an axis: the z axis in this case. The cone is defined by a unit vector c that's normal to the surface of the cone, and the apex of the cone is at the origin. Similar to the above, length(p.xy) gets the distance from the point to the z axis, so that we can work in the plane where the cone is a triangle. vec2(q,p.z) is the projection of p into this plane. The dot product projects this vector onto the direction c: how far the point is along this direction tells us how far it is from the surface of the triangle.

enter image description here

Dan Hulme
  • 6,780
  • 1
  • 16
  • 35