Вы должны быть осторожны, потому что нормали не обязательно преобразуются, как точки, а расстояние - это перпендикулярное расстояние до начала координат, поэтому вам нужно вычислить d'= d + n.v
. Если все, что вы делаете, это перемещение и вращение, то вы можете повернуть нормаль и вычислить новое перпендикулярное расстояние. Но если вы по-разному масштабируете свои оси или делаете общее проективное преобразование, то вам нужно относиться к вещам по-другому.
Способ, который работает для всего, состоит в том, чтобы использовать однородные координаты, поэтому все ваши преобразования - это матрицы 4x4, а ваши точки и ваши плоскости - это 4-векторы:
point p=(x,y,z) -> homogeneous (x,y,z,1), equiv. to (x*W, y*W, z*W, W)
plane q=[n=(a,b,c), d] -> homogeneous [a,b,c,d], equiv. to [a*K, b*K, c*K, d*K)
-> point p is on plane q iff: p.q=0 (using homogeneous coords, as above)
Как правило, вы умножаете все свои матрицы преобразования в одну матрицу 4x4 T и используете эту матрицу в каждой точке, чтобы определить ее окончательное преобразованное положение. Хитрость в том, что вам нужно использовать обратное транспонирование из T для преобразования координат вашей плоскости. Из следующего видно, что это сохраняет частоту между точками и плоскостями:
point p' = T p
plane q' = (T^-1)^t q
-> point p' is on plane q' when: p'.q'=0
then, note: p'.q' = p^t T^t (T^-1)^t q = p^t q = p.q
so: p'.q'=0 whenever p.q=0