基本上,您可以创建类似 a 的内容class OBJModel
,然后使用 aOBJModelLoader.load(final InputStream is);
加载波前 .obj 文件并返回 .obj 的实例class OBJModel
。
在 中class OBJModel
,您将有一些存储顶点、法线、纹理坐标、面、材质等的数组。
加载模型
如果您不知道.obj文件中的所有内容是什么意思,那么您可以在Wikipedia 点击此处阅读所有相关信息
只是为了说明您将如何制作该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