Libgdx 奇怪的建模 - 深度错误?

Posted

技术标签:

【中文标题】Libgdx 奇怪的建模 - 深度错误?【英文标题】:Libgdx weird modelling - depth error? 【发布时间】:2013-12-24 21:40:04 【问题描述】:

当我使用 ObjLoader 加载任何 .obj 文件时,我得到了这个:

真实的样子:

我是如何加载它的:

ModelInstance instance = new ModelInstance(model);
instance.transform.setToTranslation(-4, 0, 0);
instance.transform.mul(transform.setToRotation(Axis.X,(float)(Math.random()*360)));

然后在onCreate()中:

Gdx.gl.glClearDepthf(1.0f);
Gdx.gl.glEnable(GL20.GL_DEPTH_TEST);
Gdx.gl.glDepthFunc(GL20.GL_LESS);
Gdx.gl.glDepthRangef(0f, 1f);
Gdx.gl.glEnable(GL20.GL_TEXTURE_2D);

在 render() 中:

Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
Gdx.gl.glClearColor(.1f, .1f, .1f, 1f);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);

shader.begin(camera, instances.get(i).transform);
modelBatch.begin(camera);

if (environment !=null) modelBatch.render(instances.get(i), environment, shader);
else modelBatch.render(instances.get(i), shader);

modelBatch.end();
shader.end();

在这里清理源代码:

source code

解决方案:

1, probleme was with the .mtl file, copy pasted from the ship.mtl and rewrite
2, probleme was with the camera near, and far plane (0.1 and 1000 is the good)
3, probleme was with the obj file texture, because it flipped on the obj file, solution was to convert g3db with -f

【问题讨论】:

【参考方案1】:

使用 libgdx 3D api(ModelBatch 和/或 Shader)时,不应在 Shader 类之外更改 opengl 状态。因此,启用/禁用深度测试等是无用的,可能会导致无法预料的行为。

您不应该使用 obj 文件。而是使用 fbx-conv 并使用 g3db 或 g3dj 文件格式。此外,您的模型缺少 mtl 文件,导致无法应用材料。

您正在使用自己的着色器,您不应该调用 shader.end(),modelbatch 会为您完成。

我试过你的模型(显然没有材料),它使用默认着色器正确渲染。

【讨论】:

您好 Xoppa,感谢您的帮助,但是如果我将 shader.end() 注释掉,那么什么都不会改变。你能帮我怎么做吗?我需要使用我的自定义着色器和纹理。 尝试将您的问题隔离到一个小型(单类)测试中。看看 libgdx g3d 测试,例如:github.com/libgdx/libgdx/blob/master/tests/gdx-tests/src/com/…。如果问题仍然存在,您可能需要将其(包括 g3dj 文件)添加到您的问题中。 OK 我试过这段代码,我用 fbx-conv 实现了 .g3db 对象,问题仍然存在。 raw.github.com/libgdx/libgdx/master/tests/gdx-tests/src/com/… 我也用 3ds max 创建了一个 .mtl 文件,但我不知道如何在 libgdx 中加载它。你能帮我更多吗? 如果 Mtl 在同一个文件夹中,它会自动加载。没有相关代码(例如,测试重现问题和所需资产(g3dj 文件和纹理)),很难说更多。 sendspace.com/file/gqo6x1 这是新代码。我尝试了一切,但对我没有任何帮助。我搜索了谷歌,但没有任何信息如何在 libgdx 中使用自定义着色器加载简单的 3d 模型对象。你能帮忙吗?或者有什么教程?我在 xoppa.blog 上看到了您的教程,但我需要在我的模型上使用自定义着色器,而不仅仅是默认着色器。我也需要闪电。【参考方案2】:

看起来你的法线有一些问题。我不认为这是深度错误的问题。取决于您的建模程序,例如blender3D,您可以尝试重新计算面部法线并再次导出!

【讨论】:

所有模型都和这里一样(我得到同样的错误)......其他android 3d引擎可以很好地打开它......【参考方案3】:

您可以在 3D Studio Max 上按照以下步骤操作:

    使用 CTRL+A 选择所有设计(如果使用 Windows) 按 ALT+G 选择编辑和工具选择附近的组类别 让大家齐心协力 在您的 Android 应用程序上重试。

应该这样做。

【讨论】:

试过你的解决方案,没有帮助。 我检查了你的照片。似乎没问题,但您为什么不将您的工作导出到 SolidWorks 中呢?有“组合”命令和标志是锚。此命令使顶点和边组合顶点或/和边。您可以将所有伴随点添加为一个点。 // 根据你的设计,你能不能只画盒子,只画球体,只画基本的画然后试试。由于三维眼角故障,您可能会将假点视为真点。

以上是关于Libgdx 奇怪的建模 - 深度错误?的主要内容,如果未能解决你的问题,请参考以下文章

LibGDX 和 Google Play 游戏不工作

将 libgdx 项目导入 Eclipse 时出现 Gradle 错误

比例建模 - Betareg 错误

使用 google Play 游戏服务配置 LIBGDX 游戏错误

LibGdx 与 Android Studio 有多个错误

libGDX与Kotlin错误“org.jetbrains.kotlin.kapt.idea.KaptModelBuilderService”