You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 20:57:02