四.獲取SolidWorks中的材質(zhì)信息
SolidWorks插件-將SolidWorks文件轉(zhuǎn)換為gltf格式
- 一.SolidWorks文件轉(zhuǎn)換為glTF格式
- 二.搭建一個Taskpane的SolidWorks插件
- 三.獲取SolidWorks文件中的網(wǎng)格信息
- 四.獲取SolidWorks中的材質(zhì)信息
- 五.轉(zhuǎn)換為glTF格式
- 六.裝配體和多實體格式的轉(zhuǎn)換
- 去Github查看代碼或下載插件安裝包
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格式。