我試圖在Ubuntu上使用MasterQ32's OpenWorld.Engine。我遵循了「Documentation」的示例場景。除資產導入外,一切運行良好。有趣的是,Windows 7也出現同樣的錯誤:Assimp.NET的庫加載程序找不到kernel32.dll
。下面是堆棧跟蹤:在Mono/Linux下編譯Assimp.NET
Unhandled Exception:
System.DllNotFoundException: kernel32
at (wrapper managed-to-native) Assimp.Unmanaged.NativeMethods:LoadLibrary (string)
at Assimp.Unmanaged.AssimpLibraryImplementation.LoadLibrary (System.String path) [0x00000] in <filename unknown>:0
at Assimp.Unmanaged.AssimpLibrary.LoadLibrary (System.String libPath) [0x00000] in <filename unknown>:0
at Assimp.Unmanaged.AssimpLibrary.LoadLibrary (System.String lib32Path, System.String lib64Path) [0x00000] in <filename unknown>:0
at Assimp.Unmanaged.AssimpLibrary.LoadLibrary() [0x00000] in <filename unknown>:0
at Assimp.Unmanaged.AssimpLibrary.LoadIfNotLoaded() [0x00000] in <filename unknown>:0
at Assimp.Unmanaged.AssimpLibrary.EnableVerboseLogging (Boolean enable) [0x00000] in <filename unknown>:0
at Assimp.AssimpImporter.PrepareImport() [0x00000] in <filename unknown>:0
at Assimp.AssimpImporter.ImportFileFromStream (System.IO.Stream stream, PostProcessSteps postProcessFlags, System.String formatHint) [0x00000] in <filename unknown>:0
at OpenWorld.Engine.Model.Load (OpenWorld.Engine.AssetLoadContext context, System.IO.Stream stream, System.String extensionHint) [0x00000] in <filename unknown>:0
at OpenWorld.Engine.Asset+<Load>c__AnonStorey0`1[OpenWorld.Engine.Model].<>m__0() [0x00000] in <filename unknown>:0
at OpenWorld.Engine.Game.DeferRoutines() [0x00000] in <filename unknown>:0
at System.Threading.Thread.StartInternal() [0x00000] in <filename unknown>:0
[ERROR] FATAL UNHANDLED EXCEPTION: System.DllNotFoundException: kernel32
at (wrapper managed-to-native) Assimp.Unmanaged.NativeMethods:LoadLibrary (string)
at Assimp.Unmanaged.AssimpLibraryImplementation.LoadLibrary (System.String path) [0x00000] in <filename unknown>:0
at Assimp.Unmanaged.AssimpLibrary.LoadLibrary (System.String libPath) [0x00000] in <filename unknown>:0
at Assimp.Unmanaged.AssimpLibrary.LoadLibrary (System.String lib32Path, System.String lib64Path) [0x00000] in <filename unknown>:0
at Assimp.Unmanaged.AssimpLibrary.LoadLibrary() [0x00000] in <filename unknown>:0
at Assimp.Unmanaged.AssimpLibrary.LoadIfNotLoaded() [0x00000] in <filename unknown>:0
at Assimp.Unmanaged.AssimpLibrary.EnableVerboseLogging (Boolean enable) [0x00000] in <filename unknown>:0
at Assimp.AssimpImporter.PrepareImport() [0x00000] in <filename unknown>:0
at Assimp.AssimpImporter.ImportFileFromStream (System.IO.Stream stream, PostProcessSteps postProcessFlags, System.String formatHint) [0x00000] in <filename unknown>:0
at OpenWorld.Engine.Model.Load (OpenWorld.Engine.AssetLoadContext context, System.IO.Stream stream, System.String extensionHint) [0x00000] in <filename unknown>:0
at OpenWorld.Engine.Asset+<Load>c__AnonStorey0`1[OpenWorld.Engine.Model].<>m__0() [0x00000] in <filename unknown>:0
at OpenWorld.Engine.Game.DeferRoutines() [0x00000] in <filename unknown>:0
at System.Threading.Thread.StartInternal() [0x00000] in <filename unknown>:0
這裏是我使用的代碼,基本上等同於一個在Doc:設置一個場景中的攝像頭和一個對象。我正在使用存儲庫中提供的資產,並驗證資產路徑是否正確。
using System;
using System.IO;
using OpenWorld.Engine;
using System.Drawing;
using OpenTK.Graphics;
using OpenWorld.Engine.SceneManagement;
using OpenTK;
namespace OpenWorldLearn {
public class TestGame : Game {
Scene scene;
PerspectiveLookAtCamera camera;
protected override PresentationParameters GetPresentationParameters() {
var def = base.GetPresentationParameters();
def.GraphicsMode = new GraphicsMode(24, 24, 0, 0);
def.Resolution = new Size(800, 600);
def.IsFullscreen = false;
def.Title = "Potato!";
return def;
}
protected override void OnLoad() {
FrameBuffer.ClearColor = OpenWorld.Engine.Color.CornflowerBlue;
Assets.Sources.Add(new FileSystemAssetSource("../../../Assets"));
camera = new PerspectiveLookAtCamera();
camera.FieldOfView = 90;
camera.LookAt(new Vector3(-0.1f, 1.9f, -4f), Vector3.Zero);
scene = new Scene();
SceneNode child = new SceneNode();
var renderer = child.Components.Add<Renderer>();
renderer.Model = Assets.Load<Model>("crate");
scene.Root.Children.Add(child);
}
protected override void OnUpdate(GameTime time) {
scene.Update(time);
}
protected override void OnDrawPostState(GameTime time) {
FrameBuffer.Clear();
scene.Draw(this.camera, time);
}
}
}
顯然,這不會在Linux上工作......我也非常懷疑它不適用於Windows 7. – leppie 2015-02-06 11:48:45
那麼,至少在Xamarin Studio for Windows中,我會得到相同的結果。 (我永遠不會下載7GB的IDE,需要一個月的時間) – Kroltan 2015-02-06 11:51:12
Assimp.NET只使用kernel32中的3個函數(libc也提供類似的功能)。但鑑於它會嘗試加載DLL,它仍然不會在非Windows上工作。我建議你尋找該庫的非Windows端口。 – leppie 2015-02-06 11:54:25