当2 +修饰符位于“修改器”列表中时,3ds Max C ++修改器不接收地图通道数据

时间:2014-05-07 01:22:38

标签: c++ 3dsmax

使用修饰符插件遇到了一些问题我在c ++中为3ds Max 2015制作并且遇到了我应用2+修饰符的问题(可以是任何类型的修饰符,它没有'对一个对象然后我应用我自己的修饰符(OpenSubdiv-MPS),它将通过我的代码在第一遍中运行,但是当我更新对象的任何内容时,第二次通过我的代码3ds Max给出我是一个没有任何映射数据的网格物体。这导致我的插件崩溃,因为我需要它的映射数据。

这是Max的Modifer列表:

http://i.imgur.com/y2dOv6x.png(抱歉,无法发布图片)

如果我之前只使用1个修饰符或没有其他修饰符,那么一切正常。我也可以随心所欲地放置它。我注意到的另一个奇怪的事情是,如果我创建我的Modifier 1st,然后在它和对象之间添加2+ Modifiers,将正确返回Mapping数据。

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

以下是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给我的Mesh没有映射数据的任何想法?

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

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

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解决了这个问题。