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

808
3
124
Что значит "задать"? Тебе нужно повернуть модель вокруг определенной точки?
Если да, то варианта два:
1) Поменять модель в редакторе. Срсли, это логично.
2) Передвинуть объект, повернуть, передвинуть обратно.
glTranslatef(-centerX, -centerY, -centerZ) //здесь объект транслируется обратно
glRotatef(...) //поворачиваешь как надо
glTranslatef(centerX, centerY, centerZ) //это будет "первая" применённая операция, объект переносится в нужную точку
 

svk

1,185
2
Дело в том, что я дравлю блок майна, а при повороте он раком поворачиватся, а мне надо, вокруг центра блока.

this.itemRenderer.renderItemAndEffectIntoGUI(this.fontRenderer, this.mc.getTextureManager(), new ItemStack(block), 10, 10);

Как мне узнать где центр?
 
7,099
324
1,510
float CenterX=model.width/2;//вместо model можно getRenderBoundingBox().блабла
float CenterZ=model.height/2;
 
124
1
ну зайди в этот метод, ты там был?
и что там видно? он рисует 3д модель или блок?
- нет, не рисует, он рисует иконку блока, которая заранее отрисована в атласе.
А иконка сама по себе уже плоская вещь, и тебе её не повернуть.
Рисуй блок сам и будет он в том виде, что надо тебе.
добрые дяди подскажут формулы для поворота tesselator
а я по прежнему буду настаивать на голом OpenGL ;)
 
808
3
124
Salamandr написал(а):
ну зайди в этот метод, ты там был?
и что там видно? он рисует 3д модель или блок?
- нет, не рисует, он рисует иконку блока, которая заранее отрисована в атласе.
А иконка сама по себе уже плоская вещь, и тебе её не повернуть.
Рисуй блок сам и будет он в том виде, что надо тебе.
добрые дяди подскажут формулы для поворота tesselator
а я по прежнему буду настаивать на голом OpenGL ;)
С чего ты взял такую глупость? Майн в инвентаре рисует именно блок. В атласе иконок блоков нет.
[merge_posts_bbcode]Добавлено: 29.05.2015 17:40:40[/merge_posts_bbcode]

svk написал(а):
Лучше расскажите как это сделать : )

Рендеришь блок где надо через renderBlocks.renderBlockAllFaces(block, 0, 0, 0) и не заморачиваешься с RenderItem'ом.
 
модель:
Код:
package xxxmod.models;

import net.minecraft.client.model.ModelBase;
import net.minecraft.client.model.ModelRenderer;
import net.minecraft.entity.Entity;

/**
 * table - Undefined
 * Created using Tabula 4.1.1
 */
public class ModelTable1 extends ModelBase {
    public ModelRenderer shape1;
    public ModelRenderer shape2;
    public ModelRenderer shape3;
    public ModelRenderer shape4;
    public ModelRenderer shape5;
    public ModelRenderer center;

    public ModelTable1() {
        this.textureWidth = 64;
        this.textureHeight = 32;
        center = new ModelRenderer(this, 0, 0);
        center.setRotationPoint(-1.0f, -1.0f, -1.0f);
        center.addBox(0.0f, 0.0f, 0.0f, 2, 2, 2, 0.0f);
        this.shape3 = new ModelRenderer(this, 0, 0);
        this.shape3.setRotationPoint(-8.0F, 8.0F, 7.0F);
        this.shape3.addBox(0.0F, 0.0F, 0.0F, 1, 16, 1, 0.0F);
        this.shape5 = new ModelRenderer(this, 0, 0);
        this.shape5.setRotationPoint(-8.0F, 8.0F, -8.0F);
        this.shape5.addBox(0.0F, 0.0F, 0.0F, 1, 16, 1, 0.0F);
        this.shape2 = new ModelRenderer(this, 0, 0);
        this.shape2.setRotationPoint(6.0F, 8.0F, 7.0F);
        this.shape2.addBox(1.0F, 0.0F, 0.0F, 1, 16, 1, 0.0F);
        this.shape1 = new ModelRenderer(this, 0, 0);
        this.shape1.setRotationPoint(-8.0F, 8.0F, -8.0F);
        this.shape1.addBox(0.0F, 0.0F, 0.0F, 16, 1, 16, 0.0F);
        this.shape4 = new ModelRenderer(this, 0, 0);
        this.shape4.setRotationPoint(7.0F, 8.0F, -8.0F);
        this.shape4.addBox(0.0F, 0.0F, 0.0F, 1, 16, 1, 0.0F);
    }

    @Override
    public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) {
        center.render(f5);
        this.shape3.render(f5);
        this.shape5.render(f5);
        this.shape2.render(f5);
        this.shape1.render(f5);
        this.shape4.render(f5);
    }

    /**
     * This is a helper function from Tabula to set the rotation of model parts
     */
    public void setRotateAngle(ModelRenderer modelRenderer, float x, float y, float z) {
        modelRenderer.rotateAngleX = x;
        modelRenderer.rotateAngleY = y;
        modelRenderer.rotateAngleZ = z;
    }
}
рендер:
Код:
    @Override
    public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float var8){
        GL11.glPushMatrix();
        GL11.glTranslatef((float) x + 0.5f, (float) y + 1.0f , (float) z + 0.5f);
        if (rotAngle<360f){
            rotAngle += 1f;
        } else rotAngle = 0.0f;
        GL11.glRotatef(rotAngle, 0f, 0f, 1f);
        this.bindTexture(texture);
        table.render(null, 0f, 0f, 0f, 0f, 0f, 0.0625f);
        GL11.glPopMatrix();
    }
результат:

стол вращается вокруг кубика.
 

svk

1,185
2
BlackCrafter написал(а):
модель:
Код:
package xxxmod.models;

import net.minecraft.client.model.ModelBase;
import net.minecraft.client.model.ModelRenderer;
import net.minecraft.entity.Entity;

/**
 * table - Undefined
 * Created using Tabula 4.1.1
 */
public class ModelTable1 extends ModelBase {
    public ModelRenderer shape1;
    public ModelRenderer shape2;
    public ModelRenderer shape3;
    public ModelRenderer shape4;
    public ModelRenderer shape5;
    public ModelRenderer center;

    public ModelTable1() {
        this.textureWidth = 64;
        this.textureHeight = 32;
        center = new ModelRenderer(this, 0, 0);
        center.setRotationPoint(-1.0f, -1.0f, -1.0f);
        center.addBox(0.0f, 0.0f, 0.0f, 2, 2, 2, 0.0f);
        this.shape3 = new ModelRenderer(this, 0, 0);
        this.shape3.setRotationPoint(-8.0F, 8.0F, 7.0F);
        this.shape3.addBox(0.0F, 0.0F, 0.0F, 1, 16, 1, 0.0F);
        this.shape5 = new ModelRenderer(this, 0, 0);
        this.shape5.setRotationPoint(-8.0F, 8.0F, -8.0F);
        this.shape5.addBox(0.0F, 0.0F, 0.0F, 1, 16, 1, 0.0F);
        this.shape2 = new ModelRenderer(this, 0, 0);
        this.shape2.setRotationPoint(6.0F, 8.0F, 7.0F);
        this.shape2.addBox(1.0F, 0.0F, 0.0F, 1, 16, 1, 0.0F);
        this.shape1 = new ModelRenderer(this, 0, 0);
        this.shape1.setRotationPoint(-8.0F, 8.0F, -8.0F);
        this.shape1.addBox(0.0F, 0.0F, 0.0F, 16, 1, 16, 0.0F);
        this.shape4 = new ModelRenderer(this, 0, 0);
        this.shape4.setRotationPoint(7.0F, 8.0F, -8.0F);
        this.shape4.addBox(0.0F, 0.0F, 0.0F, 1, 16, 1, 0.0F);
    }

    @Override
    public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) {
        center.render(f5);
        this.shape3.render(f5);
        this.shape5.render(f5);
        this.shape2.render(f5);
        this.shape1.render(f5);
        this.shape4.render(f5);
    }

    /**
     * This is a helper function from Tabula to set the rotation of model parts
     */
    public void setRotateAngle(ModelRenderer modelRenderer, float x, float y, float z) {
        modelRenderer.rotateAngleX = x;
        modelRenderer.rotateAngleY = y;
        modelRenderer.rotateAngleZ = z;
    }
}
рендер:
Код:
    @Override
    public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float var8){
        GL11.glPushMatrix();
        GL11.glTranslatef((float) x + 0.5f, (float) y + 1.0f , (float) z + 0.5f);
        if (rotAngle<360f){
            rotAngle += 1f;
        } else rotAngle = 0.0f;
        GL11.glRotatef(rotAngle, 0f, 0f, 1f);
        this.bindTexture(texture);
        table.render(null, 0f, 0f, 0f, 0f, 0f, 0.0625f);
        GL11.glPopMatrix();
    }
результат:

стол вращается вокруг кубика.
И что за это отвечает?
 

svk

1,185
2
В прямом, я не вижу кода, который фиксирует центр вращения на кубике.
Это что-ли?
Код:
public void setRotateAngle(ModelRenderer modelRenderer, float x, float y, float z) {
        modelRenderer.rotateAngleX = x;
        modelRenderer.rotateAngleY = y;
        modelRenderer.rotateAngleZ = z;
    }
 
svk написал(а):
В прямом, я не вижу кода, который фиксирует центр вращения на кубике.
Это что-ли?
Код:
public void setRotateAngle(ModelRenderer modelRenderer, float x, float y, float z) {
        modelRenderer.rotateAngleX = x;
        modelRenderer.rotateAngleY = y;
        modelRenderer.rotateAngleZ = z;
    }
Ну ды
 
svk написал(а):
В прямом, я не вижу кода, который фиксирует центр вращения на кубике.
Центр вращения по-дефолту находится в точке 0,0,0. Кубик находится как-раз в этой точке. Каким кодом можно "зафиксировать" центр вращения в нужном месте?
 
Хм. А почему бы не сделать obj? Дело конечно не мое, но все же. И потом, нафига делать не в центре?
 
2,955
12
Vova_master написал(а):
Хм. А почему бы не сделать obj? Дело конечно не мое, но все же. И потом, нафига делать не в центре?
Не знаешь - не советуй. Как минимум, obj формат неэффективный.
 
1,990
18
105
BlackCrafter написал(а):
Я так понимаю, проблема не решаема?
Если создал модель не в центре, иди кури?
Давай представим, что ты не создавал никакую тему полгода назад, тебе там никто не отвечал и ты не пытался гуглить.

А теперь показываю НАГЛЯДНО (иначе не дойдёт, видимо):
1. Имеем модельку куба, центр которой не находится в центре нашей системы координат:
aUutJMf.png

2. Пытаемся повернуть... 
Код:
glPushMatrix();
glRotatef(angle++, 0, 1, 0);
mesh.render();
glPopMatrix();
vTvZqv4.png

Неудача, вращается вокруг... Центра координат. А нам надо чтобы вращался вокруг центра куба. Что надо сделать? Сместить чёртов куб в центр координат! А как узнать, на сколько? Нуу, стороны куба равны, а одна сторона равна 1. Куб берет начало из 0,0 (не центр, а начало). Значит на половину. Считать надо?
3. Смещаем центр координат:
(Кстати, трансформации в OpenGL идут справа-налево. Последняя будет применена первой)
Код:
glPushMatrix();
glRotatef(angle++, 0, 1, 0); //потом это
glTranslatef(-0.5f, 0, -0.5f); //сначала это применится
mesh.render();
glPopMatrix();
irW79S4.png

Куб вращается вокруг своего центра, ура!11 Но он сместился...
4. Попробуем сместить центр куба обратно после вращения:
Код:
glPushMatrix();
glTranslatef(0.5f, 0, 0.5f); //последняя трансформация
glRotatef(angle++, 0, 1, 0);
glTranslatef(-0.5f, 0, -0.5f);
mesh.render();
glPopMatrix();
A80JLPJ.png

Ой, получилось!11
Теперь мы умеем менять центры координат объектов, а, следовательно, вращать их вокруг чего угодно. Офигеть, да? Эти матрицы такие непонятные, вроде всего лишь поменял порядок применения, а столько поменялось!1.

ЗЫ. Под спойлером чуть более техническое объяснение.
В OpenGL все трансформации применяются для матрицы модели-вида (на самом деле вокруг текущей забинденной матрицы, но мы рассматриваем другую тему), которая трансформирует (перемещает, вращает, скейлит) все точки перед отрисовкой. Матрицу можно менять, домножая её на другие матрицы (поворота, смещения, вращения, и не только).
Матрицу поворота OpenGL можно найти в интернете, а по её виду очевидно, что все точки будут вращаться вокруг точки 0, 0, 0. Поэтому, когда куб изначально в центре, часть точек имеет координаты -0.5, вторая часть 0.5. При умножении таких точек на матрицу вращения (или наоборот, я не помню), всё повернётся вокруг центра куба (только лишь потому, что его центр совпадает с началом координат).
Если же имеем модель куба, где самое малое значение координат точек = 0.0, а самое большое = 1, в таком случае центры координат объекта и нашей системы не координат не совпадают, а поэтому вращение будет работать уже по-другому.
 
Сверху