1

Тема: (3D) Фізичний розмір тексту на текстурі

Всім привіт
Намагаюся добитись ефекту, щоб написаний на текстурі 3д моделі текст завжди відповідав сталому фізичному розміру, незалежно від розміру моделі

Я генерую для моделі розгортку для тої її стіни на якій хочу писати

розгортка

Розгортка визначає як текстура лягає на модель. Тобто кожній тривимірній координаті ставить у відповідність двовимірну координату на текстурі. Ці координати прийнято називати uv, бо xyz вже зайняті визначаючи вершину у тривимірному просторі і також ці uv координати є нормалізованими, тобто набувають значень від 0 до 1, це зроблено для того щоб таку розгортку можна було легко застосувати до текстури любого розміру просто помноживши їх на її розмірність.

ліворуч - текстура та розгортка наній, праворуч - модель

http://i67.tinypic.com/13z5tm9.jpg

Після цього я аналізую всі трикутнички моделі попутно обчислюючи два значення
S - реальну площу cтіни(сторони) моделі для якої ми згенерували розгортку
Suv - типу площа розгортки на текстурі, тобто по суті получається коефіцієнт заповненості текстури 0 <= Suv <= 1

Я підозрюю що цих двох значень мало б бути достатньо, щоб знайти коефіцієнт який би правильно масштабував текст
Так виглядає моя остання спроба:

function SetScaleFactor(S, Suv)
{
    var magicConstant = 1000;
    var realS = S / Suv; //знаходимо яку площу б покривала ця текстура, якби розгортка повністю заповнювала текстуру
    this._fontScaleFactor = magicConstant / realS;
}

Але на чим більших моделях тестую(чим більша S), тим меншим получається розмір тексту за очікуваний

Які у вас ідеї як це можна поправити?
І якщо цікаві результати тестів чи ще якісь шмати коду теж кажіть, зараз і так не маю можливості їх прикріпити

Подякували: NaharD1

2

Re: (3D) Фізичний розмір тексту на текстурі

отак я досліджував підхід з такою функцією

function SetScaleFactor(S, Suv)
{
    var magicConstant = 1000;
    var realS = S / Suv; //знаходимо яку площу б покривала ця текстура, якби розгортка повністю заповнювала текстуру
    this._fontScaleFactor = magicConstant / realS;
}

так виглядають модель і текстура коли підібраний magicConstant = 12500, а S = 321, Suv = 0.509 і в результаті _fontScaleFactor = 19.79

Прихований текст

http://i.piccy.info/i9/6ff0685c46eb1979d5684df3b8f17c1e/1522747456/15516/1234465/tex1.jpghttp://i.piccy.info/a3/2018-04-03-09-24/i9-12215628/769x369-r/i.gif

тепер візьмемо модель вдвічі ширшу, де так само magicConstant = 12500, а S = 642, Suv = 0.258 і _fontScaleFactor = 5.01

Прихований текст

http://i.piccy.info/i9/61a77f2be6fd34624ea8172334de8762/1522748252/11040/1234465/tex2_800.jpghttp://i.piccy.info/a3/2018-04-03-09-37/i9-12215673/800x327-r/i.gif

тобто _fontScaleFactor вдвічі менший від того який мав би бути

але якщо ми візьмемо першу модель, та типу зробимо її квадратною (щоб висота дорівнювала ширині), де
magicConstant = 12500, а S = 623, Suv = 0.98 і _fontScaleFactor = 19.78

Прихований текст

http://i.piccy.info/i9/830470961a77291e4e172684dbe6b7dc/1522748593/16396/1234465/tex3.jpghttp://i.piccy.info/a3/2018-04-03-09-43/i9-12215693/759x439-r/i.gif

Подякували: NaharD1

3

Re: (3D) Фізичний розмір тексту на текстурі

дійшло

function SetScaleFactor(S, Suv)
{
    var magicConstant = 1000;
    var realS = S / Suv;
    this._fontScaleFactor = magicConstant / Math.sqrt(realS);
}

площа realS в нас ж відповідає квадратній текстурі, отже дорівнює x^2, тобто є показниковою функцію, і чим більший х будем брати, тим швидше буде рости її значення, тому для правильної пропорції беремо корінь
тепер все працює з ювелірною точністю)