我试图在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