Transforming implicit surface (distance field) and their gradient

Image loading…

$ \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


 
Donate

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: