Растяжение объекта в OpenGL
Isaev | Постоялец | www | 13 янв. 2018 | 2:19 | #0 |
---|
Возможно растяжение по осям не всего объекта, а какой-то его части средствами OpenGL?
Допустим создаём объект в любом 3D-редакторе.
Для простоты примера возьмём просто куб, но куб с фаской вдоль рёбер.
Использоваться он будет не только как куб, но и как параллелепипеды различной величины.
При простом растяжении объекта фаска на углах тоже растягивается.
Есть ли возможность этого избежать?
Т.е. грубо говоря объект делится на три части, крайние сохраняют пропорции и просто разъезжаются, а средняя растягивается?
Каким образом это реализуется в OpenGL? (пишу в Delphi, но не суть)
maks242 | Постоялец | www | 13 янв. 2018 | 3:44 | #1 |
---|
dayllenger | Пользователь | www | 13 янв. 2018 | 5:35 | #2 |
---|
- даём вершинам ещё один vec3 атрибут
- записываем на этапе создания или загрузки модели вершинам фаски в этот атрибут смещение до вершин того ребра, которое фаска сглаживает; остальным ставим нули
- в вершинный шейдер передаём матрицы раздельно
- потом к вершинам прибавляем их смещение, умножаем на скейл, вычитаем смещение и производим остальные преобразования
upd
Можно просто в этот атрибут сохранять координаты "виртуальных" вершин, а в шейдере брать это смещение.
Можно, как вариант, в редакторе поверх модели делать каркас, обозначать его как-то (весами, например), потом при загрузке для всех вершин находить ближайшую вершину из каркаса, брать у неё координаты и закидывать в атрибут, а сам каркас потом отбрасывать.
Правка: 13 янв. 2018 6:04
Isaev | Постоялец | www | 13 янв. 2018 | 13:54 | #3 |
---|
> Если я правильно понял, то такого можно добиться только меняя позиции вершин.
Вот у меня тоже только такая идея пришла в голову...
Вершины на этапе загрузки возможно разделить условно на группы, чтобы их потом просто двигать?
dayllenger
> Есть такая идея
а можно это на досуге как-то грубо набросать минимильный пример на любом языке? часть из перечисленного слабо представляю
Модель, типа такой, но это не так важно, главное как это вообще осуществить понять
Правка: 13 янв. 2018 13:55
Mikle | Модератор | www | 13 янв. 2018 | 16:30 | #4 |
---|
> Модель, типа такой
Можешь дать конкретно эту модельку? Желательно в .3ds или .x.
Isaev | Постоялец | www | 13 янв. 2018 | 17:15 | #5 |
---|
> Можешь дать конкретно эту модельку? Желательно в .3ds или .x.
в 3ds: http://www.gamedev.ru/files/?id=130227
dayllenger | Пользователь | www | 13 янв. 2018 | 18:16 | #6 |
---|
Код на языке D, не тестировал.
Mikle | Модератор | www | 13 янв. 2018 | 19:27 | #7 |
---|
Вот пример, код и exe: Трансформация куба
Это DirectX9, Visual Basic.
Я нормализовал размер твоей модели, чтобы все координаты были в пределах от -1 до 1, сгенерировал нормали (на всякий случай) и добавил в вершины атрибут.
В вертексный шейдер не нужно передавать никаких доп. матриц, достаточно передать один вектор, в xyz компонентах которого лежат коэффициенты растяжения по соответствующим осям.
Формат вертекса такой:
Private Type vFormat Pos As D3DVECTOR DPos As D3DVECTOR 'тот самый атрибут Norm As D3DVECTOR End Type
Можешь использовать cube.mesh, это бинарный файл с переделанной моделью, там такой формат:
int32 кол-во вертексов int32 кол-во индексов vFormat[] вертексы int16[] индексы
Isaev | Постоялец | www | 13 янв. 2018 | 21:33 | #8 |
---|
> При загрузке он получился как 1-й меш, а сам куб как 2-й.
интересный подход, надо будет такой вариант тоже потестировать, спасибо
Mikle
> Вот пример
Трансформирует именно так, как нужно!
А зачем DX? По OpenGL же вопрос
Mikle | Модератор | www | 13 янв. 2018 | 22:28 | #9 |
---|
> А зачем DX? По OpenGL же вопрос
Я не знаю OpenGL, поэтому сделал на чём знаю. Но шейдеры то мало отличаются?
capitalknew | Удалён | www | 13 янв. 2018 | 23:04 | #10 |
---|
Правка: 13 янв. 2018 23:04
Isaev | Постоялец | www | 13 янв. 2018 | 23:06 | #11 |
---|
> Но шейдеры то мало отличаются?
надеюсь, я DX никогда не видел)
Буду разбираться, спасибо!
0xc0de | Постоялец | www | 13 янв. 2018 | 23:11 | #12 |
---|
> Возможно растяжение по осям не всего объекта, а какой-то его части средствами
> OpenGL?
Нет.
Mikle | Модератор | www | 13 янв. 2018 | 23:11 | #13 |
---|
> как растягивать округлый куб, но чтобы грани при этом не меняли форму и не косились?
В смысле? На этот вопрос ведь только что дан ответ. Или тебе нужно что-то другое?
Dmitry_Milk | Постоялец | www | 14 янв. 2018 | 13:06 | #14 |
---|
/ Форум / Программирование игр / Графика