我试图通过使用以下测试代码来理解 JCSG 库,其中我采用 FXyz 网格/布料和球体之间的差异来在网格中创建一个孔,以便显示底层网格图像。是否有可能做到这一点,如果可以,怎么做?我所有的尝试都会产生一个红色圆圈。
import org.fxyz.shapes.primitives.SpheroidMesh
import org.fxyz.utils.MeshUtils
import org.fxyz.shapes.complex.cloth.ClothMesh
import scalafx.Includes._
import scalafx.application.JFXApp
import scalafx.application.JFXApp.PrimaryStage
import scalafx.scene.image.Image
import scalafx.scene.paint.PhongMaterial
import scalafx.scene.shape._
import scalafx.scene.{Group, PerspectiveCamera, Scene, SceneAntialiasing}
import scalafx.scene.paint.Color
import scala.collection.JavaConversions._
object ClothTest1 extends JFXApp {
stage = new PrimaryStage {
scene = new Scene(600, 600, true, SceneAntialiasing.Balanced) {
fill = Color.LightGray
val rose = "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9b/Redoute_-_Rosa_gallica_purpuro-violacea_magna.jpg/800px-Redoute_-_Rosa_gallica_purpuro-violacea_magna.jpg"
val img = new Image(rose, 400, 400, false, true)
val meshView = new ClothMesh(4, 4, 400, 400)
meshView.setDrawMode(DrawMode.Fill)
meshView.setCullFace(CullFace.None)
meshView.setStyle("-fx-background-color: #00000000") // transparent
meshView.setWidth(img.width.value)
meshView.setHeight(img.height.value)
meshView.setMaterial(new PhongMaterial(Color.White, img, null, null, null))
val fxyzSphere = new SpheroidMesh(120.0) {
setDrawMode(DrawMode.Fill)
setStyle("-fx-background-color: #00000000") // transparent
}
val csgHole = MeshUtils.mesh2CSG(fxyzSphere.getMesh())
val csgMesh = MeshUtils.mesh2CSG(meshView.getMesh())
val fxMesh = csgMesh.difference(csgHole).toJavaFXMesh.getAsMeshViews.head
root = new Group() {
children += fxMesh
translateX = 250
translateY = 250
}
camera = new PerspectiveCamera(false)
}
}
}