Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Растяжение объекта в OpenGL

Растяжение объекта в OpenGL

IsaevПостоялецwww13 янв. 20182:19#0
Доброго времени суток!

Возможно растяжение по осям не всего объекта, а какой-то его части средствами OpenGL?

Допустим создаём объект в любом 3D-редакторе.
Для простоты примера возьмём просто куб, но куб с фаской вдоль рёбер.
Использоваться он будет не только как куб, но и как параллелепипеды различной величины.
При простом растяжении объекта фаска на углах тоже растягивается.
Есть ли возможность этого избежать?
Т.е. грубо говоря объект делится на три части, крайние сохраняют пропорции и просто разъезжаются, а средняя растягивается?
Каким образом это реализуется в OpenGL? (пишу в Delphi, но не суть)

maks242Постоялецwww13 янв. 20183:44#1
Если я правильно понял, то такого можно добиться только меняя позиции вершин.
dayllengerПользовательwww13 янв. 20185:35#2
Есть такая идея:
- даём вершинам ещё один vec3 атрибут
- записываем на этапе создания или загрузки модели вершинам фаски в этот атрибут смещение до вершин того ребра, которое фаска сглаживает; остальным ставим нули
- в вершинный шейдер передаём матрицы раздельно
- потом к вершинам прибавляем их смещение, умножаем на скейл, вычитаем смещение и производим остальные преобразования

upd
Можно просто в этот атрибут сохранять координаты "виртуальных" вершин, а в шейдере брать это смещение.
Можно, как вариант, в редакторе поверх модели делать каркас, обозначать его как-то (весами, например), потом при загрузке для всех вершин находить ближайшую вершину из каркаса, брать у неё координаты и закидывать в атрибут, а сам каркас потом отбрасывать.

Правка: 13 янв. 2018 6:04

IsaevПостоялецwww13 янв. 201813:54#3
maks242
> Если я правильно понял, то такого можно добиться только меняя позиции вершин.
Вот у меня тоже только такая идея пришла в голову...
Вершины на этапе загрузки возможно разделить условно на группы, чтобы их потом просто двигать?

dayllenger
> Есть такая идея
а можно это на досуге как-то грубо набросать минимильный пример на любом языке? часть из перечисленного слабо представляю
Модель, типа такой, но это не так важно, главное как это вообще осуществить понять
Изображение

Правка: 13 янв. 2018 13:55

MikleМодераторwww13 янв. 201816:30#4
Isaev
> Модель, типа такой
Можешь дать конкретно эту модельку? Желательно в .3ds или .x.
IsaevПостоялецwww13 янв. 201817:15#5
Mikle
> Можешь дать конкретно эту модельку? Желательно в .3ds или .x.
в 3ds: http://www.gamedev.ru/files/?id=130227
dayllengerПользовательwww13 янв. 201818:16#6
В Блендере к кубу добавил каркас, назначил ему группу вершин и сохранил в .obj с опцией "полигруппы". При загрузке он получился как 1-й меш, а сам куб как 2-й. Может, есть более удобный способ, не знаю.
+ Показать

Код на языке D, не тестировал.
+ Загрузка
+ Вершинный шейдер
MikleМодераторwww13 янв. 201819:27#7
Isaev
Вот пример, код и exe: Трансформация куба
Это DirectX9, Visual Basic.

Я нормализовал размер твоей модели, чтобы все координаты были в пределах от -1 до 1, сгенерировал нормали (на всякий случай) и добавил в вершины атрибут.
В вертексный шейдер не нужно передавать никаких доп. матриц, достаточно передать один вектор, в xyz компонентах которого лежат коэффициенты растяжения по соответствующим осям.
Формат вертекса такой:

Private Type vFormat
  Pos As D3DVECTOR
  DPos As D3DVECTOR 'тот самый атрибут
  Norm As D3DVECTOR
End Type
В вертексном шейдере перед умножением позиции на комбинированную матрицу WVP к позиции добавляется произведение коэффициента растяжения на атрибут, всё, дальше как обычно.
Можешь использовать cube.mesh, это бинарный файл с переделанной моделью, там такой формат:
int32 кол-во вертексов
int32 кол-во индексов
vFormat[] вертексы
int16[] индексы

IsaevПостоялецwww13 янв. 201821:33#8
dayllenger
> При загрузке он получился как 1-й меш, а сам куб как 2-й.
интересный подход, надо будет такой вариант тоже потестировать, спасибо

Mikle
> Вот пример
Трансформирует именно так, как нужно!
А зачем DX? По OpenGL же вопрос

MikleМодераторwww13 янв. 201822:28#9
Isaev
> А зачем DX? По OpenGL же вопрос
Я не знаю OpenGL, поэтому сделал на чём знаю. Но шейдеры то мало отличаются?
capitalknewУдалёнwww13 янв. 201823:04#10
Я хочу тоже задать подобный вопрос: как растягивать округлый куб, но чтобы грани при этом не меняли форму и не косились?

Правка: 13 янв. 2018 23:04

IsaevПостоялецwww13 янв. 201823:06#11
Mikle
> Но шейдеры то мало отличаются?
надеюсь, я DX никогда не видел)
Буду разбираться, спасибо!
0xc0deПостоялецwww13 янв. 201823:11#12
Isaev
> Возможно растяжение по осям не всего объекта, а какой-то его части средствами
> OpenGL?

Нет.

MikleМодераторwww13 янв. 201823:11#13
capitalknew
> как растягивать округлый куб, но чтобы грани при этом не меняли форму и не косились?
В смысле? На этот вопрос ведь только что дан ответ. Или тебе нужно что-то другое?
Dmitry_MilkПостоялецwww14 янв. 201813:06#14
Скелетная анимация. Каждый круглый угол - жесткий скиниг на свою кость.

/ Форум / Программирование игр / Графика

2001—2018 © GameDev.ru — Разработка игр