/****************************************************************************** * Aligns the current viewing direction to the slicing plane. ******************************************************************************/ void SliceModifierEditor::onAlignViewToPlane() { TimeInterval interval; Viewport* vp = dataset()->viewportConfig()->activeViewport(); if(!vp) return; // Get the object to world transformation for the currently selected object. ObjectNode* node = dynamic_object_cast<ObjectNode>(dataset()->selection()->front()); if(!node) return; const AffineTransformation& nodeTM = node->getWorldTransform(dataset()->animationSettings()->time(), interval); // Transform the current slicing plane to the world coordinate system. SliceModifier* mod = static_object_cast<SliceModifier>(editObject()); if(!mod) return; Plane3 planeLocal = mod->slicingPlane(dataset()->animationSettings()->time(), interval); Plane3 planeWorld = nodeTM * planeLocal; // Calculate the intersection point of the current viewing direction with the current slicing plane. Ray3 viewportRay(vp->cameraPosition(), vp->cameraDirection()); FloatType t = planeWorld.intersectionT(viewportRay); Point3 intersectionPoint; if(t != FLOATTYPE_MAX) intersectionPoint = viewportRay.point(t); else intersectionPoint = Point3::Origin() + nodeTM.translation(); if(vp->isPerspectiveProjection()) { FloatType distance = (vp->cameraPosition() - intersectionPoint).length(); vp->setViewType(Viewport::VIEW_PERSPECTIVE); vp->setCameraDirection(-planeWorld.normal); vp->setCameraPosition(intersectionPoint + planeWorld.normal * distance); } else { vp->setViewType(Viewport::VIEW_ORTHO); vp->setCameraDirection(-planeWorld.normal); } vp->zoomToSelectionExtents(); }
/****************************************************************************** * Computes the intersection lines of a plane and a quad. ******************************************************************************/ void SliceModifier::planeQuadIntersection(const Point3 corners[8], const std::array<int,4>& quadVerts, const Plane3& plane, QVector<Point3>& vertices) const { Point3 p1; bool hasP1 = false; for(int i = 0; i < 4; i++) { Ray3 edge(corners[quadVerts[i]], corners[quadVerts[(i+1)%4]]); FloatType t = plane.intersectionT(edge, FLOATTYPE_EPSILON); if(t < 0 || t > 1) continue; if(!hasP1) { p1 = edge.point(t); hasP1 = true; } else { Point3 p2 = edge.point(t); if(!p2.equals(p1)) { vertices.push_back(p1); vertices.push_back(p2); return; } } } }