四.獲取SolidWorks中的材質(zhì)信息

四.獲取SolidWorks中的材質(zhì)信息

SolidWorks插件-將SolidWorks文件轉(zhuǎn)換為gltf格式

4.1 關(guān)于材質(zhì)

其實在上一節(jié)的代碼里已經(jīng)有獲取SolidWorks的材質(zhì)信息。在SolidWorks中的零件文檔有材料信息,實體(Body)有材質(zhì)信息蛤迎,面有材質(zhì)信息。此處的材質(zhì)信息包含顏色丝里,光澤度等等。
處理這些材質(zhì)信息后才能讓轉(zhuǎn)換出來的文檔和SolidWorks中的文檔看起來相似体谒。

4.2 材質(zhì)信息

  • 在SolidWorks中杯聚,IPartDoc,IFace2,IBody都具有MaterialPropertyValue的屬性。這個屬性會返回一個數(shù)組抒痒。
[ R, G, B, Ambient, Diffuse, Specular, Shininess, Transparency, Emission ]
  • 在這里我們使用一個SharpglTF中MaterialBulider對象來構(gòu)造一個的材質(zhì)對象
 public MaterialBuilder MaterialBuilder
        {
            get
            {
                
                    if (FaceMaterialValue != null)
                    {
                        _MaterialBuilder = new MaterialBuilder()
                        .WithDoubleSide(true)
                        .WithChannelParam(KnownChannels.Normal, new System.Numerics.Vector4(
                           Convert.ToSingle(FaceMaterialValue[0]),
                           Convert.ToSingle(FaceMaterialValue[1]),
                           Convert.ToSingle(FaceMaterialValue[2]),
                           1));
                    }
                
                return _MaterialBuilder;
            }
        }
4.3 存儲零件幌绍,實體,面的材質(zhì)和幾何信息
namespace DuSwToglTF.Model
{
    using VERTEX = SharpGLTF.Geometry.VertexTypes.VertexPosition;

    public class SWglTFModel
    {
        /// <summary>
        /// SolidWorks材料屬性
        /// </summary>
        public double[] PartMaterialValue;
        /// <summary>
        /// Solidworks變換矩陣
        /// </summary>
        public MathTransform SWMathTran;
        /// <summary>
        /// 默認材料屬性
        /// </summary>
        private MaterialBuilder InitMaterial = new MaterialBuilder()
                .WithDoubleSide(true)
                .WithMetallicRoughnessShader()
                .WithChannelParam(KnownChannels.MetallicRoughness, new Vector4(1, 0, 0, 1));
        /// <summary>
        /// 初始原點矩陣
        /// </summary>
        public  Matrix4x4 InitPartPos = new Matrix4x4(
            1, 0, 0, 0,
            0, 1, 0, 0,
            0, 0, 1, 0,
            0, 0, 0,1
            );

        /// <summary>
        /// 零件矩陣
        /// </summary>
        public Matrix4x4 PartTransform
        {
            get {
                if (SWMathTran == null)
                {
                    return InitPartPos;
                }
                else
                {
                    double[] Tran = SWMathTran.ArrayData;
                    return new Matrix4x4(
                        Convert.ToSingle(Tran[0]), Convert.ToSingle(Tran[1]), Convert.ToSingle(Tran[2]), 0,
                        Convert.ToSingle(Tran[3]), Convert.ToSingle(Tran[4]), Convert.ToSingle(Tran[5]), 0,
                        Convert.ToSingle(Tran[6]), Convert.ToSingle(Tran[7]), Convert.ToSingle(Tran[8]), 0,
                        Convert.ToSingle(Tran[9]), Convert.ToSingle(Tran[10]), Convert.ToSingle(Tran[11]), 0
                        );
                }
            }
        }
     
        //[ R, G, B, Ambient, Diffuse, Specular, Shininess, Transparency, Emission ]
        /// <summary>
        /// 材料屬性
        /// </summary>
        public MaterialBuilder MaterialBuilder
        {
            get
            {

                if (PartMaterialValue != null)
                {
                    //if (PartMaterialValue[0] == 1 && PartMaterialValue[1] == 1 && PartMaterialValue[2] == 1)
                    //{
                    //    return InitMaterial;
                    //}
                    //else
                    //{
                    _MaterialBuilder = new MaterialBuilder()
              .WithDoubleSide(true)
              .WithChannelParam(KnownChannels.BaseColor, new System.Numerics.Vector4(
                 Convert.ToSingle(PartMaterialValue[0]),
                 Convert.ToSingle(PartMaterialValue[1]),
                 Convert.ToSingle(PartMaterialValue[2]),
                 1));
                    // }
                    
                }
                if (_MaterialBuilder == null)
                {
                    _MaterialBuilder = InitMaterial;
                }
                return _MaterialBuilder;
            }
        }
        /// <summary>
        /// 所有的實體
        /// </summary>
        public List<BodyglTFModel> BodyList = new List<BodyglTFModel>();
        #region 私有字段
        private Matrix4x4 _PartTransform;
        private MaterialBuilder _MaterialBuilder = null;
        #endregion
    }
    /// <summary>
    /// 實體模型屬性
    /// </summary>
    public class BodyglTFModel
    {
        /// <summary>
        /// 初始原點矩陣
        /// </summary>
        public Matrix4x4 InitPartPos = new Matrix4x4(
            1, 0, 0, 0,
            0, 1, 0, 0,
            0, 0, 1, 0,
            0, 0, 0, 1
            );
        public MathTransform SWMathTran;

        /// <summary>
        /// 零件矩陣
        /// </summary>
        public Matrix4x4 BodyTransform
        {
            get
            {
                if (SWMathTran == null)
                {
                    return InitPartPos;
                }
                else
                {
                    double[] Tran = SWMathTran.ArrayData;
                    return new Matrix4x4(
                        Convert.ToSingle(Tran[0]), Convert.ToSingle(Tran[1]), Convert.ToSingle(Tran[2]), 0,
                        Convert.ToSingle(Tran[3]), Convert.ToSingle(Tran[4]), Convert.ToSingle(Tran[5]), 0,
                        Convert.ToSingle(Tran[6]), Convert.ToSingle(Tran[7]), Convert.ToSingle(Tran[8]), 0,
                        Convert.ToSingle(Tran[9]), Convert.ToSingle(Tran[10]), Convert.ToSingle(Tran[11]), 0
                        );
                }
            }
        }

        /// <summary>
        /// 實體材料屬性
        /// </summary>
        public double[] BodyMaterialValue;

        //[ R, G, B, Ambient, Diffuse, Specular, Shininess, Transparency, Emission ]
        public MaterialBuilder MaterialBuilder
        {
            get
            {
             
                    if (BodyMaterialValue != null)
                    {
                        _MaterialBuilder = new MaterialBuilder()
                        .WithDoubleSide(true)
                        .WithChannelParam(KnownChannels.Normal, new System.Numerics.Vector4(
                           Convert.ToSingle(BodyMaterialValue[0]),
                           Convert.ToSingle(BodyMaterialValue[1]),
                           Convert.ToSingle(BodyMaterialValue[2]),
                           1));
                    }
              
                    return _MaterialBuilder;
                

            }
        }
        /// <summary>
        /// 實體中所有的面
        /// </summary>
        public List<FaceglTFModel> FaceList = new List<FaceglTFModel>();

        private MaterialBuilder _MaterialBuilder = null;

    }

    public class FaceglTFModel
    {
        /// <summary>
        /// 面材質(zhì)屬性
        /// </summary>
        public double[] FaceMaterialValue;

        private MaterialBuilder _MaterialBuilder = null;
        //[ R, G, B, Ambient, Diffuse, Specular, Shininess, Transparency, Emission ]
        public MaterialBuilder MaterialBuilder
        {
            get
            {
                
                    if (FaceMaterialValue != null)
                    {
                        _MaterialBuilder = new MaterialBuilder()
                        .WithDoubleSide(true)
                        .WithChannelParam(KnownChannels.Normal, new System.Numerics.Vector4(
                           Convert.ToSingle(FaceMaterialValue[0]),
                           Convert.ToSingle(FaceMaterialValue[1]),
                           Convert.ToSingle(FaceMaterialValue[2]),
                           1));
                    }
                
                return _MaterialBuilder;
            }
        }
        /// <summary>
        /// 面中所有的三角面
        /// </summary>
        public List<FaceVertexModel> FaceTri = new List<FaceVertexModel>();
    }
    /// <summary>
    /// 一個三角形面的三個頂點
    /// </summary>
    public class FaceVertexModel
    {
        public VERTEX a;
        public VERTEX b;
        public VERTEX c;
    }
}
  • 我們用這樣一個數(shù)據(jù)結(jié)構(gòu)來描述一個SolidWorks零件或者轉(zhuǎn)配體故响。在轉(zhuǎn)換中將其轉(zhuǎn)換為SharpglTF的一個sence對象傀广,在輸出為gltf格式。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末彩届,一起剝皮案震驚了整個濱河市伪冰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌樟蠕,老刑警劉巖贮聂,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件靠柑,死亡現(xiàn)場離奇詭異,居然都是意外死亡吓懈,警方通過查閱死者的電腦和手機歼冰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來耻警,“玉大人隔嫡,你說我怎么就攤上這事¢爬福” “怎么了畔勤?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵蕾各,是天一觀的道長扒磁。 經(jīng)常有香客問我,道長式曲,這世上最難降的妖魔是什么妨托? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮吝羞,結(jié)果婚禮上兰伤,老公的妹妹穿的比我還像新娘。我一直安慰自己钧排,他們只是感情好敦腔,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著恨溜,像睡著了一般符衔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上糟袁,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天判族,我揣著相機與錄音,去河邊找鬼项戴。 笑死形帮,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的周叮。 我是一名探鬼主播辩撑,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼仿耽!你這毒婦竟也來了合冀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤氓仲,失蹤者是張志新(化名)和其女友劉穎水慨,沒想到半個月后得糜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡晰洒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年朝抖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谍珊。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡治宣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出砌滞,到底是詐尸還是另有隱情侮邀,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布贝润,位于F島的核電站绊茧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏打掘。R本人自食惡果不足惜华畏,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望尊蚁。 院中可真熱鬧亡笑,春花似錦、人聲如沸横朋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽琴锭。三九已至晰甚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間祠够,已是汗流浹背压汪。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留古瓤,地道東北人止剖。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像落君,于是被迫代替她去往敵國和親穿香。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容