[MSCE] 构件透明度问题

请问老师:

       如下图,为什么transparency是0,但是实际看到在却不是非透明?

Parents Reply
  • 我写了如下测试代码终于分析清楚了该问题的原因:

    struct MyProcessor : public IElementGraphicsProcessor
    {
    	virtual void _AnnounceElemDisplayParams(ElemDisplayParamsCR displayParams) override
    	{
    		WPrintfString wStr(L"element transparency = %.4f", displayParams.GetTransparency());
    		mdlDialog_dmsgsPrint (wStr);
    	}
    	virtual void _AnnounceElemMatSymb(ElemMatSymbCR matSymb) override
    	{
    		WChar materialName[256];
    		matSymb.GetMaterial()->GetName(materialName);
    		WPrintfString wStr(L"material name = %s\n", materialName);
    		mdlDialog_dmsgsPrint (wStr);
    	}
    }
    void getTrans(WCharCP unparsed)
    {
        MyProcessor processor;
    	ElementHandle eh(2385L, ACTIVEMODEL);
        ElementGraphicsOutput::Process(eh, processor);
    }

    最终输出了如下信息:

    这说明这个106类型的元素其元素透明度确实是0(不透明),但它被赋予了材质Gray glass no refract。查该材质的透明度应该是透明的。当一个元素被赋予材质后,其本身的透明度特性将失去效果。



    Answer Verified By: 石磊 

Children
  • 建模是用的OBD。哦,原来是这样。我试试。谢谢符老师。

  • 进一步写代码分析,发现这个透明度是依靠TransmitIntensity来控制的。材质编程这一块极其复杂。

    virtual void _AnnounceElemMatSymb(ElemMatSymbCR matSymb) override
    	{
    		WChar materialName[256];
    		MaterialCP pMat = matSymb.GetMaterial();
    		pMat->GetName(materialName);
    		MaterialSettingsCR matSet = pMat->GetSettings();
    		WPrintfString wStr(L"material name = %s\nmaps count = %d", materialName, matSet.GetMaps().Size());
    		mdlDialog_dmsgsPrint(wStr);
    		wStr.Sprintf(L"translucencyScale = %.4f\ntransmitIntensity = %.4f", matSet.GetTranslucencyScale(), matSet.GetTransmitIntensity());
    		mdlDialog_dmsgsPrint(wStr);
    		for (auto iter : matSet.GetMaps())
    		{
    			MaterialMapLayerCollectionCR layers = iter.second->GetLayers();
    			for (MaterialMapLayerConstIterator iter2 = layers.begin(); iter2 != layers.end(); ++iter2)
    			{
    				WPrintfString wStr2(L"MapType = %d, LayerType = %d, Opacity=%.4f", iter.second->GetType(), 
    					                iter2->GetType(), iter2->GetOpacity());
    				mdlDialog_dmsgsPrint(wStr2);
    			}
    		}
    	}

    即:matSymb.GetMaterial()->GetSettings().GetTransmitIntensity()可获得0.9这个值,正好对应界面中的opacity为10。因为transmit表示透过度,而opacity表示不透明度,两者的值是相反的。再者,transmit的取值范围是0~1,而界面上的Opacity取值范围是0~100.

    故opacity = (1-matSymb.GetMaterial()->GetSettings().GetTransmitIntensity()) * 100;



  • 嗯,非常感谢符老师,说明非常详细。