Есть несколько переходов для перехода от одной только Processing, но да, вы можете использовать любую библиотеку Java в Processing.(Просто перетащите библиотеку .jar поверх сохраненного эскиза)
Сначала вам нужно скомпилировать библиотеку JCSG .jar вместе с VVecMath .jar.библиотека для запуска примера кода.
Для этого вам понадобится Gradle .Вы можете установить его с нуля или использовать существующую установку из своей системы, если вы использовали Android SDK / Android Studio / IntelliJ / и т. Д.
Как упоминается readme , в OSX /Linux / и т.д..из каждой папки библиотеки запустите:
bash gradlew assemble
В Windows запустите:
gradlew assemble
В моем случае я использовал установку Gradle, поставляемую с Android Studio, которая была у меня на компьютере Mac:
bash /Applications/IDEsAndEditors/Android\ Studio.app/Contents/plugins/android/lib/templates/gradle/wrapper/gradlew assemble
После того как файлы .jar скомпилированы, вы можете просто перетащить их в сохраненный эскиз обработки.Это создаст папку code
.На этом этапе вы можете использовать библиотеки в этом эскизе.
(Совет. Перейдите к Обработка> Настройки и включите Завершение кода с помощью Ctrl + Пробел , чтобы упростить просмотр доступных метода и свойств (таких сред IDE, как eclipse / IntelliJ)./ NetBeans / и т. Д. По умолчанию))
Я провел быструю проверку, однако сохраненный JCSG OBJ-файл не может быть проанализирован встроенным в PShape OBJ-загрузчиком Processing.
import java.nio.file.Paths;
PShape csgResult;
void setup(){
size(900,900,P3D);
// we use cube and sphere as base geometries
CSG cube = new Cube(2).toCSG();
CSG sphere = new Sphere(1.25).toCSG();
// perform union, difference and intersection
CSG cubePlusSphere = cube.union(sphere);
CSG cubeMinusSphere = cube.difference(sphere);
CSG cubeIntersectSphere = cube.intersect(sphere);
// translate geometries to prevent overlapping
CSG union = cube.
union(sphere.transformed(Transform.unity().translateX(3))).
union(cubePlusSphere.transformed(Transform.unity().translateX(6))).
union(cubeMinusSphere.transformed(Transform.unity().translateX(9))).
union(cubeIntersectSphere.transformed(Transform.unity().translateX(12)));
// save union as stl
try {
FileUtil.write(
Paths.get(sketchPath("sample.obj")),
union.toObjString()
);
} catch (IOException ex) {
ex.printStackTrace();
}
//load shape into Processing
csgResult = loadShape(sketchPath("sample.obj"));
}
void draw(){
background(0);
translate(width * 0.5, height * 0.5,0);
scale(sin(frameCount * 0.1) * 100);
if(csgResult != null){
shape(csgResult);
}
}
Я проверил и вершины есть, грани пропущены через:
Почувствуйте, попробуйтеФормат STL и другая библиотека обработки для загрузки, в противном случае доступ к вершинам и их отрисовка в обработке напрямую с учетом единиц / масштабов, различающихся между JSCG и обработкой:
import java.nio.file.Paths;
CSG union;
void setup(){
size(900,900,P3D);
stroke(255);
//strokeWeight(3);
// we use cube and sphere as base geometries
CSG cube = new Cube(2).toCSG();
CSG sphere = new Sphere(1.25).toCSG();
// perform union, difference and intersection
CSG cubePlusSphere = cube.union(sphere);
CSG cubeMinusSphere = cube.difference(sphere);
CSG cubeIntersectSphere = cube.intersect(sphere);
// translate geometries to prevent overlapping
union = cube.
union(sphere.transformed(Transform.unity().translateX(3))).
union(cubePlusSphere.transformed(Transform.unity().translateX(6))).
union(cubeMinusSphere.transformed(Transform.unity().translateX(9))).
union(cubeIntersectSphere.transformed(Transform.unity().translateX(12)));
}
void drawCSG(CSG mesh,float scale){
beginShape(POINTS);
for(Polygon p : mesh.getPolygons()){
for(Vertex v : p.vertices){
vertex((float)v.pos.getX() * scale,(float)v.pos.getY() * scale,(float)v.pos.getZ() * scale);
}
}
endShape();
}
void draw(){
background(0);
translate(width * 0.5, height * 0.5,0);
rotateY(map(mouseX,0,width,-PI,PI));
rotateX(map(mouseY,0,height,PI,-PI));
drawCSG(union,sin(frameCount * 0.01) * 100);
}
Вы можете загрузить вышеуказанный эскиз (с предварительно скомпилированными библиотеками) здесь (и сгенерированная JCSG документация здесь ).Обязательно ознакомьтесь с документацией / исходным кодом библиотек для более расширенного использования.
Обновление: Для эффективности вы можете использовать createShape()
для созданиягруппа PShape
объектов один раз в настройке, затем просто рендеринг в draw()
(в отличие от моего предыдущего примера, который перебирает все полигоны и вершины снова и снова):
// the PShape reference which will contain the converted
PShape csgResult;
void setup(){
size(900,900,P3D);
noStroke();
// JCSG sample code:
// we use cube and sphere as base geometries
CSG cube = new Cube(2).toCSG();
CSG sphere = new Sphere(1.25).toCSG();
// perform union, difference and intersection
CSG cubePlusSphere = cube.union(sphere);
CSG cubeMinusSphere = cube.difference(sphere);
CSG cubeIntersectSphere = cube.intersect(sphere);
// translate geometries to prevent overlapping
CSG union = cube.
union(sphere.transformed(Transform.unity().translateX(3))).
union(cubePlusSphere.transformed(Transform.unity().translateX(6))).
union(cubeMinusSphere.transformed(Transform.unity().translateX(9))).
union(cubeIntersectSphere.transformed(Transform.unity().translateX(12)));
// translate merged geometry back by half the total translation to pivot around centre
union = union.transformed(Transform.unity().translateX(-6));
// Convert CSG to PShape -> Note: CSG units are small so we scale them up so the shapes are visible in Processing
csgResult = CSGToPShape(union,45);
}
// re-usable function to convert a CSG mesh to a Processing PShape
PShape CSGToPShape(CSG mesh,float scale){
// allocate a PShape group
PShape csgResult = createShape(GROUP);
// for each CSG polygon (Note: these can have 3,4 or more vertices)
for(Polygon p : mesh.getPolygons()){
// make a child PShape
PShape polyShape = createShape();
// begin setting vertices to it
polyShape.beginShape();
// for each vertex in the polygon
for(Vertex v : p.vertices){
// add each (scaled) polygon vertex
polyShape.vertex((float)v.pos.getX() * scale,(float)v.pos.getY() * scale,(float)v.pos.getZ() * scale);
}
// finish this polygon
polyShape.endShape();
//append the child PShape to the parent
csgResult.addChild(polyShape);
}
return csgResult;
}
void draw(){
background(0);
lights();
translate(width * 0.5, height * 0.5,0);
rotateY(map(mouseX,0,width,-PI,PI));
rotateX(map(mouseY,0,height,PI,-PI));
shape(csgResult);
}