function findNodes(motionController, scene) {

    // Loop through the components and find the nodes needed for each components' visual responses
    Object.values(motionController.components).forEach((component) => {

        const {type, touchPointNodeName, visualResponses} = component;

        if (type === MotionControllerConstants.ComponentType.TOUCHPAD) {

            component.touchPointNode = scene.getObjectByName(touchPointNodeName);
            if (component.touchPointNode) {

                // Attach a touch dot to the touchpad.
                const sphereGeometry = new THREE.SphereGeometry(0.001);
                const material = new THREE.MeshBasicMaterial({color: 0x0000FF});
                const sphere = new THREE.Mesh(sphereGeometry, material);
                component.touchPointNode.add(sphere);

            } else {

                console.warn(`Could not find touch dot, ${component.touchPointNodeName}, in touchpad component ${component.id}`);

            }

        }

        // Loop through all the visual responses to be applied to this component
        Object.values(visualResponses).forEach((visualResponse) => {

            const {valueNodeName, minNodeName, maxNodeName, valueNodeProperty} = visualResponse;

            // If animating a transform, find the two nodes to be interpolated between.
            if (valueNodeProperty === MotionControllerConstants.VisualResponseProperty.TRANSFORM) {

                visualResponse.minNode = scene.getObjectByName(minNodeName);
                visualResponse.maxNode = scene.getObjectByName(maxNodeName);

                // If the extents cannot be found, skip this animation
                if (!visualResponse.minNode) {

                    console.warn(`Could not find ${minNodeName} in the model`);
                    return;

                }

                if (!visualResponse.maxNode) {

                    console.warn(`Could not find ${maxNodeName} in the model`);
                    return;

                }

            }

            // If the target node cannot be found, skip this animation
            visualResponse.valueNode = scene.getObjectByName(valueNodeName);
            if (!visualResponse.valueNode) {

                console.warn(`Could not find ${valueNodeName} in the model`);

            }

        });

    });

}
Walks the model's tree to find the nodes needed to animate the components and
saves them to the motionContoller components for use in the frame loop. When
touchpads are found, attaches a touch dot to them.