Как работать с рендером ?

Версия Minecraft
1.12.2
28
4
Не понимаю как взаимодействовать с рендером на новых версиях, например, я хочу нарисовать линию между игроком и блоком и как мне это сделать если все статично и делается через json ? Ну или опять же вопрос к повороту блока, например мне мало стандартных значений поворота в FACING для описания своего блока и что же мне делать ?
 
Решение
взять IModelLoader из 1.7.10,а также все ему сопутствующее, скопипастить, подправить, и сделать типо нормальный загрузчик обж моделей в игру. Я бы тоже сделал, но мне настолько лень, что я буду делать джосоны - думать меньше)
5,018
47
783
взять IModelLoader из 1.7.10,а также все ему сопутствующее, скопипастить, подправить, и сделать типо нормальный загрузчик обж моделей в игру. Я бы тоже сделал, но мне настолько лень, что я буду делать джосоны - думать меньше)
 
5,018
47
783
Не понимаю как взаимодействовать с рендером на новых версиях, например, я хочу нарисовать линию между игроком и блоком и как мне это сделать если все статично и делается через json ? Ну или опять же вопрос к повороту блока, например мне мало стандартных значений поворота в FACING для описания своего блока и что же мне делать ?
а вообще кроме фейсинг есть есть еще EnumAxis - там любой поворот по x или y на все 360 градусов
 
28
4
взять IModelLoader из 1.7.10,а также все ему сопутствующее, скопипастить, подправить, и сделать типо нормальный загрузчик обж моделей в игру. Я бы тоже сделал, но мне настолько лень, что я буду делать джосоны - думать меньше)
Разобрался в рендринге. все идеально работает)
1514982258430.png
 
5,018
47
783
О, ну и как? То что я посоветовал?
Что взял с 1.7 ?
 
Последнее редактирование:
28
4
О, ну и как? То что я посоветовал?
Ну вроде~
Я просто посмотрел как делался рендер на 1.7.10
И с помощью LWJGL отрисовал куб
В будущем думаю свой парсер для OBJ написать

Так же это решило вопрос с поворотами.
Java:
GL11.glPushMatrix();

GL11.glPushAttrib(GL11.GL_ENABLE_BIT);
GL11.glTranslatef((float)x+0.5f, (float)y+1.5f, (float)z+0.5f);
GL11.glRotated(переменая вращения,0,1,1);
GL11.glScalef(0.2f,0.2f,0.2f);
GL11.glDisable(GL11.GL_LIGHTING);
GL11.glDisable(GL11.GL_TEXTURE_2D);

drawCubeWithGL();

GL11.glPopAttrib();
GL11.glPopMatrix();



//Вот сам куб
private void drawCubeWithGL() {

    GL11.glBegin(GL11.GL_QUADS);
    GL11.glColor3f(1.0f,1.0f,0.0f);
    GL11.glVertex3f( 1.0f, 1.0f,-1.0f);
    GL11.glVertex3f(-1.0f, 1.0f,-1.0f);
    GL11.glVertex3f(-1.0f, 1.0f, 1.0f);
    GL11.glVertex3f( 1.0f, 1.0f, 1.0f);
    GL11.glColor3f(1.0f,0.5f,0.0f);
    GL11.glVertex3f( 1.0f,-1.0f, 1.0f);
    GL11.glVertex3f(-1.0f,-1.0f, 1.0f);
    GL11.glVertex3f(-1.0f,-1.0f,-1.0f);
    GL11.glVertex3f( 1.0f,-1.0f,-1.0f);
    GL11.glColor3f(1.0f,0.0f,0.0f);
    GL11.glVertex3f( 1.0f, 1.0f, 1.0f);
    GL11.glVertex3f(-1.0f, 1.0f, 1.0f);
    GL11.glVertex3f(-1.0f,-1.0f, 1.0f);
    GL11.glVertex3f( 1.0f,-1.0f, 1.0f);
    GL11.glColor3f(1.0f,1.0f,0.0f);
    GL11.glVertex3f( 1.0f,-1.0f,-1.0f);
    GL11.glVertex3f(-1.0f,-1.0f,-1.0f);
    GL11.glVertex3f(-1.0f, 1.0f,-1.0f);
    GL11.glVertex3f( 1.0f, 1.0f,-1.0f);
    GL11.glColor3f(0.0f,0.0f,1.0f);
    GL11.glVertex3f(-1.0f, 1.0f, 1.0f);
    GL11.glVertex3f(-1.0f, 1.0f,-1.0f);
    GL11.glVertex3f(-1.0f,-1.0f,-1.0f);
    GL11.glVertex3f(-1.0f,-1.0f, 1.0f);
    GL11.glColor3f(1.0f,0.0f,1.0f);
    GL11.glVertex3f( 1.0f, 1.0f,-1.0f);
    GL11.glVertex3f( 1.0f, 1.0f, 1.0f);
    GL11.glVertex3f( 1.0f,-1.0f, 1.0f);
    GL11.glVertex3f( 1.0f,-1.0f,-1.0f);
    GL11.glEnd();

}
 

Вложения

  • 1514983102826.png
    1514983102826.png
    683 KB · Просмотры: 19
28
4
Ну хорошо куб) А сложные модельки obj как делать то?))
Ну как мне ответили в теме про поворот можно отрендривать предметы которые подгружаются через json

Как-то вот так
Java:
// Твой зарегистрированный итем с OBJ json
private static EntityItem Item = new EntityItem(Minecraft.getMinecraft().world,0,0,0,new ItemStack(ItemsRegister.URAN));


GL11.glPushMatrix();

GL11.glPushAttrib(GL11.GL_ENABLE_BIT);
GL11.glTranslatef((float)x+0.5f, (float)y+1.5f, (float)z+0.5f);
GL11.glRotated(переменая вращения,0,1,1);
GL11.glScalef(0.2f,0.2f,0.2f);
GL11.glDisable(GL11.GL_LIGHTING);
GL11.glDisable(GL11.GL_TEXTURE_2D);

//Вот тут сама "сложная" модель
Minecraft.getMinecraft().getRenderManager().renderEntity(Item,0,0,0,0,0,false);

GL11.glPopAttrib();
GL11.glPopMatrix();
Это очень не удобно
Нужно еще посмотреть как подгружаются мобы

В любом случае я собрался свой парсер писать, благо гайдов много
 
5,018
47
783
В общем у меня получилось создать свой парсер. Часть кода украдена~
Eсть пара проблем которые нужно решить, но в общем работает прекрасно
Если нужно могу скинуть)
Мне пж скинь, очень obj не хватает))
 
5,018
47
783
28
4
И так
Для начала нам нужно создать 3 класса
Java:
public class Face {
    public Vector3f vertex = new Vector3f();
    public Vector3f normal = new Vector3f();
    public Vector3f uv = new Vector3f();

    public Face(Vector3f vertex,Vector3f uv,Vector3f normal)
    {
        this.vertex = vertex;
        this.normal = normal;
        this.uv = uv;
    }

}

Java:
public class Model {
    public List<Vector3f> vertices = new ArrayList<Vector3f>();
    public List<Vector3f> normals = new ArrayList<Vector3f>();
    public List<Vector3f> uv = new ArrayList<Vector3f>();
    public List<Face> faces = new ArrayList<Face>();

}

Java:
public class ObjectObj {

    Model ObjModel = new Model();

    ResourceLocation model;
    public ObjectObj(ResourceLocation model) {
        this.model = model;

//Подгрузка из памяти
        InputStream in = null;
        {
            try {
                in = Minecraft.getMinecraft().getResourceManager().getResource(model).getInputStream();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        String line;

        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        {
            try {
//Сам парсер
                while((line = reader.readLine())!= null)
                {
                    if(line.startsWith("v ")) {
                        float x = Float.valueOf(line.split(" ")[1]);
                        float y = Float.valueOf(line.split(" ")[2]);
                        float z = Float.valueOf(line.split(" ")[3]);
                        ObjModel.vertices.add(new Vector3f(x,y,z));
                    }

                    else if (line.startsWith("vn ")) {
                        float x = Float.valueOf(line.split(" ")[1]);
                        float y = Float.valueOf(line.split(" ")[2]);
                        float z = Float.valueOf(line.split(" ")[3]);
                        ObjModel.normals.add(new Vector3f(x,y,z));
                    }

                    //Тут парсер с текстурой
                    else if (line.startsWith("vt ")) {
                        float x = Float.valueOf(line.split(" ")[1]);
                        float y = Float.valueOf(line.split(" ")[2]);
                        ObjModel.uv.add(new Vector3f(x,y,0));
                    }

                    else if(line.startsWith("f ")) {
                        Vector3f vertexIndices = new Vector3f(
                                Float.valueOf(line.split(" ")[1].split("/")[0]),
                                Float.valueOf(line.split(" ")[2].split("/")[0]),
                                Float.valueOf(line.split(" ")[3].split("/")[0]));

                        Vector3f normalIndices = new Vector3f(
                                Float.valueOf(line.split(" ")[1].split("/")[2]),
                                Float.valueOf(line.split(" ")[2].split("/")[2]),
                                Float.valueOf(line.split(" ")[3].split("/")[2]));

                        Vector3f uvIndices = new Vector3f(
                                Float.valueOf(line.split(" ")[1].split("/")[1]),
                                Float.valueOf(line.split(" ")[2].split("/")[1]),
                                Float.valueOf(line.split(" ")[3].split("/")[1]));

                        ObjModel.faces.add(new Face(vertexIndices,uvIndices,normalIndices));
                    }

                }

            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }





    public void draw() {
    GL11.glBegin(GL11.GL_TRIANGLES);


    for(Face face : ObjModel.faces) {
        Vector3f n1 = ObjModel.normals.get((int) face.normal.x - 1);
        GL11.glNormal3f(n1.x,n1.y,n1.z);
        Vector3f uv1 = ObjModel.uv.get((int) face.uv.x - 1);
        GL11.glTexCoord2f(uv1.x, uv1.y);
        Vector3f v1 = ObjModel.vertices.get((int) face.vertex.x - 1);
        GL11.glVertex3f(v1.x,v1.y,v1.z);



        Vector3f n2 = ObjModel.normals.get((int) face.normal.y - 1);
        GL11.glNormal3f(n2.x,n2.y,n2.z);
        Vector3f uv2 = ObjModel.uv.get((int) face.uv.y - 1);
        GL11.glTexCoord2f(uv2.x, uv2.y);
        Vector3f v2 = ObjModel.vertices.get((int) face.vertex.y - 1);
        GL11.glVertex3f(v2.x,v2.y,v2.z);



        Vector3f n3 = ObjModel.normals.get((int) face.normal.z - 1);
        GL11.glNormal3f(n3.x,n3.y,n3.z);
        Vector3f uv3 = ObjModel.uv.get((int) face.uv.z - 1);
        GL11.glTexCoord2f(uv3.x, uv3.y);
        Vector3f v3 = ObjModel.vertices.get((int) face.vertex.z - 1);
        GL11.glVertex3f(v3.x,v3.y,v3.z);

    }

        GL11.glEnd();


    }


}

И так, для от рисовки нашей OBJ нам нужно
-Триангулировать модель
-Отразить текстуру по вертикали ( Понятия не имею почему OpenGL воспринимает текстуру перевернутой, копаться в этом не очень хочется, да и мне это не особо мешает пара кликов в пеинте, позже решу )

И в классе с рендером
Java:
//Инициализируем модель и текстурку для нее
ObjectObj SUPER_PUPER_OBJ = new ObjectObj(new ResourceLocation("modid:models/super_puper_obj.obj"));
ResourceLocation SUPER_PUPER_OBJ_TEXTURE = new ResourceLocation("modid:models/super_puper_texture.png");
/////////////////////////



GL11.glPushMatrix();
GL11.glPushAttrib(GL11.GL_ENABLE_BIT);
GL11.glTranslatef(x,y,z);


//Включаем текстурку
GL11.glEnable(GL11.GL_TEXTURE_2D);


//Стандартный бинд текстуры
    Minecraft.getMinecraft().renderEngine.bindTexture(SUPER_PUPER_OBJ_TEXTURE);
    SUPER_PUPER_OBJ.draw();


GL11.glPopAttrib();
GL11.glPopMatrix();

Вроде все~
Ниже прикрепил модель для проверки






ВАЖНО!!! Название модели должно быть с маленьким транслитом
SUPER_PUPER_OBJ это не правильно нужно писать super_puper_obj
 

Вложения

  • models.zip
    821.3 KB · Просмотры: 22
Последнее редактирование:

CumingSoon

Местный стендапер
1,634
12
269
Потому что:
# Текстурные координаты (u,v[,w]), w является не обязательным и по умолчанию 0.
# Текстурная координата по y может быть указана как 1 - v, и при этом по x = u
И если бы использовал лист, а не рисовал через begin-end, то было бы чуть быстрее
Но ты сделал свой загрузчик, что уже хорошо
 
1,111
47
420
И так
Для начала нам нужно создать 3 класса
Java:
public class Face {
    public Vector3f vertex = new Vector3f();
    public Vector3f normal = new Vector3f();
    public Vector3f uv = new Vector3f();

    public Face(Vector3f vertex,Vector3f uv,Vector3f normal)
    {
        this.vertex = vertex;
        this.normal = normal;
        this.uv = uv;
    }

}

Java:
public class Model {
    public List<Vector3f> vertices = new ArrayList<Vector3f>();
    public List<Vector3f> normals = new ArrayList<Vector3f>();
    public List<Vector3f> uv = new ArrayList<Vector3f>();
    public List<Face> faces = new ArrayList<Face>();

}

Java:
public class ObjectObj {

    Model ObjModel = new Model();

    ResourceLocation model;
    public ObjectObj(ResourceLocation model) {
        this.model = model;

//Подгрузка из памяти
        InputStream in = null;
        {
            try {
                in = Minecraft.getMinecraft().getResourceManager().getResource(model).getInputStream();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        String line;

        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        {
            try {
//Сам парсер
                while((line = reader.readLine())!= null)
                {
                    if(line.startsWith("v ")) {
                        float x = Float.valueOf(line.split(" ")[1]);
                        float y = Float.valueOf(line.split(" ")[2]);
                        float z = Float.valueOf(line.split(" ")[3]);
                        ObjModel.vertices.add(new Vector3f(x,y,z));
                    }

                    else if (line.startsWith("vn ")) {
                        float x = Float.valueOf(line.split(" ")[1]);
                        float y = Float.valueOf(line.split(" ")[2]);
                        float z = Float.valueOf(line.split(" ")[3]);
                        ObjModel.normals.add(new Vector3f(x,y,z));
                    }

                    //Тут парсер с текстурой
                    else if (line.startsWith("vt ")) {
                        float x = Float.valueOf(line.split(" ")[1]);
                        float y = Float.valueOf(line.split(" ")[2]);
                        ObjModel.uv.add(new Vector3f(x,y,0));
                    }

                    else if(line.startsWith("f ")) {
                        Vector3f vertexIndices = new Vector3f(
                                Float.valueOf(line.split(" ")[1].split("/")[0]),
                                Float.valueOf(line.split(" ")[2].split("/")[0]),
                                Float.valueOf(line.split(" ")[3].split("/")[0]));

                        Vector3f normalIndices = new Vector3f(
                                Float.valueOf(line.split(" ")[1].split("/")[2]),
                                Float.valueOf(line.split(" ")[2].split("/")[2]),
                                Float.valueOf(line.split(" ")[3].split("/")[2]));

                        Vector3f uvIndices = new Vector3f(
                                Float.valueOf(line.split(" ")[1].split("/")[1]),
                                Float.valueOf(line.split(" ")[2].split("/")[1]),
                                Float.valueOf(line.split(" ")[3].split("/")[1]));

                        ObjModel.faces.add(new Face(vertexIndices,uvIndices,normalIndices));
                    }

                }

            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }





    public void draw() {
    GL11.glBegin(GL11.GL_TRIANGLES);


    for(Face face : ObjModel.faces) {
        Vector3f n1 = ObjModel.normals.get((int) face.normal.x - 1);
        GL11.glNormal3f(n1.x,n1.y,n1.z);
        Vector3f uv1 = ObjModel.uv.get((int) face.uv.x - 1);
        GL11.glTexCoord2f(uv1.x, uv1.y);
        Vector3f v1 = ObjModel.vertices.get((int) face.vertex.x - 1);
        GL11.glVertex3f(v1.x,v1.y,v1.z);



        Vector3f n2 = ObjModel.normals.get((int) face.normal.y - 1);
        GL11.glNormal3f(n2.x,n2.y,n2.z);
        Vector3f uv2 = ObjModel.uv.get((int) face.uv.y - 1);
        GL11.glTexCoord2f(uv2.x, uv2.y);
        Vector3f v2 = ObjModel.vertices.get((int) face.vertex.y - 1);
        GL11.glVertex3f(v2.x,v2.y,v2.z);



        Vector3f n3 = ObjModel.normals.get((int) face.normal.z - 1);
        GL11.glNormal3f(n3.x,n3.y,n3.z);
        Vector3f uv3 = ObjModel.uv.get((int) face.uv.z - 1);
        GL11.glTexCoord2f(uv3.x, uv3.y);
        Vector3f v3 = ObjModel.vertices.get((int) face.vertex.z - 1);
        GL11.glVertex3f(v3.x,v3.y,v3.z);

    }

        GL11.glEnd();


    }


}

И так, для от рисовки нашей OBJ нам нужно
-Триангулировать модель
-Отразить текстуру по вертикали ( Понятия не имею почему OpenGL воспринимает текстуру перевернутой, копаться в этом не очень хочется, да и мне это не особо мешает пара кликов в пеинте, позже решу )

И в классе с рендером
Java:
//Инициализируем модель и текстурку для нее
ObjectObj SUPER_PUPER_OBJ = new ObjectObj(new ResourceLocation("modid:models/super_puper_obj.obj"));
ResourceLocation SUPER_PUPER_OBJ_TEXTURE = new ResourceLocation("modid:models/super_puper_texture.png");
/////////////////////////



GL11.glPushMatrix();
GL11.glPushAttrib(GL11.GL_ENABLE_BIT);
GL11.glTranslatef(x,y,z);


//Включаем текстурку
GL11.glEnable(GL11.GL_TEXTURE_2D);


//Стандартный бинд текстуры
    Minecraft.getMinecraft().renderEngine.bindTexture(SUPER_PUPER_OBJ_TEXTURE);
    SUPER_PUPER_OBJ.draw();


GL11.glPopAttrib();
GL11.glPopMatrix();

Вроде все~
Ниже прикрепил модель для проверки






ВАЖНО!!! Название модели должно быть с маленьким транслитом
SUPER_PUPER_OBJ это не правильно нужно писать super_puper_obj
Ты назвал поле с большой буквы?! TRIGGERED
 
Сверху