- Версия(и) Minecraft
- All
Часто было такое, что вы не могли понять как правильно повернуть ваш предмет, что-бы он удовлетворял ваши потребности? Вы вращаете по X, Y, Z и не понимаете что происходит? Этот туториал призван исправить это. В нём я расскажу несколько паттернов и приложу код-утилиту для упрощения понимания происходящего.
Возьмём в пример мой мод. Я имею картинку оружия, она у меня повёрнута не так как в майнкрафте:
Для начала настроим рендер в инвентаре. Изначально мы имеем вот такой код:
Увеличим картинку:
Теперь я хочу, что-бы предмет был повёрнут как в майнкрафте, и "смотрел" на северо-восток. Соответственно я применю такой код:
Но что я увижу? Я увижу сдвиг:
А всё потому, что картинка вращается вокруг нашего указанного вектора (проще говоря, вокруг оси Z)
Что-бы было легче, можно применить вот такой код, для рендера осей:
Что-бы предмет вращался вокруг своего центра, перед всеми трансформациями мы сдвинем матрицу так, что-бы центр координат позиционировался в центре нашего слота:
В результате центр координат находится в центре слота:
После всех трансформаций сдвигаем нашу матрицу на 8 единиц по X и Y. Но после скэйла это значение составит 0,5F. Подгоняем размер и готово!
Ниже предоставлен код с комментариями:
В результате вращение предмета происходит вокруг его центра. Для наглядности паттерна переместим наш рендер осей до вращения:
В 3D всё делается аналогично, но с тремя осями. Сейчас мне очень лень это всё писать, я вообще хотел это всё на конкурс, но лень мне не даёт, да и времени нет
Используемые кода-утилиты:
Возьмём в пример мой мод. Я имею картинку оружия, она у меня повёрнута не так как в майнкрафте:
Код:
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);
Что-бы было легче, можно применить вот такой код, для рендера осей:
Код:
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();
Ниже предоставлен код с комментариями:
Код:
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 всё делается аналогично, но с тремя осями. Сейчас мне очень лень это всё писать, я вообще хотел это всё на конкурс, но лень мне не даёт, да и времени нет
Используемые кода-утилиты:
Код:
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();
}