Эффект 3D в GUI

Версия Minecraft
1.7.10
355
2
17
И снова здрасте, вертел тут объекты в GUI и столкнулся с такой вот проблемой, как можно создать эффект 3D плоскостям?
К примеру как-то так:

1579535267933.png

Какой-то блок с информацией, наводя на него мышкой вертелся, при этом перспектива выглядела бы так, что дальняя часть дальше.
Обычный glRotatef в такой ситуации не очень помогает, ибо этой самой перспективы не видно.

И к этой же теме вопрос, можно ли как-то весь блок с информацией наложить поверх какого-нибудь объекта? Блока там, или obj модели, как слой текстуры.
 
1,038
57
229
GameOverlayEvent (вычисляем позицию относительно игрока и рисуем 3д объект) или заглянуть в готовый мод
 
355
2
17
Не понимаю в чём проблема, все нормально рисуется. Покажи код.
Да нет особого кода, я рисую плоскость через методы в Gui, пробуя вертеть их через glRotatef, да он вертится, но это выглядит больше как сжатие ширины или же высоты блока, и что в принципе логично.
 
1,038
57
229
я рисую плоскость
поэтому ты и видишь плоскость. Надо рисовать 3д объект.
Кто му же фраза "рисую", звучит двояко. Хотелось бы увидеть код и где ты это делаешь.
Вообще всё что ты видишь на экране это 2д, но благодаря матрицам, мы можем рисовать в перспективе.
В ванильном Minecraft forge в GUI инветаря рисуется персонаж, если обратить внимание, он рисуется в Ортогональном виде. Потому что, такой режим установлен перед его отрисовкой. Если выставить Перспективу, то всё должно работать именно так как ты и хотел. Только не стоит этого делать в GUI.
А вообще, благодаря матрицам в шейдере мы можем сделать вот так
beaaedce07.jpg

Отсюда прекрасно видно что именно она позволяет сделать. Все шейдеры, плоские (если что). Они работают в 2д от 0 до 1 (где 1 - это ширина или высота экрана, ну то есть 0,0 - две координаты), а 3д благодаря лишь матрицам.
Я выложу ссылку на статью, но ты пока туда не ходи, вернешься как наберешься опыта Урок 3. Матрицы
А пока ответь на мои вопросы, я уверен там очень простое решение. А по матрицам написал лишь для общего представления.
 
1,990
18
105
Ему в гуи надо отрисовать 3д объект.
Не понимаю в чём проблема, все нормально рисуется. Покажи код.
Там же активна другая матрица трансформации, которая даёт ортонормальную проекцию.
ТС: Посмотри, как сделана отрисовка игрока в инвентаре - там на момент отрисовки задаётся нормальная перспективная матрица, тебе это и нужно.
 
355
2
17
Ортогональном виде
Воот, что-то подобное я уже либо видел, либо слышал, но не могу найти примера как его включить.

Плоскость рисую в GuiScreen#drawScreen, методом из Gui


Java:
    protected void drawGradientRect(int p_73733_1_, int p_73733_2_, int p_73733_3_, int p_73733_4_, int p_73733_5_, int p_73733_6_)
    {
        float f = (float)(p_73733_5_ >> 24 & 255) / 255.0F;
        float f1 = (float)(p_73733_5_ >> 16 & 255) / 255.0F;
        float f2 = (float)(p_73733_5_ >> 8 & 255) / 255.0F;
        float f3 = (float)(p_73733_5_ & 255) / 255.0F;
        float f4 = (float)(p_73733_6_ >> 24 & 255) / 255.0F;
        float f5 = (float)(p_73733_6_ >> 16 & 255) / 255.0F;
        float f6 = (float)(p_73733_6_ >> 8 & 255) / 255.0F;
        float f7 = (float)(p_73733_6_ & 255) / 255.0F;
        GL11.glDisable(GL11.GL_TEXTURE_2D);
        GL11.glEnable(GL11.GL_BLEND);
        GL11.glDisable(GL11.GL_ALPHA_TEST);
        OpenGlHelper.glBlendFunc(770, 771, 1, 0);
        GL11.glShadeModel(GL11.GL_SMOOTH);
        Tessellator tessellator = Tessellator.instance;
        tessellator.startDrawingQuads();
        tessellator.setColorRGBA_F(f1, f2, f3, f);
        tessellator.addVertex((double)p_73733_3_, (double)p_73733_2_, (double)this.zLevel);
        tessellator.addVertex((double)p_73733_1_, (double)p_73733_2_, (double)this.zLevel);
        tessellator.setColorRGBA_F(f5, f6, f7, f4);
        tessellator.addVertex((double)p_73733_1_, (double)p_73733_4_, (double)this.zLevel);
        tessellator.addVertex((double)p_73733_3_, (double)p_73733_4_, (double)this.zLevel);
        tessellator.draw();
        GL11.glShadeModel(GL11.GL_FLAT);
        GL11.glDisable(GL11.GL_BLEND);
        GL11.glEnable(GL11.GL_ALPHA_TEST);
        GL11.glEnable(GL11.GL_TEXTURE_2D);
    }

Перед ним пробовал вертеть GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F);
Оно вертит, да, но т.к. эта перспектива не настроена, то вертится оно именно в 2D.

В целом хочется добиться эффекта как выглядят карточки в обновленном Стиме, когда по ним водишь мышкой.
1579678273971.png

Ну а в идеале, использовать какой-то .obj плиту, на которой все нарисовать.
 

Icosider

Kotliner
Администратор
3,603
99
664
Последнее редактирование:
1,038
57
229
я бы даже сказал что это прямоугольник точки которого меняют своё положение.
Если Курсор мыши слева от середины экрана то точки, а точнее левая грань немного стремится к середине пусть это будет -N. Правая грань от середины (но меньше, то есть +N/2). Но при этом, расстояние между верхними и нижними вершинами увеличивается для тех точек, которые с обратной стороны (середины)
на картинке, левая грань зеленая (грань это ДВЕ точки или прямая), правая желтая. Я нарисовал прямоугольник, чтобы было лучше видно какие точки (вершины) как себя ведут.
298cd3fadc.jpg
0a0298324c.jpg

да, да, это очередной велосипед. Мы его называли в детстве "нае$$ко глаз" - это какой то визуальный эффект который на самом деле сделан по другому. Как фокус или обман зрения.
Можно сделать и через 3д, это будет проще. Но управлять самим эффектом поворота и растянутостью будет как раз сложнее.
 
Последнее редактирование:
7,099
324
1,510
Наверное не врубил
glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(0.1f, aspect, 0.1f, 10000);
 

Icosider

Kotliner
Администратор
3,603
99
664
если ты хочешь отрисовать обычный рект объект то просто попробуй использовать 4д вектора там ты можешь настроить глубину
Какой 4D🤦‍♂️ w значение вообще не для глубины используется...
 
Сверху