public ArrowGraphic(double radius, double length, Color color) { TextureColorPalette1D colorPalette = new TextureColorPalette1D(); colorPalette.setHueBased(1.0, 1.0); JavaFXMultiColorMeshBuilder meshBuilder = new JavaFXMultiColorMeshBuilder(colorPalette); double coneHeight = 0.10 * length; double coneRadius = 1.5 * radius; meshBuilder.addCylinder(length, radius, new Point3D(), new AxisAngle(0.0, 1.0, 0.0, Math.PI / 2.0), color); meshBuilder.addCone(coneHeight, coneRadius, new Point3D(length, 0.0, 0.0), new AxisAngle(0.0, 1.0, 0.0, Math.PI / 2.0), color); this.arrow = new MeshView(meshBuilder.generateMesh()); arrow.setMaterial(meshBuilder.generateMaterial()); getChildren().add(arrow); }
/** * Add a 3D line with a color gradient to this builder. * @param x0 x-coordinate of the line start. * @param y0 y-coordinate of the line start. * @param z0 z-coordinate of the line start. * @param xf x-coordinate of the line end. * @param yf y-coordinate of the line end. * @param zf z-coordinate of the line end. * @param lineWidth width of the line. * @param startColor color at the line start. Color accuracy depends on the color palette in use. * @param endColor color at the line end. Color accuracy depends on the color palette in use. */ public void addLine(double x0, double y0, double z0, double xf, double yf, double zf, double lineWidth, Color startColor, Color endColor) { addLine((float) x0, (float) y0, (float) z0, (float) xf, (float) yf, (float) zf, (float) lineWidth, startColor, endColor); }
/** * Add a cone to this builder. Its axis is aligned with the z-axis and its top is the vertex with the highest z value. * @param height height along z of the cone. * @param radius radius of the cone's base. * @param offset coordinate of the cone's base center. Not modified. * @param color color of the cone. Color accuracy depends on the color palette in use. */ public void addCone(double height, double radius, Tuple3DReadOnly offset, Color color) { addMesh(MeshDataGenerator.Cone(height, radius, DEFAULT_RES), offset, color); }
private void processBodyPath(List<? extends Point3DReadOnly> bodyPath) { if (bodyPath == null || bodyPath.isEmpty()) { bodyPathMeshToRender.set(new Pair<>(null, null)); activeBodyPathReference.set(null); if (VERBOSE) PrintTools.warn("Received body path that is null."); return; } // First let's make a deep copy for later usage. bodyPath = bodyPath.stream().map(Point3D::new).collect(Collectors.toList()); if (VERBOSE) PrintTools.info(this, "Building mesh for body path."); double totalPathLength = PathTools.computePathLength(bodyPath); double currentLength = 0.0; palette.clearPalette(); JavaFXMultiColorMeshBuilder meshBuilder = new JavaFXMultiColorMeshBuilder(palette); for (int segmentIndex = 0; segmentIndex < bodyPath.size() - 1; segmentIndex++) { Point3DReadOnly lineStart = bodyPath.get(segmentIndex); Point3DReadOnly lineEnd = bodyPath.get(segmentIndex + 1); double lineStartHue = EuclidCoreTools.interpolate(startColorHue, goalColorHue, currentLength / totalPathLength); currentLength += lineStart.distance(lineEnd); double lineEndHue = EuclidCoreTools.interpolate(startColorHue, goalColorHue, currentLength / totalPathLength); meshBuilder.addLine(lineStart, lineEnd, BODYPATH_LINE_THICKNESS, Color.hsb(lineStartHue, 1.0, 0.5), Color.hsb(lineEndHue, 1.0, 1.0)); } bodyPathMeshToRender.set(new Pair<>(meshBuilder.generateMesh(), meshBuilder.generateMaterial())); activeBodyPathReference.set(bodyPath); }
private Pair<Mesh, Material> generateMeshAndMaterial(PlanarRegionsListMessage newMessage) { meshBuilder.clear(); double lineWidth = 0.01; RigidBodyTransform transformToWorld = new RigidBodyTransform(); PlanarRegionsList planarRegionsList = PlanarRegionMessageConverter.convertToPlanarRegionsList(newMessage); for (int regionIndex = 0; regionIndex < planarRegionsList.getNumberOfPlanarRegions(); regionIndex++) { PlanarRegion planarRegion = planarRegionsList.getPlanarRegion(regionIndex); int regionId = planarRegion.getRegionId(); Color regionColor = getRegionColor(regionId); planarRegion.getTransformToWorld(transformToWorld); meshBuilder.addMultiLine(transformToWorld, planarRegion.getConcaveHull(), lineWidth, regionColor, true); for (int polygonIndex = 0; polygonIndex < planarRegion.getNumberOfConvexPolygons(); polygonIndex++) { ConvexPolygon2D convexPolygon2d = planarRegion.getConvexPolygon(polygonIndex); regionColor = Color.hsb(regionColor.getHue(), 0.9, 0.5 + 0.5 * ((double) polygonIndex / (double) planarRegion.getNumberOfConvexPolygons())); meshBuilder.addPolygon(transformToWorld, convexPolygon2d, regionColor); } } Material material = meshBuilder.generateMaterial(); Mesh mesh = meshBuilder.generateMesh(); return new Pair<>(mesh, material); }
private void processOccupancyMapMessage(FootstepPlannerOccupancyMapMessage message) { palette.clearPalette(); JavaFXMultiColorMeshBuilder meshBuilder = new JavaFXMultiColorMeshBuilder(palette); Object<FootstepPlannerCellMessage> occupiedCells = message.getOccupiedCells(); for (int i = 0; i < occupiedCells.size(); i++) { FootstepPlannerCellMessage cell = occupiedCells.get(i); double x = cell.getXIndex() * FootstepNode.gridSizeXY; double y = cell.getYIndex() * FootstepNode.gridSizeXY; double z = getHeightAtPoint(x, y) + nodeOffsetZ; RigidBodyTransform transform = new RigidBodyTransform(); transform.setTranslation(x, y, z); if (cell.getNodeIsValid()) meshBuilder.addPolygon(transform, cellPolygon, validCellColor); else meshBuilder.addPolygon(transform, cellPolygon, rejectedCellColor); } footstepGraphToRender.set(new Pair<>(meshBuilder.generateMesh(), meshBuilder.generateMaterial())); }
private void computeScanMesh() { LidarScanMessage message = newMessageToRender.getAndSet(null); if (message == null) return; Point3f scanPoint = new Point3f(); scanMeshBuilder.clear(); for (int i = 0; i < message.getNumberOfScanPoints(); i++) { double alpha = i / (double) message.getNumberOfScanPoints(); Color color = Color.hsb(alpha * 240.0, 1.0, 1.0); message.getScanPoint(i, scanPoint); scanMeshBuilder.addMesh(MeshDataGenerator.Tetrahedron(SCAN_POINT_SIZE), scanPoint, color); } MeshView scanMeshView = new MeshView(scanMeshBuilder.generateMesh()); scanMeshView.setMaterial(scanMeshBuilder.generateMaterial()); scanMeshToRender.set(scanMeshView); scanMeshBuilder.clear(); }
private UIOcTreeNodeMeshView createSubTreeMeshView(UIOcTreeNode subTreeRoot) { meshBuilder.clear(); Iterable<UIOcTreeNode> iterable = createLeafIterable(subTreeRoot, treeDepthForDisplay.getValue()); for (UIOcTreeNode node : iterable) { if (!node.isPartOfRegion() || !hidePlanarRegionNodes.getValue()) addNodeMesh(meshBuilder, displayType.getValue(), coloringType.getValue(), node); } OcTreeKey rootKey = subTreeRoot.getKeyCopy(); Mesh mesh = meshBuilder.generateMesh(); Material material = meshBuilder.generateMaterial(); UIOcTreeNodeMeshView meshView = new UIOcTreeNodeMeshView(rootKey, mesh, material); meshBuilder.clear(); return meshView; }
JavaFXMultiColorMeshBuilder meshBuilder = new JavaFXMultiColorMeshBuilder(new TextureColorPalette2D()); MeshView meshView = new MeshView(meshBuilder.generateMesh()); meshView.setMaterial(meshBuilder.generateMaterial()); view3dFactory.addNodeToView(meshView);
public JavaFXPlanarRegionsViewer() { TextureColorPalette2D colorPalette = new TextureColorPalette2D(); colorPalette.setHueBrightnessBased(0.9); meshBuilder = new JavaFXMultiColorMeshBuilder(colorPalette); renderer = new AnimationTimer() { @Override public void handle(long now) { render(); } }; }
@Override public void start(Stage primaryStage) throws Exception { View3DFactory view3dFactory = new View3DFactory(800, 600); view3dFactory.addCameraController(); view3dFactory.addWorldCoordinateSystem(0.3); MeshView meshView = new MeshView(); meshView.setMesh(colorMeshBuilder.generateMesh()); meshView.setMaterial(colorMeshBuilder.generateMaterial()); view3dFactory.addNodeToView(meshView); PhongMaterial material = new PhongMaterial(Color.DARKCYAN); // normalCylinder.setMaterial(material); // rootNode.getChildren().add(normalCylinder); material = new PhongMaterial(); material.setDiffuseColor(new Color(1.0, 1.0, 0.0, 0.0)); box.setMaterial(material); view3dFactory.addNodeToView(box); primaryStage.setScene(view3dFactory.getScene()); primaryStage.show(); }
private void addNodeMesh(JavaFXMultiColorMeshBuilder meshBuilder, DisplayType displayType, ColoringType coloringType, UIOcTreeNode node) { Color color = getNodeColor(coloringType, node); double size = node.getSize(); switch (displayType) { case CELL: meshBuilder.addCube(size, node.getX(), node.getY(), node.getZ(), color); break; case PLANE: if (node.isNormalSet()) meshBuilder.addMesh(createNormalBasedPlane(node), color); break; case HIT_LOCATION: if (node.isHitLocationSet()) { Point3D hitLocation = new Point3D(); node.getHitLocation(hitLocation); meshBuilder.addTetrahedron(0.0075, hitLocation, color); } break; default: throw new RuntimeException("Unexpected value for display type: " + displayType); } }
/** * Add a series of connected 2D lines to this builder. * @param transformToWorld the transform from the mult-line local coordinates to world. Not modified. * @param points coordinates of the line end points. Not modified. * @param lineWidth width of the lines. * @param color color of the multi-line. Color accuracy depends on the color palette in use. * @param close whether the end of the given array of points should be connected to the beginning or not. */ public void addMultiLine(RigidBodyTransform transformToWorld, Point2D[] points, double lineWidth, Color color, boolean close) { addMultiLine(transformToWorld, Arrays.asList(points), lineWidth, color, close); }
System.out.println(intersections); colorMeshBuilder.addPolyon(intersections, Color.DARKCYAN); for (int index = 0; index < intersections.size(); index++) colorMeshBuilder.addCube(0.01, intersections.get(index), Color.FIREBRICK); colorMeshBuilder.addCube(0.02, pointOnPlane, Color.SLATEGREY); box = new Box(lx, ly, lz); box.setTranslateX(cubeCenter.getX());
meshBuilder.addCube(0.05f, pointsOffset, color); Box box = new Box(0.025f, 0.025f, 0.025f); box.setTranslateX(pointsOffset.getX());
private void processBodyPath(List<Point3DReadOnly> bodyPath) { if (bodyPath == null || bodyPath.isEmpty()) { bodyPathMeshToRender.set(new Pair<>(null, null)); activeBodyPathReference.set(null); PrintTools.warn("Received body path that is null."); return; } // First let's make a deep copy for later usage. bodyPath = bodyPath.stream().map(Point3D::new).collect(Collectors.toList()); if (VERBOSE) PrintTools.info(this, "Building mesh for body path."); double totalPathLength = PathTools.computePathLength(bodyPath); double currentLength = 0.0; palette.clearPalette(); JavaFXMultiColorMeshBuilder meshBuilder = new JavaFXMultiColorMeshBuilder(palette); for (int segmentIndex = 0; segmentIndex < bodyPath.size() - 1; segmentIndex++) { Point3DReadOnly lineStart = bodyPath.get(segmentIndex); Point3DReadOnly lineEnd = bodyPath.get(segmentIndex + 1); double lineStartHue = EuclidCoreTools.interpolate(startColorHue, goalColorHue, currentLength / totalPathLength); currentLength += lineStart.distance(lineEnd); double lineEndHue = EuclidCoreTools.interpolate(startColorHue, goalColorHue, currentLength / totalPathLength); meshBuilder.addLine(lineStart, lineEnd, BODYPATH_LINE_THICKNESS, Color.hsb(lineStartHue, 1.0, 0.5), Color.hsb(lineEndHue, 1.0, 1.0)); } bodyPathMeshToRender.set(new Pair<>(meshBuilder.generateMesh(), meshBuilder.generateMaterial())); activeBodyPathReference.set(bodyPath); currentWalkerDistanceInPath.set(0.0); }
private Pair<Mesh, Material> generateMeshAndMaterial(PlanarRegionsListMessage newMessage) { meshBuilder.clear(); double lineWidth = 0.01; RigidBodyTransform transformToWorld = new RigidBodyTransform(); PlanarRegionsList planarRegionsList = PlanarRegionMessageConverter.convertToPlanarRegionsList(newMessage); for (int regionIndex = 0; regionIndex < planarRegionsList.getNumberOfPlanarRegions(); regionIndex++) { PlanarRegion planarRegion = planarRegionsList.getPlanarRegion(regionIndex); int regionId = planarRegion.getRegionId(); Color regionColor = getRegionColor(regionId); planarRegion.getTransformToWorld(transformToWorld); meshBuilder.addMultiLine(transformToWorld, planarRegion.getConcaveHull(), lineWidth, regionColor, true); for (int polygonIndex = 0; polygonIndex < planarRegion.getNumberOfConvexPolygons(); polygonIndex++) { ConvexPolygon2D convexPolygon2d = planarRegion.getConvexPolygon(polygonIndex); regionColor = Color.hsb(regionColor.getHue(), 0.9, 0.5 + 0.5 * ((double) polygonIndex / (double) planarRegion.getNumberOfConvexPolygons())); meshBuilder.addPolygon(transformToWorld, convexPolygon2d, regionColor); } } Material material = meshBuilder.generateMaterial(); Mesh mesh = meshBuilder.generateMesh(); return new Pair<>(mesh, material); }
private Node createConvexPolygonGraphics(PlanarRegion data) { List<ConvexPolygon2D> convexPolygons = new ArrayList<>(); for (int i = 0; i < data.getNumberOfConvexPolygons(); i++) convexPolygons.add(data.getConvexPolygon(i)); JavaFXMultiColorMeshBuilder meshBuilder = new JavaFXMultiColorMeshBuilder(new TextureColorAdaptivePalette(64)); int regionId = data.getRegionId(); RigidBodyTransform rigidBodyTransform = new RigidBodyTransform(); data.getTransformToWorld(rigidBodyTransform); Color regionColor = OcTreeMeshBuilder.getRegionColor(regionId); for (int i = 0; i < convexPolygons.size(); i++) { ConvexPolygon2D convexPolygon = convexPolygons.get(i); Color color = Color.hsb(regionColor.getHue(), 0.9, 0.5 + 0.5 * ((double) i / (double) convexPolygons.size())); meshBuilder.addPolygon(rigidBodyTransform, convexPolygon, color); } MeshView meshView = new MeshView(meshBuilder.generateMesh()); meshView.setMaterial(meshBuilder.generateMaterial()); return meshView; }
private void computeScanMesh() { LidarScanMessage message = newMessageToRender.getAndSet(null); if (message == null) return; Point3D32 scanPoint = new Point3D32(); scanMeshBuilder.clear(); int numberOfScanPoints = message.getScan().size() / 3; for (int i = 0; i < numberOfScanPoints; i++) { double alpha = i / (double) numberOfScanPoints; Color color = Color.hsb(alpha * 240.0, 1.0, 1.0); MessageTools.unpackScanPoint(message, i, scanPoint); scanMeshBuilder.addMesh(MeshDataGenerator.Tetrahedron(SCAN_POINT_SIZE), scanPoint, color); } MeshView scanMeshView = new MeshView(scanMeshBuilder.generateMesh()); scanMeshView.setMaterial(scanMeshBuilder.generateMaterial()); scanMeshToRender.set(scanMeshView); scanMeshBuilder.clear(); }
public LidarScanLogViewer() { JavaFXCoordinateSystem lidarFrame = new JavaFXCoordinateSystem(0.1); lidarFrame.getTransforms().add(lidarPose); root.getChildren().addAll(lidarFrame, scans); TextureColorPalette1D scanColorPalette = new TextureColorPalette1D(); scanColorPalette.setHueBased(1.0, 1.0); scanMeshBuilder = new JavaFXMultiColorMeshBuilder(scanColorPalette); }