Transforming implicit surface (distance field) and their gradient

\( \renewcommand{\vec}[1]{ \mathbf{#1} }  \)
Let \( f:\mathbb R^3 \rightarrow\mathbb R\) be any distance field. We can transform any implicit surface \( f(x,y,z) = c\) with a 4x4 transformation matrix as follows:

$$ \hat f(\vec p) = f( \mathbf T^{-1} \vec p)$$

Gradient

Sometimes you need to compute the normal of an implicit surface. You usually do this using the gradient \(\nabla f\) which needs to be transformed as well. Similar to the normal of a mesh use the inverse transpose of \( \mathbf T \):

$$ \hat{ \nabla f}(\vec p) = \left ( \mathbf T^{-1} \right )^{T} . \nabla f (  \mathbf T^{-1}  \vec p )$$

Code

float transformed_value_and_gradient(Point pos, Vec3& grad)
{
    Point p = T.inverse() * pos;
    float field_values = distance_field(p, grad); // original field function value
    grad = T.inverse().transpose() * grad;
    return field_values;
}

Special transformations

Special space transformations such as bending, twisting, warping, wobbling, duplicating, mirroring are also possible and discussed at length in other articles

No comments

(optional field, I won't disclose or spam but it's necessary to notify you if I respond to your comment)
All html tags except <b> and <i> will be removed from your comment. You can make links by just typing the url or mail-address.
Anti-spam question: