Задать центр вращения модели.

7,099
324
1,510
Oldestkon написал(а):
Код:
glPushMatrix();
glTranslatef(0.5f, 0, 0.5f); //последняя трансформация
glRotatef(angle++, 0, 1, 0);
glTranslatef(-0.5f, 0, -0.5f);
mesh.render();
glPopMatrix();
Почему действие вызванное раньше выполняется позже? Матрица поворота всегда применяется позже? Тогда в чем смысл порядка команд?
 
808
3
124
glTranslate/glRotate/glScale всегда применяются в обратном порядке. Это вполне логично. Назначение матриц трансформации - перенести точку из некоторого вашего пространства в пространство камеры. Если немного подумать над этим утверждением, то необходимость делать трансформации в обратном порядке становится очевидна.
 
1,990
18
105
Oldestkon написал(а):
(Кстати, трансформации в OpenGL идут справа-налево. Последняя будет применена первой)
Я ж пояснил. А вообще читайте про это на тематических форумах.
 
Чёто мне кажется, что с моделями течне это НЕ РАБОТАЕТ. Может быть такое?
Сейчас пробую метод "подвинуть,развернуть,подвинуть" на двух моделях. Одну сделал сам в табуле, вторую мне прислали в формате tcn (течне).
моя модель смещена от центра на ~1.0f по y, следовательно:
Код:
        GL11.glTranslatef(0.0f, 1.0f, 0.0f);
        GL11.glRotatef(180f, 0f, 0f, 1f);
        GL11.glTranslatef(0.0f, -1.0f, 0.0f);
Этот код переворачивает мою модель (табула) норм.
Присланная модель (течне) смещена примерно на 2.0f по х, следовательно:
Код:
        GL11.glTranslatef(2.0f, 0.0f, 0.0f);
        GL11.glRotatef(180f, 0f, 1f, 0f);
        GL11.glTranslatef(-2.0f, 0.0f, 0.0f);
должно вращать ее примерно по центру? но этого не происходит! Куда бы я ее не двигал, она всегда вращается вокруг одной и той же точки, только в разных координатах мира. То есть, модель перемещается вместе с центром.
Прокомментируйте, пожалуйста.
 
1,990
18
105
Нет. Формат моделей вообще ни на что не влияет. В итоге это всё равно будут треугольники с координатами, а координаты зависят от матрицы трансформации, на которую они потом будут умножены.
Попробуй сменить знак смещения, может модель смещена в другую сторону?
Попробуй использовать динамический угол поворота, храни где-нибудь переменную угла и каждый тик повышай её значение, так будет очень хорошо видно вокруг чего вращается модель.
Попробуй сместить модель подальше, тогда точно будет видно. При этом возвращение модели в обратную позицию можно убрать на время, нагляднее будет.

А в идеале - открыть модель в течне и посчитать дистанцию от центра координат течне до центра модельки.
А ещё лучше скинь полный код рендера модели.
 
Oldestkon написал(а):
Попробуй сменить знак смещения, может модель смещена в другую сторону?
Попробуй использовать динамический угол поворота, храни где-нибудь переменную угла и каждый тик повышай её значение, так будет очень хорошо видно вокруг чего вращается модель.
Попробуй сместить модель подальше, тогда точно будет видно. При этом возвращение модели в обратную позицию можно убрать на время, нагляднее будет.
Я так и делаю. С табулой работает, с течне нет. Течне модель просто перемещается вместе с центром.
Oldestkon написал(а):
А в идеале - открыть модель в течне и посчитать дистанцию от центра координат течне до центра модельки.
Повторюсь: если центр перемещается вместе с моделью, то в этом нет смысла.
Oldestkon написал(а):
А ещё лучше скинь полный код рендера модели.
Код:
package test3drender.renderers;

import anotherdecorativemod.models.ModelTable1;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ResourceLocation;
import org.lwjgl.opengl.GL11;
import test3drender.ModInfo;
import test3drender.models.ModelItem1;

public class RenderBlock1 extends TileEntitySpecialRenderer {

    float rotAngle = 0.0f;

    private ModelTable1 table;
    private ModelItem1 modelBlock1;

    public RenderBlock1(){
        modelBlock1 = new ModelItem1();
        table = new ModelTable1();
    }

    @Override
    public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float var8){
        GL11.glPushMatrix();
//        GL11.glTranslatef((float) x + 2.5f, (float) y + 1.5f, (float) z + 0.5f);

        if (rotAngle < 360f){
            rotAngle += 1f;
        } else {
            rotAngle = 1f;
        }
        GL11.glTranslatef(2.0f, 0.0f, 0.0f); // пробовал всяко-разно - центр тоже смещается
        //GL11.glRotatef(180f, 0f, 1f, 0f);
        GL11.glRotatef(rotAngle, 0f, 1f, 0f);
        GL11.glTranslatef(-2.0f, 0.0f, 0.0f);

        this.bindTexture(texture);
        modelBlock1.render(null, 0f, 0f, 0f, 0f, 0f, 0.0625f);
        GL11.glPopMatrix();

/*        GL11.glPushMatrix();
//рендер второй модели (табула). Тут всё как надо работает.
        GL11.glTranslated(x + 0.5d, y - 0.5d, z + 0.5d);
        GL11.glTranslatef(0.0f, 1.0f, 0.0f);
        GL11.glRotatef(180f, 0f, 0f, 1f);
        GL11.glTranslatef(0.0f, -1.0f, 0.0f);
        table.render(null, 0f, 0f, 0f, 0f, 0f, 0.0625f);
        GL11.glPopMatrix();*/

    }
}
 
1,990
18
105
Код:
//        GL11.glTranslatef((float) x + 2.5f, (float) y + 1.5f, (float) z + 0.5f);

Раскомментируй эту строку и поменяй значения на те же, что у второй модели:
Код:
GL11.glTranslated(x + 0.5d, y - 0.5d, z + 0.5d);

Мне не нравится смещение на 2.5f. Это не центр блока. Пусть будет к центру блока. 
А то выходит, ты вращаешь модель вокруг её центра, но потом смещаешь её немного дальше и эффект уже не тот, что надо. Важно, чтобы всё было ровно как у второй модели, но отличались только три строки с перемещением центра модели и поворота.

Если не выйдет - присылай код модели, я у себя помучаю.

Fix:
Код:
GL11.glTranslated(x + 0.5d, y + 0.5d, z + 0.5d);
Знак по оси Y лучше положительный брать, я хз что у тебя там за модель. Вообще, если что, поправишь. Главное горизонтально сместить модель в центр, ведь вращаешь ты по вертикальной оси.
 
Код:
        GL11.glTranslated(x + 0.5d, y + 1.0d, z + 0.5d);

        if (rotAngle < 360f){
            rotAngle += 1f;
        } else {
            rotAngle = 1f;
        }
        GL11.glTranslatef(2.0f, 0.0f, 0.0f);
        GL11.glRotatef(180f, 0f, 0f, 1f);
        GL11.glRotatef(rotAngle, 0f, 1f, 0f);
        GL11.glTranslatef(-1.3f, 0.0f, 0.3f);
Так она примерно по центру крутится. Я только не понял, почему мы сначала прибавили 2.0,0.0,0.0, а потом отняли не столько же?
Получается, что (-1.3f, 0.0f, 0.3f) это смещение от центра, а (2.0f, 0.0f, 0.0f) сдвиг модели в пространстве?
 
1,990
18
105
А? Ну я же всё объяснял простынёй текста.Матрицы применяются в обратном порядке. 
Сначала мы смещаем модель так, чтобы она оказалась в глобальном центре координат, поворачиваем, смещаем обратно на столько же. Иначе будет крутиться примерно вокруг центра или вообще не вокруг него.
Сместил сначала на 2 по X - смести потом назад на столько же.
У тебя должно быть так:
Код:
        GL11.glTranslatef(-2.0f, 0.0f, 0.0f); //третья, смещаем обратно
        GL11.glRotatef(180f, 0f, 0f, 1f); //вторая, поворачиваем
        GL11.glTranslatef(2.0f, 0.0f, 0.0f); //первая операция, смещаем в мировой центр координат

Знаки мог напутать.
 
1,990
18
105
Да. В третьей и дальше с конца. Про порядок не забывай.
Кстати, ты именно это и делаешь уже, когда смещаешь блок на его координаты:
Код:
GL11.glTranslated(x + 0.5d, y + 1.0d, z + 0.5d);

Ведь у тебя же не на 0, 0, 0 блок рисуется?
 
Сверху