ELSE {
n0: Triple ← [poly.plane.x, poly.plane.y, poly.plane.z];
n1: Triple ← [next.poly.plane.x, next.poly.plane.y, next.poly.plane.z];
axis: Triple ← G3dVector.Cross[n1, n0];
angle: REAL ← G3dVector.AngleBetween[n1, n0];
mat: G3dBasic.Matrix ← G3dMatrix.ObtainMatrix[];
mat ← G3dMatrix.MakeRotate[axis, angle,,, mat];
direction ← G3dMatrix.TransformVec[direction, mat];
G3dMatrix.ReleaseMatrix[mat];
RETURN[MoveOnPolygon[next, direction, distance]];
};