Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    Compute distance from a point to a mesh

    Cinema 4D SDK
    2
    4
    803
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • U
      user168462
      last edited by

      Hi guys,
      I would like to compute the distance from a point to a mesh while editing a document.

      • Requested method:
        - [IN] start point
        - [IN] direction vector
        - [IN] radius (area to look)
        - [OUT] position of a hit if it exist (or a distance to the starting point).

      • Current plugin structure implementation:

        MessagePlugin objects' scene coordinates.

      • Example:
        25623802-38bd-41fd-b275-a79df57dde14-image.png

      Here I would like to know the first element which is hit by the blue line from the camera.
      I took here the camera to have a visualization, however it can be a random start point.

      I considered few options:

      1. Geraycollider: gives the distance if you know the target object, however I don't know it.
      2. VideoPostData plugin to get VolumeData and then use TraceGeometry method. However, it seems that it is not called and the time but only when a rendering is done.

      Do you have any hint or recommended method to do that?

      Thank you in advance
      Best

      ferdinandF 1 Reply Last reply Reply Quote 0
      • ferdinandF
        ferdinand @user168462
        last edited by ferdinand

        Hello @user168462,

        Thank you for reaching out to us. You clearly tried to be precise in your question and we appreciate this, but there are still some ambiguities we must resolve first.

        Compute distance from a point to a mesh
        [...] which is hit by the blue line from the camera [...]

        You talk first about points and meshes, and then about points and lines, and show a bunch of null objects and joints. Intersection testing (sets of) line segments and (sets of) triangles requires different approaches.

        In general, one should also add that intersection testing two lines in 3D (or similar cases as a line segment and a ray) is very unlikely to yield an intersection due to the vastness of 3D space and floating-point precision. What one usually does there is define a tolerance, where one then searches the closest point pair on the two line segments, tests if the distance of that pair is below that tolerance, and then considers these two lines to intersect (although they technically do not).

        Connected two that is your fuzziness regarding what you want to compute: An intersection or the projection? Your thread-title implies that you are interested in projections (i.e., computing the closest point p on some geometry G for a query point q). However, later you switch to terminology which more implies ray-casting/intersection testing as you give a ray direction and use words as along. But ray casting will not "compute [the] distance from a point to a mesh" but the intersection point(s) (when there is a hit) for the geometry and the ray. The line segment formed by the query point and intersection points has a length, but it would be pure coincidence if it were equal to the shortest distance (projection) of the query point and geometry.

        When you are interested in the shortest distance between a query point q and some geometry G, ray casting is not the correct method, you must project q onto G. Your example mentions some radius to look in, which I interpret as sort of a search window for the ray casting, but this is not only very error prone or very computationally complex as you might have to ray-cast millions of times to fill that window, but also unnecessary, you can just project the point.

        This is all slightly out of scope of support, as these are more principal techniques rather than things in our APIs.

        1. GeRayCollider is ray-triangle intersection testing helper class with some light optimization built into it. You cannot carry out ray-line-segment intersections with it. If you want to intersection test multiple objects, you have to intersection test them one by one.
        2. VolumeData::TraceGeometry is bound to the rendering process.
        3. There is also the class ViewportSelect with which you can "pick" objects in a viewport.

        Added to that is that there is no real geometry in your screenshot, there are joints, null objects, and camera object. None of which provides any explicit discrete geometry as polygons or line segments. You can of course "write stuff around that" which then fills in the data for the visualizations these objects use. But you cannot just intersection test a joint object or a null object which is displayed as a circle.

        Cheers,
        Ferdinand

        MAXON SDK Specialist
        developers.maxon.net

        U 1 Reply Last reply Reply Quote 0
        • U
          user168462 @ferdinand
          last edited by

          Hi Ferdinand, thank you for your detailed reply.
          I am looking for hit point. Then if I understand well, my only way would be to use GeRayCollider on all objects ?

          Best,

          1 Reply Last reply Reply Quote 0
          • ferdinandF
            ferdinand
            last edited by ferdinand

            Hi,

            I am looking for hit point. Then if I understand well, my only way would be to use GeRayCollider on all objects ?

            A point-something projection will also give you a "hit-point" in some sense. The question is if you want to find the closest point for a point on some geometry (projection), or a point on a geometry for a point and a ray (intersection). GeRayCollider realizes ray-triangle intersection testing for PolygonObject instances. For multiple objects you must initialize multiple collider instances (or reinitialize one instance). But you cannot intersection test a null, a spline, or joint object as shown in your screenshot as they do not contain any triangles. When you are just interested in the closest point in some discrete geometry, you can use ViewportSelect or the more modern maxon API equivalent maxon::DistanceQueryInterface with a slightly different and more abstract purpose. ViewportSelect can also be used to pick the object in a scene which is closest to a point (for the cursor for example) for further testing with other methods.

            In maxon::GeometryUtilsInterface you will find some basic building blocks for writing something of your own.

            MAXON SDK Specialist
            developers.maxon.net

            1 Reply Last reply Reply Quote 0
            • First post
              Last post