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

    How to use UV morph node

    Cinema 4D SDK
    r21 c++
    2
    5
    722
    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.
    • A
      AiMiDi
      last edited by

      Hi,
      I want to use the morph node to set some UV morphs. I didn't find the setting for setting UV morph information on the C++ SDK Documentation, only how to read it.
      The UV morph information I have is for each vertex, and I noticed that the UV morph node can only set a UVWStruct for each polygon. Is there any way to set it for each vertex?

      Thanks,
      AiMiDi

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

        Hi,

        You are talking about the Morph tag righ?
        The only way is to use the UVWStruct because each vertex can have as many UVs coordinates as the vertex have polygon neighbor.
        If the vertex is used by 4 polygons, you can have 4 uv coordinates for that vertex.

        Cheers,
        Manuel

        MAXON SDK Specialist

        MAXON Registered Developer

        1 Reply Last reply Reply Quote 0
        • A
          AiMiDi
          last edited by AiMiDi

          Thank you for your reply.
          I tried to set the UV morph through each surface, but it did not work according to my assumptions. Here I want to move the entire uv, but only part of the uv is moved. What is wrong.

              Int32 offset_count;//The UV morph vertex count.
              maxon::HashMap<Int32, Vector> vertex_floats_map; //This map stores the UV transformation of each vertex.
              
              //Create the basic morph
              morph_tag->ExitEdit(doc, true);
              CAMorph *morph = morph_tag->AddMorph();
              if (morph == nullptr)
                  return maxon::OutOfMemoryError(MAXON_SOURCE_LOCATION, GeLoadString(IDS_MES_IMPORT_ERR) + GeLoadString(IDS_MES_MEM_ERR));
              morph->SetName(morph_data->morph_name_local);
              morph->Store(doc, morph_tag, CAMORPH_DATA_FLAGS::UV);
          
              CAMorphNode *morph_node = morph->GetFirst();
              morph->SetMode(doc, morph_tag, CAMORPH_MODE_FLAGS::ALL | CAMORPH_MODE_FLAGS::EXPAND, CAMORPH_MODE::REL);
              maxon::ParallelFor::Dynamic(0, offset_count, [&morph_node, &vertex_surface_map, &vertex_floats_map](const Int32 pointIndex)
                                          {
                                              Int surface_index; //The surface index corresponding to the vertex, the acquisition process is omitted.
                                              CPolygon *surface = surface_data.Read()->operator[](surface_index); //Get the corresponding surface.
                                              UVWStruct uvw;
                                              morph_node->GetUV(0, surface_index, uvw);
                                              auto vertex_a_ptr = vertex_floats_map.Find(surface->a);
                                              if (vertex_a_ptr != nullptr)
                                              {
                                                  uvw.c = vertex_a_ptr->GetValue();
                                              }
                                              auto vertex_b_ptr = vertex_floats_map.Find(surface->b);
                                              if (vertex_b_ptr != nullptr)
                                              {
                                                  uvw.b = vertex_b_ptr->GetValue();
                                              }
                                              auto vertex_c_ptr = vertex_floats_map.Find(surface->c);
                                              if (vertex_c_ptr != nullptr)
                                              {
                                                  uvw.a = vertex_c_ptr->GetValue();
                                              }
                                              morph_node->SetUV(0, surface_index, uvw);
                                          });
              morph->SetMode(doc, morph_tag, CAMORPH_MODE_FLAGS::ALL | CAMORPH_MODE_FLAGS::COLLAPSE, CAMORPH_MODE::AUTO);
              morph_tag->UpdateMorphs();
              morph_tag->Message(MSG_UPDATE);
              morph->SetStrength(0);
              morph_tag->SetParameter(DescID(ID_CA_POSE_MODE), ID_CA_POSE_MODE_ANIMATE, DESCFLAGS_SET::NONE);
          

          Please see here for the complete.

          63362f48-87b7-4774-a1c2-56b2bfd087ed-image.png

          Thanks,
          AiMiDi

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

            Hi,

            It's a bit complexe to understand what's going wrong here, specially without having an example to reproduce. You say that some parts are moving but not everything. That mean you got the logic right but not the code. i don't think providing an example will help you too much.

            My suggestion is to simplify your code as much as possible or work on a simplest example.
            I would also iterate over all polygon and not over all vertices. (but if you are mor confortable with vertices, keep it).

            Cheers,
            Manuel

            MAXON SDK Specialist

            MAXON Registered Developer

            1 Reply Last reply Reply Quote 0
            • A
              AiMiDi
              last edited by AiMiDi

              Hi,
              Thank you so much for your suggestion. I changed my code to iterate each surface. It works very well. Thank you for your help, which solved my problem.
              6ecf2fc3-56cc-4834-9632-0b815d3a5f39-image.png
              Thanks,
              Manuel

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