Sunday, December 11, 2016

фейковые отражения в cycles

во так можно повесить фейковые отражения на объект, Mirror ball например.

Tuesday, December 6, 2016

что они там курят?

убил полдня пытаясь понять как работают трансформы в блендере в иерархии.
пришёл к выводу что есть какой то _сука_ скрытый трансформ нод, задействующийся при парентовании через ctrl+p, и трансформации на самом деле идут в его координатах а не в координатах парента, как это сделано во всех остальных пакетах. вот спрашивается НАХРЕНА? нигде толком не написано как работает трансформ в блендере, только полинтернета завалено вопросами пользователей что за хрень происходит. Вот кто ообъяснит что делает команда clear origin (alt+o)? можно было бы подумать что он скидывает этот скрытый нод в нули, но он влияет только на положение но не поворот и масштаб.... пока решение такое, забыть про ctrl+p и парентить через вкладку object (все трансформы становятся в координатах парента) или shift+ctrl+p (как предыдущее, только локейшн в ноль скидывается). карл!!!! а почему только локейшн скидывается?


- парент через вкладку object - просто тупо начинает считать координаты в системе парента, объект прыгает в новое положение
- ctrl+shift+p - make parent without inverse - двигает объект в начало координат сохранив поворот и масштаб и дальше пересчитывает всё в координаты парента, то есть объект прыгает  к паренту, видимо для того чтобы просто объект не потерялся на экране.
- ctrl+p>object - обычный парент, объект остаётся на своём месте, причём его координаты не меняются и если парент повёрнут, то всё, хана, анимировать чтото в координатах парента не получится. дурдом. судя по всему оно создаёт ещё один нод, такой же как текущий трнасформ чайлда, и вот его уже привязывает к паренту, и добраться до этого скрытого нода нет никакой возможности ровно как и анимировать в координатах парента. и нод этот похоже создаётся в нулях и поэтому не меняются координаты чайлда.
- alt+p > clear parent - обычная отвязка парента - вышеупомянутый скрытый нод ставится в нули, теряются трансформы от парента, чайлд прыгает в своё начальное место до привязки и трасформации вместе с парентом. координаты у чайлда всегда одни и те же.
- alt+p > clear and keep transformation - чайл сохраняет своё положение после отвязки, его координаты изменяются. то есть удаляется скрытый нод, а реальные трансформы чайлда пересчитываются.
- alt+p > clear parent inverse - удаляет скрытый нод (или всё же выравнивает его по паренту?), получается такой же результат как и при привязке через обджект панель, то есть объект прыгает.
- alt+o - clear origin - двигает чайлд к паренту, не влияя ни на поворот ни на масштаб, видимо сдвигая скрытый нод так чтобы чайл оказался у парента.

снос башки. всё ещё непонятно весь трансформ задействован или только локейшн во всех этих прыжках.

из этого следует что невозможно припарентить объект к паренту который повёрнут сохранив положение чайлда до привязки и имея координаты парента для анимации. можно только либо сохранить чайлда на месте, либо иметь правильные координаты парента. при условии отсутсвия нормального инструмента для align объектов в блендере, эта хрень может быть проблемой, требуя более тщательного планирования иерархии, особенно для анимации.

не могу понять нафига нужно было вводить этот дополнительный нод. почему нельзя пересчитывать координаты в парента как это делают вариации с keep transform (и как это делает 3дсмакс например) только для того чтобы иметь возможность вернуть объект в своё место после отвязки от парента? или скорее чтобы не пересчитывать анимационные кривые (!) (как это делает макс)? что ж, где-то логичное решение.

Friday, April 22, 2016

типс энд трикс

немного не про скрипты, но...
так сказать из мелких, но важных полезностей.
не могу понять, почему до сих пор эта фича не включена по умолчанию. сколько лет прошло, а эта фишка тянется чуть ли не с первого блендера. а не включив release confirms вы никогда не получите большой скорости в моделировании, ибо придётся кликать в два раза чаще.

Sunday, September 13, 2015

как в суслике разблурить текстуру

cycles, blender, texture blur filter
в суслике нет простейшей и приввычной фичи как фильтрация текстуры, но это дело можно сэмулировать.путём изменения UV. см картинку. очень мелкий цветной шум оверлеится на ув данные свигая их случайным образом, в результате получается размытие.

Monday, October 20, 2014

Bevel shader

есть очень классная штука - рендерит углы не острыми а сглаженными, то есть геометрия остаётся с острыми углами а на рендере они сглажены - очень добавляет реализма. в максе был для этого плагин fedge, в менталрее есть тоже встроенное дело под эту задачу. а в блендере нету.... :( но народ пораскинул мозгами и родил вот что, жаль пока OSL на GPU не работает, но будем надеяться.

http://blenderartists.org/forum/showthread.php?329295-Bevel-shader


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

void rng_seed(output int rng, int seed)
{
  int chash = seed;
  if (chash == 0) chash = 1;
  rng = chash * 30391861;
}

float rng_uniform(output int rng)
{
  float res = rng / float(2137483647) * 0.5 + 0.5;
  rng *= 30391861;
  return res;
}

void to_unit_disk(float x, float y, output float x_out, output float y_out)
{
  float r, phi;
  float a = 2.0 * x - 1.0;
  float b = 2.0 * y - 1.0;
    
  if(a > -b) 
  { if(a > b) 
    { r = a;
      phi = M_PI_4 *(b/a);
    }
    else 
    { r = b;
      phi = M_PI_4 *(2.0 - a/b);
  } }
  else 
  { if(a < b) 
    { r = -a;
      phi = M_PI_4 *(4.0 + b/a);
    }
    else 
    { r = -b;
      if(b != 0.0) phi = M_PI_4 *(6.0 - a/b);
      else phi = 0.0;
  } }
  x_out = r * cos(phi);
  y_out = r * sin(phi);
}

void make_orthonormals(vector N, output vector a, output vector b)
{
  if(N[0] != N[1] || N[0] != N[2]) a = cross(vector(1, 1, 1), N);
  else a = cross(vector(-1, 1, 1), N);
  
  a = normalize(a);
  b = cross(N, a);
}

vector sample_cos_hemisphere(vector N, float randu, float randv)
{
  vector T, B;
    
  make_orthonormals(N, T, B);
  to_unit_disk(randu, randv, randu, randv);
  float costheta = sqrt(max(1.0 - randu * randu - randv * randv, 0.0));

  return randu * T + randv * B + costheta * N;
}

shader edge_smooth(
  int Concave = 1,
  int Convex = 1,
  int Samples = 4,
  int Backfacing = 1,
  float Mask = 1,
  float Distance = 0.1,
  normal Normal = N,
  output normal outNormal = 0
)
{
  int i, rng;
  float f, randu, randv, ray_t, hits = 0;
  vector ray_P, ray_R;
  normal hit_normal = N;
  outNormal = Normal;
  float hit_dist;
  float normal_blend;
  float s_weight = 1/Samples;

  f = fmod(cellnoise(P*123456.0), 1.0);
  rng_seed(rng, int(f * 21374647));

    if (Mask > 0.5 && raytype("camera")) {
      for(i = 0; i < Samples; i++) { 
            randu = rng_uniform(rng);
            randv = rng_uniform(rng);
           
            ray_P = P;
            ray_R = sample_cos_hemisphere(-N, randu, randv); 
            ray_t = Distance;

                
            if (Concave == 1)
            { if(trace(ray_P, -ray_R, "maxdist", ray_t)) {
                    getmessage ("trace", "N", hit_normal);
                    getmessage ("trace", "hitdist", hit_dist);
                    normal_blend = 1-(hit_dist/Distance);
                    outNormal = Normal + (hit_normal*normal_blend);
                    break;
                }
            }
            if (Convex == 1) {
                if(trace(ray_P, ray_R, "maxdist", ray_t)) {
                    getmessage ("trace", "N", hit_normal);
                    getmessage ("trace", "hitdist", hit_dist);
                    normal_blend = 1-(hit_dist/Distance);
                    if (Backfacing==1 || dot(I, -hit_normal) > 0.0) {
                        outNormal = Normal - (hit_normal*normal_blend);
                    }
                    break;
                }
            }
      }
    }
  outNormal = normalize(outNormal);
}

Wednesday, July 2, 2014

2.71

косяков пока не замечено

как отрендерить сусликом один фрейм на рендерферме

мозги у блендерхедов соображают....
у блендера шикарный родной нет рендер, но он не умеет рендерить один фрейм. но это не беда. по природе cycles можно рендерить картинки с большим уровнем шума на разных компах и потом эти картинки смержить в одну хитрым образом. и оно таки работает! нужно только каждую картинку рендерить с новым значением seed в параметрах sampling. то есть:
- анимируем этот параметр
- закидываем в нетрендер
- получаем кучу картинок.
дальше самое интересное. никто так и не написал аддон к блендеру который бы собирал эти картинки в одну. были попытки, но вроде бы не совсем ровные. решение - нужно установить консольную программу Image magick, которая умеет мержить картинки. и запускать её в таком режиме.

convert "path/to/images/*.png" -evaluate-sequence mean "path/to/images/merged_image.png"

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

аддон для этого дела (не отменяет необходимость имажемажик)
http://adaptivesamples.com/2013/07/22/progressive-animation-render-addon-and-image-stacking/