我在Blender3D中制作了一把剑,将其导出为三角模型。OBJ格式,它还生成了一个.MTL 文件,我使用 UV 映射为模型创建纹理,并以.PNG格式导出。
如何在 LWJGL 中将剑纹理加载到我的剑模型上?
我只能找到有关如何使用立方体执行此操作的教程,但是我的游戏不是 MineCraft 的复制品,所以立方体对我来说没有用。
谁能在这里帮我?
澄清:这里要问的是,如何在 LWJGL 环境中获取与相应的 OBJ 文件一起使用的 MTL 文件,并将 MTL 材料应用于 OBJ 对象。
基本上,您可以创建类似class OBJModel
的东西,然后有一个OBJModelLoader.load(final InputStream is);
加载波前.obj文件并返回class OBJModel
的实例。
在class OBJModel
中,您将有一些数组存储顶点,法线,纹理坐标,面,材质等。
加载模型
如果您不知道.obj文件中的所有这些内容是什么意思,那么您可以在维基百科上阅读所有有关它的信息,请单击此处
只是为了给出一个想法,您将如何制作OBJModel load()
方法,这里有一个想法:
public final static OBJModel load(final InputStream is)
{
final OBJModel model = new OBJModel();
try (final BufferedReader br = new BufferedReader(new InputStreamReader(is)))
{
String line;
while ((line = br.readLine()) != null)
{
if (line.isEmpty() || (line.charAt(0) == '#'))
{
continue;
}
if (line.contains("#"))
{
line = line.substring(0, line.indexOf('#'));
}
line = line.trim();
if (line.isEmpty())
{
continue;
}
if (line.startsWith("v "))
{
String[] xyz = line.split(" ");
float x = Float.parseFloat(xyz[1]);
float y = Float.parseFloat(xyz[2]);
float z = Float.parseFloat(xyz[3]);
model.addVertex(x, y, z);
continue;
}
else if (line.startsWith("vn "))
{
String[] xyz = line.split(" ");
float x = Float.parseFloat(xyz[1]);
float y = Float.parseFloat(xyz[2]);
float z = Float.parseFloat(xyz[3]);
model.addNormal(x, y, z);
continue;
}
else if (line.startsWith("vt "))
{
String[] uv = line.split(" ");
float u = Float.parseFloat(uv[1]);
float v = Float.parseFloat(uv[2]);
model.addTextureCoordinate(u, v);
continue;
}
else if (line.startsWith("f "))
{
由于我这样做只是为了让您了解如何制作它,因此您必须自己完成它。
渲染模型
当您想要渲染模型时,只需像使用纹理坐标渲染顶点时一样执行
。Blender提供所有正确的纹理坐标,所以你唯一需要做的就是在渲染所有顶点之前绑定纹理,然后用它们的纹理坐标。
我建议使用VAOs
来存储和渲染模型,尽管这取决于您使用的OpenGL版本。如果无法使用VAOs
则只需使用常规VBOs
使用gl*Pointer
调用,但不要使用即时模式进行渲染。