Иконка ресурса

Упрощение позиционирования картинок и моделей.

Версия(и) Minecraft
All
Часто было такое, что вы не могли понять как правильно повернуть ваш предмет, что-бы он удовлетворял ваши потребности? Вы вращаете по X, Y, Z и не понимаете что происходит? Этот туториал призван исправить это. В нём я расскажу несколько паттернов и приложу код-утилиту для упрощения понимания происходящего.

Возьмём в пример мой мод. Я имею картинку оружия, она у меня повёрнута не так как в майнкрафте:

Для начала настроим рендер в инвентаре. Изначально мы имеем вот такой код:
Код:
RenderHelper.renderItem(item.getIcon(stack, 0), 0);//Код для рендера предмета, указан в конце туториала
Увеличим картинку:
Код:
float scale = 16;
GL11.glScalef(scale, scale, 0);
Теперь я хочу, что-бы предмет был повёрнут как в майнкрафте, и "смотрел" на северо-восток. Соответственно я применю такой код:
Код:
float scale = 16;
GL11.glScalef(scale, scale, 0);
GL11.glRotatef(-135, 0, 0, 1);
RenderHelper.renderItem(inw.getIcon(stack, 0), 0);
Но что я увижу? Я увижу сдвиг:
А всё потому, что картинка вращается вокруг нашего указанного вектора (проще говоря, вокруг оси Z)
Что-бы было легче, можно применить вот такой код, для рендера осей:
Код:
float scale = 16;
GL11.glScalef(scale, scale, 0);
GL11.glRotatef(-135, 0, 0, 1);
RenderHelper.renderItem(inw.getIcon(stack, 0), 0);
RenderHelper.renderDebugAxis();
Что-бы предмет вращался вокруг своего центра, перед всеми трансформациями мы сдвинем матрицу так, что-бы центр координат позиционировался в центре нашего слота:
Код:
float scale = 16;
GL11.glTranslatef(8, 8, 0);
GL11.glScalef(scale, scale, 0);
GL11.glRotatef(-135, 0, 0, 1);
RenderHelper.renderItem(inw.getIcon(stack, 0), 0);
RenderHelper.renderDebugAxis();
В результате центр координат находится в центре слота:
После всех трансформаций сдвигаем нашу матрицу на 8 единиц по X и Y. Но после скэйла это значение составит 0,5F. Подгоняем размер и готово!
Ниже предоставлен код с комментариями:
Код:
float scale = 20;
GL11.glTranslatef(8, 8, 0);//Сдвигаем нашу матрицу на 8 единиц (размер слота 16 едениц)
GL11.glScalef(scale, scale, 0);//Увеличиваем её на 20 едениц.
GL11.glRotatef(-135, 0, 0, 1);//Вращаем её на -135° по оси Z
GL11.glTranslatef(-0.5F, -0.5F, 0);//Применяем обратную трансформацию. (сдвигаем на 8 пикселей по X и Y)
RenderHelper.renderItem(inw.getIcon(stack, 0), 0);//Рендерим предмет
RenderHelper.renderDebugAxis();//Рендерим оси
В результате вращение предмета происходит вокруг его центра. Для наглядности паттерна переместим наш рендер осей до вращения:
Код:
float scale = 16;
GL11.glTranslatef(8, 8, 0);
GL11.glScalef(scale, scale, 0);
RenderHelper.renderDebugAxis();
GL11.glRotatef(-135, 0, 0, 1);
GL11.glTranslatef(-0.5F, -0.5F, 0);
RenderHelper.renderItem(inw.getIcon(stack, 0), 0);

В 3D всё делается аналогично, но с тремя осями. Сейчас мне очень лень это всё писать, я вообще хотел это всё на конкурс, но лень мне не даёт, да и времени нет :D

Используемые кода-утилиты:

Код:
public static void renderItem(IIcon icon, float thickness)
{
    ItemRenderer.renderItemIn2D(Tessellator.instance, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), icon.getIconWidth(), icon.getIconHeight(), thickness);
}
  
public static void renderDebugAxis()
{
    GL11.glPushMatrix();
    GL11.glDisable(GL11.GL_TEXTURE_2D);

    GL11.glColor3f(1, 0, 0);
    GL11.glBegin(GL11.GL_LINES);
    GL11.glVertex3d(-10, 0, 0);
    GL11.glVertex3d(10, 0, 0);
    GL11.glEnd();

    GL11.glColor3f(0, 1, 0);
    GL11.glBegin(GL11.GL_LINES);
    GL11.glVertex3d(0, -10, 0);
    GL11.glVertex3d(0, 10, 0);
    GL11.glEnd();

    GL11.glColor3f(0, 0, 1);
    GL11.glBegin(GL11.GL_LINES);
    GL11.glVertex3d(0, 0, -10);
    GL11.glVertex3d(0, 0, 10);
    GL11.glEnd();

    GL11.glColor3f(1, 1, 1);
    GL11.glEnable(GL11.GL_TEXTURE_2D);
    GL11.glPopMatrix();
}
Автор
svk2140
Просмотры
512
Первый выпуск
Обновление
Оценка
4.80 звёзд 5 оценок

Последние рецензии

Хороший тутор. Начало угарное)
Идея с рендером осей - супер!
Очень полезно! Всё ясно и понятно.
-1 за лень, нужно было и про 3d рассказать.
Надеюсь, это не предвзято и конструктивно.
Гуд, ясно-понятно, очень понравился дебаг осей, буду использовать.

А вот для нубов можно было курс вращения и осей провести ;p
Хороший туториал, большое кол-во картинок за что огромное спасибо. Но все же лучше бы начал с 3д, а до 2д додумались бы уже :D
Сверху