NullReferenceException was unhandled
3D Graphics with xna Game studio 4.0
06 Skinned Model
學習筆記
經代碼跟蹤發現產生該問題的原因為程式在載入3D 模型後 model.Tag=null;引起下面這句編譯不能通過。
即下面的這句:
Model manModel = Content.Load<Model>("dude");
skinnedModel = new SkinnedModel(manModel,
Vector3.Zero, new Vector3(0, MathHelper.Pi, 0), new Vector3(10),
GraphicsDevice, Content);
出錯的地方:
this.skinningData = model.Tag as SkinningData;
分析為模型載入沒有得到model.Tag值,懷疑為模型載入錯誤引起。
經過對比,發現本程式中產生的dude.xnb(在"bin\x86\Debug\Content"檔案夾中)比樣本程式產生的少。
後將樣本程式中的dude.xnb檔案複製到本程式中後,即可正常運行。
究其原因,是dude.fbx 屬性中的 素材處理器類 (content processor class)沒有選擇自訂專用的處理類,而是選用系統預設的素材處理類,如所示。
素材處理器類(content processor class)相關介紹:
http://shiba.hpe.sh.cn/jiaoyanzu/wuli/showArticle.aspx?articleId=363&classId=4
注意本例中的應選自訂的SkinnedModelProcessor類,用於將自訂的一些動畫資料存放區在
model.Tag中,否則如果選擇預設或別的素材處理類,將會出現 model.Tag=null;因為選擇預設的
素材處理器類他沒有進行這樣的處理。
參考:
XNA的Model類有一個Tag屬性可以將自訂的資料添加到模型中。使用dictionary作為Tag屬性
,你可以將不同的自訂對象添加到Model類中,並可以即時通過使用string查詢到這些對象。
注意你設定在ModelContent對象Tag屬性中的資料會一起儲存在二進位的XNB檔案中,當使用
content manager載入模型時這些資料會重新還原。