Я не уверен, получил ли я ваши объяснения, но здесь я go.
У вас есть сфера с волнистой поверхностью. Это означает, что каждая точка на поверхности изменяет свое расстояние до центра сферы, как кусок дерева на волне в море меняет расстояние до морского дна в этом месте.
Мы можем сказать, что радиус R
сферы меняется в каждый момент времени.
Теперь у вас есть трактикоид (что такое трактитоид?). Я приму это как некий объект, плывущий по волне и следящий за движением сферы.
Тогда, кажется, вы спрашиваете, как заставить трактикоид следовать как волнистой поверхности, так и движению сферы.
Хорошо. Если мы определяем каждое движение («преобразование») матрицей 4x4, все сводится к объединению в правильном порядке этих матриц.
Есть несколько хороших руководств по OpenGL, которые научат вас преобразованиям и их сочетанию. См., Например, Learnopengl.com .
В вашем случае можно использовать несколько преобразований.
Сфера вращается. Вам нужна матрица вращения, назовем ее MSR
(вращение сферы матрицы) и ось вращения ASR
. Если сфера также перемещается, то также требуется MST
.
Поверхностные волны с некоторой функцией f(lat, long, time)
, которая вычисляет для этих параметров приращение (знак) радиуса. Итак, Ri = R + f(la,lo,ti)
Для трактикоида, я думаю, у вас есть несколько треугольников, которые определяют трактикоид. Я также предполагаю, что эти треугольники выражены в «локальной» системе координат, начало которой лежит в центре трактикоида. Проблема возникает, когда вам нужно расположить и повернуть трактикоид, верно?
У вас есть два варианта. Первый - повернуть трактикоид так, чтобы он был направлен перпендикулярно сфере, а затем переместил его, чтобы следовать за вращением сферы. Хотя этот вариант идеален с математической точки зрения, я считаю этот вариант сложным.
Лучший вариант - заставить трактикоид вращаться и сдвигаться точно так же, как и сфера, как если бы оба они имели одно и то же начало - центр сферы. А затем переведите его в текущее положение.
Первая часть довольно проста: матрица, определяющая такое преобразование, - M= MST * MSR
, если вы используете типичное соглашение об осях OpenGL, в противном случае вам нужно поменять их порядок. Это M
является общей частью для всех объектов (сфера и трактикоиды).
Вторая часть требует, чтобы у вас был вектор Vn
, который определяет точку на поверхности, связанную с центром сферы. Вы должны быть в состоянии вычислить его с параметрами широты, долготы и R
, полученными с помощью f()
выше, плюс размер / 2 трактикоида (расстояние от его центра до точки, где он касается волны). Используйте компоненты Vn
, чтобы построить матрицу трансляции MTT
А теперь просто заставьте полученное преобразование использовать с каждой вершиной трактикоида: Mt = MTT * M = MTT * MST * MSR
Для рендеринга сцены вам понадобятся две другие матрицы: для камеры (MV
) и для проекции (MP
). В то время как Mt
соответствует каждому трактикоиду, MV
и MP
одинаковы для всех объектов, включая саму сферу.