use of org.fxyz.geometry.Point3D in project FXyzLib by Birdasaur.
the class BezierHelper method getKappa.
public double getKappa(double t) {
if (ab == null || bc == null || cd == null) {
preProcess();
}
// r'[t]
Point3D dR = ab.multiply((float) (3d * Math.pow(1d - t, 2))).add(bc.multiply((float) (6d * (1d - t) * t)).add(cd.multiply((float) (3d * Math.pow(t, 2)))));
// || r'[t] ||
float nT = dR.magnitude();
// r''[t]
Point3D ddR = abc.multiply((float) (6d * (1d - t))).add(bcd.multiply((float) (6d * t)));
// || r''[t]xr'[t] ||
float nddRxdR = ddR.crossProduct(dR).magnitude();
// kappa[t] = || r''[t]xr'[t] || / || r'[t] ||^3
return nddRxdR / (float) Math.pow(nT, 3d);
}
use of org.fxyz.geometry.Point3D in project FXyzLib by Birdasaur.
the class BezierHelper method getTau.
public double getTau(double t) {
if (ab == null || bc == null || cd == null) {
preProcess();
}
// r'[t]
Point3D dR = ab.multiply((float) (3d * Math.pow(1d - t, 2))).add(bc.multiply((float) (6d * (1d - t) * t)).add(cd.multiply((float) (3d * Math.pow(t, 2)))));
// r''[t]
Point3D ddR = abc.multiply((float) (6d * (1d - t))).add(bcd.multiply((float) (6d * t)));
// r'[t]xr''[t] . r'''[t]
float dRxddRxdddR = dR.crossProduct(ddR).dotProduct(abcd.multiply(6f));
// || r''[t]xr'[t] ||
float ndRxddR = dR.crossProduct(ddR).magnitude();
// tau[t] = r'[t]xr''[t].r'''[t] / || r''[t]xr'[t] ||^2
return Math.abs(dRxddRxdddR / (float) Math.pow(ndRxddR, 2d));
}
use of org.fxyz.geometry.Point3D in project FXyzLib by Birdasaur.
the class CuboidTest method start.
@Override
public void start(Stage primaryStage) throws Exception {
Group sceneRoot = new Group();
Scene scene = new Scene(sceneRoot, sceneWidth, sceneHeight, true, SceneAntialiasing.BALANCED);
scene.setFill(Color.BLACK);
camera = new PerspectiveCamera(true);
// setup camera transform for rotational support
cameraTransform.setTranslate(0, 0, 0);
cameraTransform.getChildren().add(camera);
camera.setNearClip(0.1);
camera.setFarClip(10000.0);
camera.setTranslateZ(-30);
cameraTransform.ry.setAngle(-45.0);
cameraTransform.rx.setAngle(-10.0);
// add a Point Light for better viewing of the grid coordinate system
PointLight light = new PointLight(Color.WHITE);
cameraTransform.getChildren().add(light);
light.setTranslateX(camera.getTranslateX());
light.setTranslateY(camera.getTranslateY());
light.setTranslateZ(10 * camera.getTranslateZ());
scene.setCamera(camera);
rotateY = new Rotate(0, 0, 0, 0, Rotate.Y_AXIS);
Group group = new Group();
group.getChildren().add(cameraTransform);
cuboid = new CuboidMesh(10f, 12f, 4f, 5, new Point3D(0f, 0f, 0f));
// cuboid.setDrawMode(DrawMode.LINE);
// cuboid.setCullFace(CullFace.NONE);
// NONE
cuboid.setTextureModeNone(Color.ROYALBLUE);
// IMAGE
// cuboid.setTextureModeImage(getClass().getResource("res/netCuboid.png").toExternalForm());
// DENSITY
// cuboid.setTextureModeVertices3D(256*256,p->(double)p.x*p.y*p.z);
// FACES
// cuboid.setTextureModeFaces(1530);
cuboid.getTransforms().addAll(new Rotate(0, Rotate.X_AXIS), rotateY);
group.getChildren().add(cuboid);
boolean testRayIntersection = false;
if (testRayIntersection) {
/*
RAY INTERSECTION
*/
javafx.geometry.Point3D gloOrigin = new javafx.geometry.Point3D(4, -7, -4);
javafx.geometry.Point3D gloTarget = new javafx.geometry.Point3D(2, 3, 4);
javafx.geometry.Point3D gloDirection = gloTarget.subtract(gloOrigin).normalize();
javafx.geometry.Point3D gloOriginInLoc = cuboid.sceneToLocal(gloOrigin);
Bounds locBounds = cuboid.getBoundsInLocal();
Bounds gloBounds = cuboid.localToScene(locBounds);
Sphere s = new Sphere(0.05d);
s.getTransforms().add(new Translate(gloOrigin.getX(), gloOrigin.getY(), gloOrigin.getZ()));
s.setMaterial(new PhongMaterial(Color.GREENYELLOW));
group.getChildren().add(s);
s = new Sphere(0.05d);
s.getTransforms().add(new Translate(gloTarget.getX(), gloTarget.getY(), gloTarget.getZ()));
s.setMaterial(new PhongMaterial(Color.GREENYELLOW));
group.getChildren().add(s);
javafx.geometry.Point3D dir = gloTarget.subtract(gloOrigin).crossProduct(new javafx.geometry.Point3D(0, -1, 0));
double angle = Math.acos(gloTarget.subtract(gloOrigin).normalize().dotProduct(new javafx.geometry.Point3D(0, -1, 0)));
double h1 = gloTarget.subtract(gloOrigin).magnitude();
Cylinder c = new Cylinder(0.03d, h1);
c.getTransforms().addAll(new Translate(gloOrigin.getX(), gloOrigin.getY() - h1 / 2d, gloOrigin.getZ()), new Rotate(-Math.toDegrees(angle), 0d, h1 / 2d, 0d, new javafx.geometry.Point3D(dir.getX(), -dir.getY(), dir.getZ())));
c.setMaterial(new PhongMaterial(Color.GREEN));
group.getChildren().add(c);
group.getChildren().add(new Axes(0.02));
Box box = new Box(gloBounds.getWidth(), gloBounds.getHeight(), gloBounds.getDepth());
box.setDrawMode(DrawMode.LINE);
box.setMaterial(new PhongMaterial(Color.BLUEVIOLET));
box.getTransforms().add(new Translate(gloBounds.getMinX() + gloBounds.getWidth() / 2d, gloBounds.getMinY() + gloBounds.getHeight() / 2d, gloBounds.getMinZ() + gloBounds.getDepth() / 2d));
// group.getChildren().add(box);
/*
FIRST STEP; Check the ray crosses the bounding box of the shape at any of
its 6 faces
*/
List<javafx.geometry.Point3D> normals = Arrays.asList(new javafx.geometry.Point3D(-1, 0, 0), new javafx.geometry.Point3D(1, 0, 0), new javafx.geometry.Point3D(0, -1, 0), new javafx.geometry.Point3D(0, 1, 0), new javafx.geometry.Point3D(0, 0, -1), new javafx.geometry.Point3D(0, 0, 1));
List<javafx.geometry.Point3D> positions = Arrays.asList(new javafx.geometry.Point3D(locBounds.getMinX(), 0, 0), new javafx.geometry.Point3D(locBounds.getMaxX(), 0, 0), new javafx.geometry.Point3D(0, locBounds.getMinY(), 0), new javafx.geometry.Point3D(0, locBounds.getMaxY(), 0), new javafx.geometry.Point3D(0, 0, locBounds.getMinZ()), new javafx.geometry.Point3D(0, 0, locBounds.getMaxZ()));
AtomicInteger counter = new AtomicInteger();
IntStream.range(0, 6).forEach(i -> {
// ray[t]= ori+t.dir; t/ray[t]=P in plane
// plane P·N+d=0->(ori+t*dir)·N+d=0->t=-(ori.N+d)/(dir.N)
// P=P(x,y,z), N={a,b,c}, d=-a·x0-b·y0-c·z0
double d = -normals.get(i).dotProduct(positions.get(i));
double t = -(gloOriginInLoc.dotProduct(normals.get(i)) + d) / (gloDirection.dotProduct(normals.get(i)));
javafx.geometry.Point3D locInter = gloOriginInLoc.add(gloDirection.multiply(t));
if (locBounds.contains(locInter)) {
counter.getAndIncrement();
javafx.geometry.Point3D gloInter = cuboid.localToScene(locInter);
Sphere s2 = new Sphere(0.1d);
s2.getTransforms().add(new Translate(gloInter.getX(), gloInter.getY(), gloInter.getZ()));
s2.setMaterial(new PhongMaterial(Color.GOLD));
// group.getChildren().add(s2);
}
});
if (counter.get() > 0) {
/*
SECOND STEP: Check if the ray crosses any of the triangles of the mesh
*/
// triangle mesh
org.fxyz.geometry.Point3D gloOriginInLoc1 = new org.fxyz.geometry.Point3D((float) gloOriginInLoc.getX(), (float) gloOriginInLoc.getY(), (float) gloOriginInLoc.getZ());
org.fxyz.geometry.Point3D gloDirection1 = new org.fxyz.geometry.Point3D((float) gloDirection.getX(), (float) gloDirection.getY(), (float) gloDirection.getZ());
System.out.println("number of intersections: " + cuboid.getIntersections(gloOriginInLoc1, gloDirection1));
}
}
sceneRoot.getChildren().addAll(group);
// First person shooter keyboard movement
scene.setOnKeyPressed(event -> {
double change = 10.0;
// Add shift modifier to simulate "Running Speed"
if (event.isShiftDown()) {
change = 50.0;
}
// What key did the user press?
KeyCode keycode = event.getCode();
// Step 2c: Add Zoom controls
if (keycode == KeyCode.W) {
camera.setTranslateZ(camera.getTranslateZ() + change);
}
if (keycode == KeyCode.S) {
camera.setTranslateZ(camera.getTranslateZ() - change);
}
// Step 2d: Add Strafe controls
if (keycode == KeyCode.A) {
camera.setTranslateX(camera.getTranslateX() - change);
}
if (keycode == KeyCode.D) {
camera.setTranslateX(camera.getTranslateX() + change);
}
});
scene.setOnMousePressed((MouseEvent me) -> {
mousePosX = me.getSceneX();
mousePosY = me.getSceneY();
mouseOldX = me.getSceneX();
mouseOldY = me.getSceneY();
});
scene.setOnMouseDragged((MouseEvent me) -> {
mouseOldX = mousePosX;
mouseOldY = mousePosY;
mousePosX = me.getSceneX();
mousePosY = me.getSceneY();
mouseDeltaX = (mousePosX - mouseOldX);
mouseDeltaY = (mousePosY - mouseOldY);
double modifier = 10.0;
double modifierFactor = 0.1;
if (me.isControlDown()) {
modifier = 0.1;
}
if (me.isShiftDown()) {
modifier = 50.0;
}
if (me.isPrimaryButtonDown()) {
// +
cameraTransform.ry.setAngle(((cameraTransform.ry.getAngle() + mouseDeltaX * modifierFactor * modifier * 2.0) % 360 + 540) % 360 - 180);
// -
cameraTransform.rx.setAngle(((cameraTransform.rx.getAngle() - mouseDeltaY * modifierFactor * modifier * 2.0) % 360 + 540) % 360 - 180);
} else if (me.isSecondaryButtonDown()) {
double z = camera.getTranslateZ();
double newZ = z + mouseDeltaX * modifierFactor * modifier;
camera.setTranslateZ(newZ);
} else if (me.isMiddleButtonDown()) {
// -
cameraTransform.t.setX(cameraTransform.t.getX() + mouseDeltaX * modifierFactor * modifier * 0.3);
// -
cameraTransform.t.setY(cameraTransform.t.getY() + mouseDeltaY * modifierFactor * modifier * 0.3);
}
});
primaryStage.setTitle("F(X)yz - Cuboid Test");
primaryStage.setScene(scene);
primaryStage.show();
OBJWriter writer = new OBJWriter((TriangleMesh) cuboid.getMesh(), "cuboid");
// writer.setMaterialColor(Color.AQUA);
// writer.setTextureImage(getClass().getResource("res/netCuboid.png").toExternalForm());
writer.setTextureColors(256 * 256);
writer.exportMesh();
}
use of org.fxyz.geometry.Point3D in project FXyzLib by Birdasaur.
the class BezierTest method start.
@Override
public void start(Stage primaryStage) throws Exception {
Group sceneRoot = new Group();
Scene scene = new Scene(sceneRoot, sceneWidth, sceneHeight, true, SceneAntialiasing.BALANCED);
scene.setFill(Color.BLACK);
camera = new PerspectiveCamera(true);
// setup camera transform for rotational support
cameraTransform.setTranslate(0, 0, 0);
cameraTransform.getChildren().add(camera);
camera.setNearClip(0.1);
camera.setFarClip(10000.0);
camera.setTranslateZ(-10);
cameraTransform.ry.setAngle(-45.0);
cameraTransform.rx.setAngle(-10.0);
// add a Point Light for better viewing of the grid coordinate system
PointLight light = new PointLight(Color.WHITE);
cameraTransform.getChildren().add(light);
cameraTransform.getChildren().add(new AmbientLight(Color.WHITE));
light.setTranslateX(camera.getTranslateX());
light.setTranslateY(camera.getTranslateY());
light.setTranslateZ(camera.getTranslateZ());
scene.setCamera(camera);
rotateY = new Rotate(0, 0, 0, 0, Rotate.Y_AXIS);
Group group = new Group();
group.getChildren().add(cameraTransform);
// List<Point3D> knots=Arrays.asList(new Point3D(0f,0f,0f),new Point3D(3f,0f,2f),
// new Point3D(5f,2f,3f),new Point3D(7f,-3f,0f),new Point3D(6f,-1f,-4f));
List<Point3D> knots = Arrays.asList(new Point3D(3f, 0f, 0f), new Point3D(0.77171f, 1.68981f, 0.989821f), new Point3D(-0.681387f, 0.786363f, -0.281733f), new Point3D(-2.31757f, -0.680501f, -0.909632f), new Point3D(-0.404353f, -2.81233f, 0.540641f), new Point3D(1.1316f, -0.727237f, 0.75575f), new Point3D(1.1316f, 0.727237f, -0.75575f), new Point3D(-0.404353f, 2.81233f, -0.540641f), new Point3D(-2.31757f, 0.680501f, 0.909632f), new Point3D(-0.681387f, -0.786363f, 0.281733f), new Point3D(0.77171f, -1.68981f, -0.989821f), new Point3D(3f, 0f, 0f));
boolean showControlPoints = true;
boolean showKnots = true;
InterpolateBezier interpolate = new InterpolateBezier(knots);
beziers = new ArrayList<>();
AtomicInteger sp = new AtomicInteger();
if (showKnots || showControlPoints) {
interpolate.getSplines().forEach(spline -> {
Point3D k0 = spline.getPoints().get(0);
Point3D k1 = spline.getPoints().get(1);
Point3D k2 = spline.getPoints().get(2);
Point3D k3 = spline.getPoints().get(3);
if (showKnots) {
Sphere s = new Sphere(0.2d);
s.getTransforms().add(new Translate(k0.x, k0.y, k0.z));
s.setMaterial(new PhongMaterial(Color.GREENYELLOW));
group.getChildren().add(s);
s = new Sphere(0.2d);
s.getTransforms().add(new Translate(k3.x, k3.y, k3.z));
s.setMaterial(new PhongMaterial(Color.GREENYELLOW));
group.getChildren().add(s);
}
if (showControlPoints) {
PrismMesh c = new PrismMesh(0.03d, 1d, 1, k0, k1);
c.setTextureModeNone(Color.GREEN);
group.getChildren().add(c);
c = new PrismMesh(0.03d, 1d, 1, k1, k2);
c.setTextureModeNone(Color.GREEN);
group.getChildren().add(c);
c = new PrismMesh(0.03d, 1d, 1, k2, k3);
c.setTextureModeNone(Color.GREEN);
group.getChildren().add(c);
Sphere s = new Sphere(0.1d);
s.getTransforms().add(new Translate(k1.x, k1.y, k1.z));
s.setMaterial(new PhongMaterial(Color.RED));
group.getChildren().add(s);
s = new Sphere(0.1d);
s.getTransforms().add(new Translate(k2.x, k2.y, k2.z));
s.setMaterial(new PhongMaterial(Color.RED));
group.getChildren().add(s);
}
});
}
long time = System.currentTimeMillis();
interpolate.getSplines().stream().forEach(spline -> {
BezierMesh bezier = new BezierMesh(spline, 0.1d, 300, 20, 0, 0);
// bezier.setDrawMode(DrawMode.LINE);
// bezier.setCullFace(CullFace.NONE);
// bezier.setSectionType(SectionType.TRIANGLE);
// NONE
// bezier.setTextureModeNone(Color.hsb(360d*sp.getAndIncrement()/interpolate.getSplines().size(), 1, 1));
// IMAGE
// bezier.setTextureModeImage(getClass().getResource("res/LaminateSteel.jpg").toExternalForm());
// PATTERN
// bezier.setTextureModePattern(3d);
// FUNCTION
bezier.setTextureModeVertices1D(1530, t -> spline.getKappa(t.doubleValue()));
// bezier.setTextureModeVertices1D(1530,func);
// DENSITY
// bezier.setTextureModeVertices3D(256*256,dens);
// FACES
// bezier.setTextureModeFaces(256*256);
bezier.getTransforms().addAll(new Rotate(0, Rotate.X_AXIS), rotateY);
beziers.add(bezier);
});
// 43.815->25.606->15
System.out.println("time: " + (System.currentTimeMillis() - time));
group.getChildren().addAll(beziers);
sceneRoot.getChildren().addAll(group);
// First person shooter keyboard movement
scene.setOnKeyPressed(event -> {
double change = 10.0;
// Add shift modifier to simulate "Running Speed"
if (event.isShiftDown()) {
change = 50.0;
}
// What key did the user press?
KeyCode keycode = event.getCode();
// Step 2c: Add Zoom controls
if (keycode == KeyCode.W) {
camera.setTranslateZ(camera.getTranslateZ() + change);
}
if (keycode == KeyCode.S) {
camera.setTranslateZ(camera.getTranslateZ() - change);
}
// Step 2d: Add Strafe controls
if (keycode == KeyCode.A) {
camera.setTranslateX(camera.getTranslateX() - change);
}
if (keycode == KeyCode.D) {
camera.setTranslateX(camera.getTranslateX() + change);
}
});
scene.setOnMousePressed((MouseEvent me) -> {
mousePosX = me.getSceneX();
mousePosY = me.getSceneY();
mouseOldX = me.getSceneX();
mouseOldY = me.getSceneY();
});
scene.setOnMouseDragged((MouseEvent me) -> {
mouseOldX = mousePosX;
mouseOldY = mousePosY;
mousePosX = me.getSceneX();
mousePosY = me.getSceneY();
mouseDeltaX = (mousePosX - mouseOldX);
mouseDeltaY = (mousePosY - mouseOldY);
double modifier = 10.0;
double modifierFactor = 0.1;
if (me.isControlDown()) {
modifier = 0.1;
}
if (me.isShiftDown()) {
modifier = 50.0;
}
if (me.isPrimaryButtonDown()) {
// +
cameraTransform.ry.setAngle(((cameraTransform.ry.getAngle() + mouseDeltaX * modifierFactor * modifier * 2.0) % 360 + 540) % 360 - 180);
// -
cameraTransform.rx.setAngle(((cameraTransform.rx.getAngle() - mouseDeltaY * modifierFactor * modifier * 2.0) % 360 + 540) % 360 - 180);
} else if (me.isSecondaryButtonDown()) {
double z = camera.getTranslateZ();
double newZ = z + mouseDeltaX * modifierFactor * modifier;
camera.setTranslateZ(newZ);
} else if (me.isMiddleButtonDown()) {
// -
cameraTransform.t.setX(cameraTransform.t.getX() + mouseDeltaX * modifierFactor * modifier * 0.3);
// -
cameraTransform.t.setY(cameraTransform.t.getY() + mouseDeltaY * modifierFactor * modifier * 0.3);
}
});
lastEffect = System.nanoTime();
AtomicInteger count = new AtomicInteger();
AnimationTimer timerEffect = new AnimationTimer() {
@Override
public void handle(long now) {
if (now > lastEffect + 1_000_000_000l) {
// Point3D loc = knot.getPositionAt((count.get()%100)*2d*Math.PI/100d);
// Point3D dir = knot.getTangentAt((count.get()%100)*2d*Math.PI/100d);
// cameraTransform.t.setX(loc.x);
// cameraTransform.t.setY(loc.y);
// cameraTransform.t.setZ(-loc.z);
// javafx.geometry.Point3D axis = cameraTransform.rx.getAxis();
// javafx.geometry.Point3D cross = axis.crossProduct(-dir.x,-dir.y,-dir.z);
// double angle = axis.angle(-dir.x,-dir.y,-dir.z);
// cameraTransform.rx.setAngle(angle);
// cameraTransform.rx.setAxis(new javafx.geometry.Point3D(cross.getX(),-cross.getY(),cross.getZ()));
// dens = p->(float)(p.x*Math.cos(count.get()%100d*2d*Math.PI/50d)+p.y*Math.sin(count.get()%100d*2d*Math.PI/50d));
func = t -> Math.pow(t.doubleValue(), (count.get() % 5d));
beziers.forEach(b -> b.setFunction(func));
// knot.setP(1+(count.get()%5));
// knot.setQ(2+(count.get()%15));
// if(count.get()%100<50){
// knot.setDrawMode(DrawMode.LINE);
// } else {
// knot.setDrawMode(DrawMode.FILL);
// }
// beziers.forEach(b->b.setColors((int)Math.pow(2,count.get()%16)));
// beziers.forEach(b->b.setWireRadius(0.1d+(count.get()%6)/10d));
// beziers.forEach(b->b.setPatternScale(1d+(count.get()%10)*3d));
// beziers.forEach(b->b.setSectionType(SectionType.values()[count.get()%SectionType.values().length]));
count.getAndIncrement();
lastEffect = now;
}
}
};
primaryStage.setTitle("F(X)yz - Bezier Splines");
primaryStage.setScene(scene);
primaryStage.show();
timerEffect.start();
}
use of org.fxyz.geometry.Point3D in project FXyzLib by Birdasaur.
the class ScatterPlotMesh method setXYZData.
public void setXYZData(ArrayList<Double> xData, ArrayList<Double> yData, ArrayList<Double> zData) {
xAxisData = xData;
yAxisData = yData;
zAxisData = zData;
getChildren().clear();
// for now we will always default to x axis
// later we could maybe dynamically determine the smallest axis and then
// uses 0's for the other axes that are larger.
ArrayList<Point3D> point3DList = new ArrayList<>();
for (int i = 0; i < xAxisData.size(); i++) {
// some safety checks for array sizes
double translateY = 0.0;
double translateZ = 0.0;
if (!yAxisData.isEmpty() && yAxisData.size() > i)
translateY = yAxisData.get(i);
if (!zAxisData.isEmpty() && zAxisData.size() > i)
translateZ = zAxisData.get(i);
setTranslateX(xAxisData.get(i));
// Convert to Floats and build list of adjusted points
point3DList.add(new Point3D(new Float(xAxisData.get(i)), new Float(translateY), new Float(translateZ)));
float width = 1;
final TriangleMesh mesh = new TriangleMesh();
// This extra point allows us to build triangles later
for (Point3D point : point3DList) {
// Rear points
// top right rear point
mesh.getPoints().addAll(point.x + width, point.y + width, point.z + width);
// top left rear point
mesh.getPoints().addAll(point.x - width, point.y + width, point.z + width);
// bottom right rear point
mesh.getPoints().addAll(point.x + width, point.y - width, point.z + width);
// bottom left rear point
mesh.getPoints().addAll(point.x - width, point.y - width, point.z + width);
// Front points
// top right front point
mesh.getPoints().addAll(point.x + width, point.y + width, point.z - width);
// top left front point
mesh.getPoints().addAll(point.x - width, point.y + width, point.z - width);
// bottom right front point
mesh.getPoints().addAll(point.x + width, point.y - width, point.z - width);
// bottom left front point
mesh.getPoints().addAll(point.x - width, point.y - width, point.z - width);
}
// add dummy Texture Coordinate
mesh.getTexCoords().addAll(0, 0);
// Now generate nodes for each point
for (int p = 8; p < point3DList.size() * 7; p += 8) {
// add each segment
// Wind the next 8 vertices as a cube. The cube itself will represent the data
// Vertices wound counter-clockwise which is the default front face of any Triangle
// Rear triangle faces should be wound clockwise to face away from center
// TRR,BLR,BRR
mesh.getFaces().addAll(p, 0, p + 3, 0, p + 2, 0);
// BLR,TRR,TLR
mesh.getFaces().addAll(p + 3, 0, p, 0, p + 1, 0);
// left side faces
// TLR,TLF,BLR
mesh.getFaces().addAll(p + 1, 0, p + 5, 0, p + 3, 0);
// TLF,BLR,BLF
mesh.getFaces().addAll(p + 5, 0, p + 7, 0, p + 3, 0);
// front side faces
// TLF,BLF,TLR
mesh.getFaces().addAll(p + 5, 0, p + 7, 0, p + 4, 0);
// TRF,BLF,BRF
mesh.getFaces().addAll(p + 4, 0, p + 7, 0, p + 6, 0);
// front side faces
// TRF,BRF,BRR
mesh.getFaces().addAll(p + 4, 0, p + 6, 0, p + 2, 0);
// TRF,BRR,TRR
mesh.getFaces().addAll(p + 4, 0, p + 2, 0, p, 0);
// Top faces
// TRR,TLR,TRF
mesh.getFaces().addAll(p, 0, p + 1, 0, p + 3, 0);
// TLR,TLF,TRF
mesh.getFaces().addAll(p + 1, 0, p + 5, 0, p + 3, 0);
// bottom faces
// BLR,BLF,BRF
mesh.getFaces().addAll(p + 3, 0, p + 7, 0, p + 6, 0);
// BLR,BRF,BRR
mesh.getFaces().addAll(p + 3, 0, p + 6, 0, p + 2, 0);
}
// Need to add the mesh to a MeshView before adding to our 3D scene
MeshView meshView = new MeshView(mesh);
// Fill so that the line shows width
meshView.setDrawMode(DrawMode.FILL);
Color hsb = Color.hsb((new Double(i) / 12) * 360, 1.0, 1.0, 0.5);
PhongMaterial material = new PhongMaterial(hsb);
material.setDiffuseColor(hsb);
material.setSpecularColor(hsb);
meshView.setMaterial(material);
// Make sure you Cull the Back so that no black shows through
meshView.setCullFace(CullFace.BACK);
// //Add some ambient light so folks can see it
// Group line = new Group();
// AmbientLight light = new AmbientLight(Color.WHITE);
// light.getScope().add(meshView);
// line.getChildren().add(light);
// line.getChildren().add(meshView);
getChildren().addAll(meshView);
}
}
Aggregations