如何为TriangleMesh中的部分三角形设置不同颜色,是否可在FXML中实现?
TriangleMesh部分三角形自定义颜色实现方案
首先明确:无法直接在单个TriangleMesh的FXML配置中为不同面设置不同颜色,JavaFX中单个MeshView绑定的TriangleMesh只能应用单一材质。下面是两种最简单的实现方式:
方案1:拆分不同颜色的三角面为独立Mesh(支持FXML直接配置,最简方案)
你可以把需要同色的三角面拆分到单独的TriangleMesh实例里,每个对应一个MeshView,分别给每个MeshView设置不同颜色的PhongMaterial即可,完全可以在FXML里完成所有配置。
修改后的mesh.fxml示例:
<?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.Group?> <?import javafx.scene.shape.MeshView?> <?import javafx.scene.shape.TriangleMesh?> <?import javafx.scene.paint.PhongMaterial?> <?import javafx.scene.paint.Color?> <Group> <!-- 红色的侧面三角面集合 --> <MeshView> <material> <PhongMaterial diffuseColor="RED"/> </material> <mesh> <TriangleMesh> <points> 0 100 100 100 100 0 0 100 -100 -100 100 0 0 0 0 </points> <texCoords> 0 0 </texCoords> <faces> 0 0 4 0 1 0 1 0 4 0 2 0 2 0 4 0 3 0 3 0 4 0 0 0 </faces> </TriangleMesh> </mesh> </MeshView> <!-- 蓝色的底面三角面集合 --> <MeshView> <material> <PhongMaterial diffuseColor="BLUE"/> </material> <mesh> <TriangleMesh> <points> 0 100 100 100 100 0 0 100 -100 -100 100 0 </points> <texCoords> 0 0 </texCoords> <faces> 0 0 1 0 2 0 0 0 2 0 3 0 </faces> </TriangleMesh> </mesh> </MeshView> </Group>
对应的Java代码只需要调整加载后的根节点类型即可,不需要额外逻辑:
import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.*; import javafx.scene.layout.Pane; import javafx.stage.Stage; import java.io.IOException; public class ColoredMesh extends Application { @Override public void start(Stage stage) throws IOException { FXMLLoader fxmlLoader = new FXMLLoader( ColoredMesh.class.getResource( "mesh.fxml" ) ); Group meshGroup = fxmlLoader.load(); meshGroup.setTranslateX(-200); meshGroup.setTranslateY(400); meshGroup.setRotate(90); Camera camera = new PerspectiveCamera(); camera.setRotate(90); Scene scene = new Scene(new Pane(meshGroup), 800, 400); scene.setCamera(camera); stage.setScene(scene); stage.show(); } public static void main(String[] args) { launch(args); } }
方案2:单Mesh使用纹理贴图实现分色
如果你不想拆分Mesh,可以给TriangleMesh的面配置不同的纹理坐标,制作一张对应色块的纹理图,绑定到MeshView的材质上即可,这种方式需要额外制作纹理图,灵活度更高但实现成本比拆分Mesh更高。
内容的提问来源于stack exchange,提问作者Darth Bane
相关产品推荐
相关产品推荐

