【问题标题】:3ds Max C++ Modifier not receiving Map Channel data when 2+ modifiers are in the Modifier list当修改器列表中有 2 个以上的修改器时,3ds Max C++ 修改器未接收贴图通道数据
【发布时间】:2014-06-23 19:15:54
【问题描述】:

我在 C++ 中为 3ds Max 2015 制作的修改器插件遇到了一些问题,我遇到了一个问题,我将 2 个以上的修改器(可以是任何类型的修改器,没关系)应用于对象然后我应用我自己的修改器( OpenSubdiv-MPS ),它将在我的代码的第一次通过时很好地运行,但是当我为对象更新任何内容时,第二次通过我的代码 3ds Max 给了我一个没有网格的对象有任何映射数据。这会导致我的插件崩溃,因为我需要它的映射数据。

这是 Max 的 Modifer 列表:

http://i.imgur.com/y2dOv6x.png(抱歉,还不能发图)

如果我只在它之前使用 1 个修饰符或不使用其他修饰符,一切都会正常工作。我也可以在它之后放置任意数量的东西。我注意到的另一个奇怪的事件是,如果我创建第一个修饰符,然后在它和对象之间添加 2+ 个修饰符,映射数据将正确返回。

我认为这与我之前遇到的有效性/渠道问题有关,并且能够通过自己设置渠道有效性来解决自己。但是,我再次无法通过此方法解决问题。

这是 3ds Max 为我的修改器调用的 ModifyObject 函数的代码...

void OpenSubdiv_MPS::ModifyObject(TimeValue t, ModContext& mc, ObjectState* os, INode* node) 
{
    Interval valid = GetValidity(t);
    valid &= os->obj->ChannelValidity(t,TOPO_CHAN_NUM);
    valid &= os->obj->ChannelValidity(t,GEOM_CHAN_NUM);

    if (os->obj->IsSubClassOf(polyObjectClassID)) 
    {
            PolyObject *polyOb = (PolyObject*)os->obj;
            ModifyPolyObject(polyOb, t, mc);
    }
    // Convert to a tri mesh if possible
    else if(os->obj->CanConvertToType(polyObjectClassID)) 
    {
            PolyObject  *polyOb = (PolyObject *)os->obj->ConvertToType(t, polyObjectClassID);
            // Now stuff this into the pipeline!
            os->obj = polyOb;

            ModifyPolyObject(polyOb, t, mc, 3);
    }

    os->obj->SetChannelValidity (GEOM_CHAN_NUM, valid);
    os->obj->SetChannelValidity (TOPO_CHAN_NUM, valid);

    os->obj->SetChannelValidity (VERT_COLOR_CHAN_NUM, valid);
    os->obj->SetChannelValidity (TEXMAP_CHAN_NUM, valid );
    os->obj->SetChannelValidity (SELECT_CHAN_NUM, valid);
    os->obj->SetChannelValidity (MTL_CHAN_NUM, valid);
}

关于什么可能导致 3ds Max 不为我的网格提供映射数据的任何想法?

感谢您的时间。

【问题讨论】:

    标签: c++ 3dsmax


    【解决方案1】:

    由于这里的回复,我最终弄清楚了....

    http://forums.cgsociety.org/showthread.php?p=7816721#post7816721

    没有点击链接,我只需要确保更新......

    ChannelMask ChannelsUsed(); ChannelMask ChannelsChanged();

    最初它们分别设置为它们的默认值 TOPO_CHANNEL |GEOM_CHANNEL 和 GEOM_CHANNEL。

    将 ChannelIsChanged() 更新为 GEOM_CHANNEL | TOPO_CHANNEL | TEXMAP_CHANNEL | VERTCOLOR_CHANNEL 解决了这个问题。

    【讨论】:

      猜你喜欢
      • 2014-07-08
      • 2016-12-18
      • 2014-03-29
      • 1970-01-01
      • 2019-03-06
      • 2014-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多