Вращение текстуры

Сообщения
1,952
Лучшие ответы
65
Реакции
186
Версия Minecraft
1.7.10
Доброго времени суток всем о/

Вопрос до ужаса банален: как вращать текстуру на рисуемом объекте?
Заранее спасибо :3
 

mod

Сообщения
156
Лучшие ответы
2
Реакции
12
наверно как и двигать, а это можно увидит на зачаровании и при спавне визера
 
Сообщения
960
Лучшие ответы
45
Реакции
294
Если текстура это U и V то тебе всего то надо вращать эти координаты относительно оси Z. Я бы посоветовал делать это через умножение на матрицу. Я обычно использую ejml (Efficent java matrix library от Google).
 
Сообщения
1,981
Лучшие ответы
18
Реакции
90
Способ для ленивых:
Java:
GL11.glMatrixMode(GL11.GL_TEXTURE);
GL11.glPushMatrix();
GL11.glRotatef(...);
// .. render
GL11.glPopMatrix();
GL11.glMatrixMode(GL11.GL_MODELVIEW);
P.S. Способ быстрый, но он не очень 'красивый', обычно такое делать не рекомендуют, хотя майн и по-ужаснее вещи делает :d
P.P.S. Код на работоспособность не проверял, обязательно отпишись :V
 
Последнее редактирование:
Сообщения
1,451
Лучшие ответы
12
Реакции
173
Если текстура это U и V то тебе всего то надо вращать эти координаты относительно оси Z. Я бы посоветовал делать это через умножение на матрицу. Я обычно использую ejml (Efficent java matrix library от Google).
Так если ось фиксированная, то там куча вычислений у матрицы убирается. Дело доходит до того, что можно повернуть синусом и косинусом, что займёт 4 умножения и 2 сложения
 
Сообщения
1,952
Лучшие ответы
65
Реакции
186
@CoomingSoon, я, возможно, что-то не так делаю, но как применить эту формулу к .addVertexWithUV?
@Oldestkon, не вышло:
 
Сообщения
2,451
Лучшие ответы
75
Реакции
343
Попробуй трансформировать вершины матрицей поворота сначала.
 
Сообщения
1,952
Лучшие ответы
65
Реакции
186
@Dahaka слишком умные слова. Ничего непонял хд
 
Сообщения
2,451
Лучшие ответы
75
Реакции
343
Ну у тебя есть вершины (ювешки). Возьми матрицу Matrix4f, поверни ее, а затем трансформируй ювешки. Все нужные методы там есть. Способ такой себе, но сначала лучше сделать хоть как-нибудь, чтобы работало, а затем уже думать об оптимизации.
 
Сообщения
1,952
Лучшие ответы
65
Реакции
186
А, всё, сделал.
@Oldestkon, твой метод не подходит для анимированных текстур (через .mcmeta) [может и есть решение для них, но пока оно не нужно], но для статичных нормально.
Однако есть две проблемы:
  • оно вращается вокруг координаты (0; 0), а нужно вокруг центра
  • пиксели переносятся и как бы дублируются, а мне это не нужно

P.S. нет, для первого случая ни glTranslated, ни изменение координат в addVertexWithUV не выход, ибо тогда оно сдвигает текстуру и получается фигня
 
Последнее редактирование:
Сообщения
2,451
Лучшие ответы
75
Реакции
343
В твоих руках матрица. Тоже самое, что глтрансформы.
 
Сообщения
2,451
Лучшие ответы
75
Реакции
343
Там же есть все методы.
 
Сообщения
1,981
Лучшие ответы
18
Реакции
90
P.S. нет, для первого случая ни glTranslated, ни изменение координат в addVertexWithUV не выход, ибо тогда оно сдвигает текстуру и получается фигня
Вообще-то тренслейт - выход. Просто надо потом обратно сместить 1514138568985.png

Насчёт дублирования пикселей не очень понятно, а что делать если текстурные координаты выходят за рамки [0, 0] - [1, 1]? Обычно либо дублируют, либо клемпят, и это настраивается параметром текстуры при загрузке, в том числе через .mcmeta.
Иначе я не очень понимаю, что ты пытаешься сделать.
 
Сообщения
1,952
Лучшие ответы
65
Реакции
186
Иначе я не очень понимаю, что ты пытаешься сделать.
Грубо говоря смотри:
Есть у меня квадратик. Я хочу на нём рендерить текстуру, которая будет вращаться, при этом квадратик должен быть статичен. Если UV вылазит за квадратик - она обрезается самими границами полигона. Но если не доходит - текстура копируется с другой стороны. Вот мне и надо её "обрезать" - чтобы там ничего не было.

1. Есть текстура в фотошопе
2. Я её поворачиваю, чем часть пикселей обрезается, а часть остаётся пустой (прозрачные)
3. Но в майне, вместо того чтобы исчезнуть, они дублируются с противоположной стороны текстуры (синяя заливка областей, которые дублируют пиксели)

Вот и вопрос: как от этого избавиться (чтобы там ничего не было)?
 
Сообщения
1,952
Лучшие ответы
65
Реакции
186
Сообщения
2,451
Лучшие ответы
75
Реакции
343
Если не ошибаюсь, при загрузке текстуры нужно указать:
Код:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
Или заменить GL_CLAMP_TO_EDGE на GL_CLAMP_TO_BORDER и указать цвет также через glTexParameteri.

Правда я не знаю, можно ли такое провернуть через ванильный mcmeta файл.
 
Сообщения
2,451
Лучшие ответы
75
Реакции
343
Да, можно. Попробуй поставить clamp - true
 
Сверху