Вы не указываете точную функцию, которую используете, но похоже, что это что-то вроде:
z = a * sin(b * x) * sin(b * y)
Я пройдусь по процессу, чтобы вы могли применить рецепт, даже если ваша функция выглядит немного иначе. Кроме того, если ваша волна не относится к плоскости xy, вы все равно можете использовать тот же расчет, а затем применить необходимую матрицу преобразования к полученной нормали.
Здесь у нас есть параметрическая поверхность, где 3 координаты точки плоскости вычисляются из двух параметров. В данном случае это параметры x
и y
, а вектор, описывающий каждую точку:
[ x ]
v(x, y) = [ y ]
[ a * sin(b * x) * sin(b * y) ]
Описанный здесь процесс работает для любой параметрической поверхности, включая обычные геометрические формы. Например, для тора двумя параметрами будут два угла. Математические инструменты, необходимые для расчета, включают базовый анализ (производные) и некоторую векторную геометрию (перекрестное произведение).
В качестве первого шага мы вычисляем вектор градиента для каждого из двух параметров. Эти векторы градиента состоят из частных производных каждой компоненты вектора с соответствующим параметром. В примере результаты следующие:
[ 1 ]
dv(x, y)/dx = [ 0 ]
[ a * b * cos(b * x) * sin(b * y) ]
[ 0 ]
dv(x, y)/dy = [ 1 ]
[ a * b * sin(b * x) * cos(b * y) ]
Вектор нормали рассчитывается как перекрестное произведение этих двух векторов градиента:
[ - a * b * cos(b * x) * sin(b * y) ]
vn = [ - a * b * sin(b * x) * cos(b * y) ]
[ 1 ]
Затем вы нормализуете этот вектор, и vn / |vn|
будет вашим вектором нормали.
person
Reto Koradi
schedule
12.06.2014