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

    Getting poly normal and CreatePhongNormals()

    Cinema 4D SDK
    5
    18
    3.1k
    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.
    • ferdinandF
      ferdinand
      last edited by ferdinand

      Hi,

      a bilinear interpolation is quite straight forward. If you have the quadrilateral Q with the the points,

      c---d
      |   |
      a---b
      

      then the bilinear interpolation is just,

      ab = lerp(a, b, t0)
      cd = lerp(c, d, t0)
      res = lerp(ab, cd, t1)
      

      where t0, t1 are the interpolation offset(s), i.e. the texture coordinates in your case (the ordering/orientation of the quad is obviously not set in stone). I am not quite sure what you do when rendering normals, but when you render a color gradient, in a value noise for example, you actually want to avoid linear interpolation, because it will give you these ugly star-patterns. So you might need something like a bi-quadratic, bi-cubic or bi-cosine interpolation, i.e. pre-interpolate your interpolation offsets.

      If I am not overlooking something, this should also work for triangles when you treat them as quasi-quadrilaterals like Cinema does in its polygon type.

      Cheers,
      zipit

      MAXON SDK Specialist
      developers.maxon.net

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

        Hi,

        @WickedP said in Getting poly normal and CreatePhongNormals():

        Moller-Trumbore

        what I forgot to mention, but I already hinted at in my previous posting, is that you did not state in which space your interpolation coordinates are formulated. When you talk about uv-coordinates I am (and probably also everyone else is) assuming that you have cartesian coordinates, just like Cinemas texture coordinate system is formulated in.

        If you have another coordinate system, some kind of linear/affine combination like your code snippet suggests, then the interpolated normal is just the linear combination of the neighbouring normals (I think that was what you were trying to do in that code).

        If this fails, you should either check your Mรถller-Trumbore code for errors (Scratch-Pixel has a nice article on it and how to calculate correct affine space/barycentric coordinates for it), or more pragmatically use Cinema's GeRayCollider instead, which will also give you texture coordinates.

        I am not so well versed in the C++ SDK, maybe there is even a more low level (i.e. triangle level) version of GeRayCollider there, i.e. something where you do not have the overhead of casting against a whole mesh.

        Cheers,
        zipit

        MAXON SDK Specialist
        developers.maxon.net

        1 Reply Last reply Reply Quote 1
        • WickedPW
          WickedP
          last edited by

          Oooh..... I feel like such a dope. I had almost everything right to begin with, except I was accessing the returned CreatePhongNormals() SVector incorrectly. I was using operator()[] when I should have been using ToRV(). Here's a smoothed result:

          a99e8a5d-d2a2-49a5-8826-01a28acc4697-image.png

          Thanks guys, we got there ๐Ÿ‘

          One last thing, how do I 'globalise' the normals? They look local to me (see floating cube, it's slightly rotated but has the same shading as walls in the background)?

          WP.

          wickedp.com

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

            Hi,

            all polygonal data is in object space. So if you want your normals to be in global/world space, you will have to multiply them with the frame of the object they are attached to. To get the frame, you will only have to zero out the offset of the global matrix of the object and then normalise the axis components.

            Cheers,
            zipit

            MAXON SDK Specialist
            developers.maxon.net

            1 Reply Last reply Reply Quote 1
            • WickedPW
              WickedP
              last edited by

              Thanks zipit,

              makes sense being local. Zeroing out and multiplying by the frame matrix does it:

              3a65e71c-29c5-4f08-8f38-8b0e8b0a90ed-image.png

              Thanks for your time contributors, been a big help.

              WP.

              wickedp.com

              1 Reply Last reply Reply Quote 0
              • ManuelM
                Manuel
                last edited by

                hi

                can we considered this thread as resolved ?

                Cheers,
                Manuel

                MAXON SDK Specialist

                MAXON Registered Developer

                1 Reply Last reply Reply Quote 0
                • WickedPW
                  WickedP
                  last edited by

                  Thanks Manuel,

                  I didn't realise I had to mark the thread as solved. Done.

                  WP.

                  wickedp.com

                  M 1 Reply Last reply Reply Quote 0
                  • M
                    mogh @WickedP
                    last edited by

                    @WickedP Uhh, Ohh what are you coding there is that a brdf map shader ? I am searching for something like this !

                    https://alastaira.wordpress.com/2013/11/26/lighting-models-and-brdf-maps/

                    1 Reply Last reply Reply Quote 0
                    • WickedPW
                      WickedP
                      last edited by

                      Hi @mogh,

                      apologies I didn't see your reply.

                      That display is for a normals engine. I had a 2D draw engine but needed to expand on it because the native renderers wouldn't let me get what I wanted in code. I didn't want to make a render engine, it's just kind of how it's turning out...!

                      It's only meant to be a basic one that serves the needs though. There's a spiel about it here on my website: [https://wickedp.com/hyperion/](link url). You'll have to excuse the site layout, I'm stuck in the middle of revamping it until I deliver some other big projects.

                      WP.

                      wickedp.com

                      1 Reply Last reply Reply Quote 0
                      • M
                        mogh
                        last edited by

                        Thanks for the reply, Wicked.

                        interessting, but not what i hoped for ... ๐Ÿ˜‰

                        kepp on chrunching

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