Можно ли использовать библиотеку jcsg с Processing? - PullRequest
1 голос
/ 12 июля 2019

Processing - это креативная платформа кодирования - язык, IDE и экосистема, поддерживаемая сообществом Processing при поддержке Processing Foundation. https://processing.org.. Режим Java Processing обычно может использовать преимущества кода в библиотеках Java.

JCSG - это Java-реализация CSG (Конструктивная твердая геометрия) на основе BSP https://github.com/miho/JCSG.

1 Ответ

4 голосов
/ 12 июля 2019

Есть несколько переходов для перехода от одной только 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);
  }
}

Я проверил и вершины есть, грани пропущены через:

JCSG demo vertices

Почувствуйте, попробуйтеФормат 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);
}

JSCG vertex traversal

Вы можете загрузить вышеуказанный эскиз (с предварительно скомпилированными библиотеками) здесь (и сгенерированная 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);
}

JCSG rendered as PShape in Processing

...