Логика в основном та же, но, как показано на выделенной строке, мы возвращаем вектор, который зависит от позиции. Тем не менее, из-за операции
Результаты показывают произвольный узор из треугольников, которые следуют за большими корреляциями шума оставляя каждый индивидуальный треугольник с однородным цветом. Образец справа имеет больший размер шума в использованной текстуре cloud:
Возможная настройка нодов показана на следующем скриншоте:
Текстура может иметь больше, чем просто геометрический вход. Если Вам нужна текстура, изменяющая свое поведение в зависимости от другой текстуры, этого не получится достигнуть простой настройкой нодов, которую Вы можете обеспечить дополнительными входными сокетами. Мы разработаем Pynode, генерирующий карту нормалей, которая имитирует небольшие пятна всплесков (wavelets) в пруду во время почти безветренного дня.
Места, где эти пятна появляются, определяются дополнительным входным сокетом, который может быть связан с почти любой текстурой шума. Мы дадим этому входному сокету имя
Длина волн ряби управляется еще одним входом с названием
Четвертый и последний вход, называемый
Окончательная настройка нодов, которая объединяет все это, показана на скриншоте редактора нодов:
Скрипт для нода прост; после нескольких необходимых операций импорта мы определим многочисленные входные сокеты и наш единственный выходной сокет.
from Blender import Node
from math import cos
from Blender.Mathutils import Vector as vec
class Ripples(Node.Scripted):
def __init__(self, sockets):
sockets.input = [
Node.Socket('amplitude' , val= 1.0,
min = 0.001, max = 1.0),
Node.Socket('wavelength', val= 1.0,
min = 0.01, max = 1000.0),
Node.Socket('direction' , val= [1.0,0.0,0.0]),
Node.Socket('Coords' , val= 3*[1.0])]
sockets.output = [Node.Socket('Normal',
val = [0.0,0.0,1.0])]
def __call__(self):
norm = vec(0.0,0.0,1.0)
p = vec(self.input.Coords)
d = vec(self.input.direction)
x = p.dot(d)*self.input.wavelength
norm.x=-self.input.amplitude*cos(x)
n = norm.normalize()
self.output.Normal = n*.01
__node__ = Ripples
Снова, вся реальная работа выполняется в функции
Затем, проекция умножается на длину волны. Если бы мы вычислили синус, у нас была бы высота нашей волны. Но нас, тем не менее, интересует не высота, а нормаль. Нормаль всегда направлена вверх и перемещается вместе с нашей сунусоидальной волной (смотри следующую диаграмму). Можно показать, что эта нормаль - вектор с z-компонентой 1.0 и x-компонентой, равной отрицательной производной функции синуса, то есть, минус косинус. Скрипт (