Category: литература

korchy

Shadow catcher в EEVEE

В рендер-движке Cycles есть удобная возможность отрендерить объект с тенью на прозрачном фоне с помощью материала с функцией рендера только падающих на него теней "shadow catcher". В рендер-движке EEVEE такой функции у материалов нет. Однако в EEVEE можно собрать свой "shadow catcher" на основе нодов.
Готовый материал "EEVEE Shadow Catcher" можно скачать в библиотеке BIS.




Читать дальше: https://b3d.interplanety.org/shadow-catcher-v-eevee/
korchy

Как превратить одиночный элемент BIS в паттерн

Одиночный процедурный элемент из библиотеки BIS можно легко превратить в равномерный повторяющийся паттерн.
Для примера загрузим из библиотеки круговой элемент и разместим его по центру объекта.





Читать дальше: https://b3d.interplanety.org/kak-prevratit-odinochnyy-element-bis-v-pattern/
korchy

Преобразование карты нормалей между форматами OpenGl и DirectX

В настоящее время карты нормалей обычно сохраняются в одном двух наиболее распространенных форматов: OpenGl или DirectX. Blender использует формат OpenGl. Если карта нормалей сохранена в ином формате, результаты отображения нормалей будут неправильные. Для того, чтобы сконвертировать формат карты нормалей можно воспользоваться нодовой группой "OpenGL - DirectX Normal Map Converter" из библиотеки материалов BIS:



Результаты работы конвертера:





Читать дальше: https://b3d.interplanety.org/preobrazovanie-karty-normaley-mezhdu-formatami-opengl-i-directx/
korchy

BIS — Онлайн библиотека материалов для Blender v.1.0.0. - Релиз!




Релиз аддона BIS для 3D-редактора Blender.

- Приведена в порядок серверная часть хранилища.
- Сделано собственно внешнее и внутреннее оформление сайта BIS: https://bis.interplanety.ru/
- Исправлен и покорректирован код самого аддона.
- Обновлена страничка с описанием BIS: https://b3d.interplanety.ru/bis/
- Вычещен ряд мелких багов и ошибок в работе аддона.


Читать дальше
korchy

Встраивание шрифта в Adobe Flash CS

В последних версиях Flash-плеера Adobe внес какие-то изменения в отображение системных шрифтов, в следствие которых, шрифтом по-умолчанию стал Arial (до этого был Times). Это бы еще ничего, но для системных шрифтов теперь постоянно включен режим сглаживания, из-за которого текст небольшой высоты (10-12) выглядит сильно смазанным.
Добиться приемлемой четкости шрифта через AntiAliasType.ADVANCED мне не удалось. Поэтому выход остался один - встроить шрифт в flash-приложение.
Проинспектировав "гугл" на предмет встраивания шрифтов, можно получить множество ссылок на встраивание шрифтов и абсолютно во всех это предлагается делать посредством [EMBED ...]
Помучавшись некоторое время, я убедился, что в Adobe Flash этот метод не работает и директива [EMBED] им преспокойно игнорируется. Выходит, этот метод подходит для Flex-разработчиков,но никак не годится для работающих в Adobe Flash.

Collapse )
korchy

Вращение спрайта вокруг произвольной точки

Собственно классическое решение задачи поворота спрайта на заданный угол вокруг произвольной точки (чаще всего его центра) путем матричных преобразований описана в куче литературы и интернет-источниках и звучит следующим образом: перенос спрайта таким образом, чтобы точка совпадал с точкой 0.0,0.0 , поворот на заданный угол, перенос обратно.
Функция RotateAroundAxis представляет реализацию данного метода (Axis - ось или точка, вокруг которой будет повернут спрайт, Angle - угол поворота):

private function RotateAroundAxis(Axis:Vector2,Angle:Number):void {
      // Перенос в 0,0,0
      var MoveVector:Vector2 = new Vector2();
      Vector2.Vec2Subtract(Axis,new Vector2(0.0,0.0),MoveVector);
      var matrix:Matrix = new Matrix();
      matrix.identity();
      matrix.translate(MoveVector.x,MoveVector.y);
      CountWorldMatrix(matrix);
      // Поворот
      var RotAngle:Number = Angle*Math.PI/180.0;
      // Получить матрицу вращения
      var Rot:Matrix = new Matrix();
      Rot.identity();
      Rot.rotate(RotAngle);
      CountWorldMatrix(Rot);
      // Вернутся обратно
      matrix.identity();
      matrix.translate(Axis.x,Axis.y);
      CountWorldMatrix(matrix);
}

Вспомогательная функция CountWorldMatrix добавляет полученную матрицу трансформации к исходной матрице объекта, за счет чего и выполняется поворот:

private function CountWorldMatrix(M:Matrix):void {
      var w:Matrix = transform.matrix;
      if(M!=null) w.concat(M);
      transform.matrix = w;
}

При вызове функции RotateAroundAxis необходимо, чтобы координаты оси были заданны в той же самой системе координат, в которой находится сам поворачиваемый спрайт. Если не соблюдать это правило спрайт будет поворачиваться и убегать куда угодно, только не в ту точку, в которую его необходимо было поместить. Чаще же всего поворачивать спрайт удобнее всего вокруг точки, заданной в системе координат сцены, т.е. того контейнера в котором собираются все отображаемые спрайты. Поэтому, чтобы повернуть спрайт например вокруг центра экрана, сначала необходимо width/2 и height/2 перевести в систему координат спрайта.
Для этих целей служит функция globalToLocal, которая собственно умножает переданную в нее точку на обратную concatenated-матрицу объекта из которого вызывается. Однако же на практике ее использование оказалось достаточно своеобразным. Когда спрайт является чайлдом сцены - globalToLocal срабатывает правильно. Стоит же создать иерархию из 2-3 подчиненных уровней сцена -спрайт - чайлд спрайта - ... начинаются нестыковки. В случаях, если спрайт сначала повернуть, после чего добавить ему чайлда и если к спрайту добавить уже повернутого чайлда, функция срабатывает далеко не так, как нужно. Поэтому функцию приходится переопределять (заодно переопределяется тип входного параметра на Vector2 - переопределенный Point со статическими методами операций над двумерными векторами):

internal function GlobalToLocal(Vector:Vector2):Vector2 {
      var TransformedVector:Vector2 = new Vector2(Vector.x,Vector.y);
      var P:Point = globalToLocal(Point(TransformedVector));
      if(parent!=null) P = parent.globalToLocal(Point(TransformedVector));
      TransformedVector.x = P.x;
      TransformedVector.y = P.y;
      return TransformedVector;
}

Соответственно, делаем обертку над вызовом функции RotateAroundAxis:

internal function RotateAround(Axis:Vector2,Angle:Number):Boolean {
      var TransformedAxis:Vector2 = GlobalToLocal(Axis);
      return RotateAroundAxis(TransformedAxis,Angle);
}

Такое переопределение позволяет правильно вращать спрайт вокруг произвольной оси независимо от того, является он чьим-то чайлдом или нет.
Вращение спрайта вокруг центра сцены на 45 градусов будет выглядеть следующим образом:

RotateAround(new Vector2(width/2,height/2),45);