Javafx 为什么漫反射贴图不应用于我的MeshView?
问题 我想将漫反射贴图应用于网格视图。当我将带有漫反射贴图的材质应用到网格视图时,它不可见。但是,应用于长方体的相同材质是可见的 问题 要将漫反射贴图应用于MeshView,我必须做什么 代码 该代码生成带有随机噪声的图像。该图像用作PhongMaterial中的漫反射贴图。将显示图像,图像上方为应用材质的长方体,长方体上方为应用材质的网格视图(金字塔)。该材质在金字塔上不可见。可以使用鼠标拖动进行旋转Javafx 为什么漫反射贴图不应用于我的MeshView?,javafx,javafx-3d,Javafx,Javafx 3d,问题 我想将漫反射贴图应用于网格视图。当我将带有漫反射贴图的材质应用到网格视图时,它不可见。但是,应用于长方体的相同材质是可见的 问题 要将漫反射贴图应用于MeshView,我必须做什么 代码 该代码生成带有随机噪声的图像。该图像用作PhongMaterial中的漫反射贴图。将显示图像,图像上方为应用材质的长方体,长方体上方为应用材质的网格视图(金字塔)。该材质在金字塔上不可见。可以使用鼠标拖动进行旋转 import java.util.Random; import javafx.applic
import java.util.Random;
import javafx.application.Application;
import javafx.geometry.Point3D;
import javafx.scene.Group;
import javafx.scene.PerspectiveCamera;
import javafx.scene.Scene;
import javafx.scene.SceneAntialiasing;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.image.PixelWriter;
import javafx.scene.image.WritableImage;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.paint.PhongMaterial;
import javafx.scene.shape.Box;
import javafx.scene.shape.DrawMode;
import javafx.scene.shape.MeshView;
import javafx.scene.shape.TriangleMesh;
import javafx.scene.transform.Rotate;
import javafx.stage.Stage;
public class Test extends Application {
private double mousePosX, mousePosY;
private double mouseOldX, mouseOldY;
private final Rotate rotateX = new Rotate(20, Rotate.X_AXIS);
private final Rotate rotateY = new Rotate(-45, Rotate.Y_AXIS);
@Override
public void start(Stage primaryStage) {
// cube
Group group = new Group();
// size of the cube
double size = 400;
group.getTransforms().addAll(rotateX, rotateY);
Image diffuseMap = createImage( size);
// show noise image
ImageView iv = new ImageView( diffuseMap);
iv.setTranslateX(-0.5*size);
iv.setTranslateY(-0.20*size);
iv.setRotate(90);
iv.setRotationAxis(new Point3D(1,0,0));
group.getChildren().add( iv);
// create material out of the noise image
PhongMaterial material = new PhongMaterial();
material.setDiffuseMap(diffuseMap);
// create box with noise diffuse map
Box box = new Box( 100,100,100);
box.setMaterial(material);
group.getChildren().add( box);
// create pyramid with diffuse map
float h = 150; // Height
float s = 150; // Side
TriangleMesh pyramidMesh = new TriangleMesh();
pyramidMesh.getTexCoords().addAll(1,1,1,0,0,1,0,0);
pyramidMesh.getPoints().addAll(
0, 0, 0, // Point 0 - Top
0, h, -s/2, // Point 1 - Front
-s/2, h, 0, // Point 2 - Left
s/2, h, 0, // Point 3 - Back
0, h, s/2 // Point 4 - Right
);
pyramidMesh.getFaces().addAll(
0,0, 2,0, 1,0, // Front left face
0,0, 1,0, 3,0, // Front right face
0,0, 3,0, 4,0, // Back right face
0,0, 4,0, 2,0, // Back left face
4,0, 1,0, 2,0, // Bottom rear face
4,0, 3,0, 1,0 // Bottom front face
);
MeshView pyramid = new MeshView(pyramidMesh);
pyramid.setDrawMode(DrawMode.FILL);
pyramid.setTranslateY(-250);
// apply material
// TODO: why is the diffuse map not displayed?
pyramid.setMaterial(material);
group.getChildren().add(pyramid);
// scene
StackPane root = new StackPane();
root.getChildren().add(group);
Scene scene = new Scene(root, 1600, 900, true, SceneAntialiasing.BALANCED);
scene.setCamera(new PerspectiveCamera());
// interaction listeners
scene.setOnMousePressed(me -> {
mouseOldX = me.getSceneX();
mouseOldY = me.getSceneY();
});
scene.setOnMouseDragged(me -> {
mousePosX = me.getSceneX();
mousePosY = me.getSceneY();
rotateX.setAngle(rotateX.getAngle()-(mousePosY - mouseOldY));
rotateY.setAngle(rotateY.getAngle()+(mousePosX - mouseOldX));
mouseOldX = mousePosX;
mouseOldY = mousePosY;
});
primaryStage.setResizable(false);
primaryStage.setScene(scene);
primaryStage.show();
}
/**
* Create image with random noise
*/
public Image createImage( double size) {
Random rnd = new Random();
int width = (int) size;
int height = (int) size;
WritableImage wr = new WritableImage(width, height);
PixelWriter pw = wr.getPixelWriter();
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
Color color = Color.rgb(rnd.nextInt( 256), rnd.nextInt( 256), rnd.nextInt( 256));
pw.setColor(x, y, color);
}
}
return wr;
}
public static void main(String[] args) {
launch(args);
}
}
import java.util.Random;
导入javafx.application.application;
导入javafx.geometry.Point3D;
导入javafx.scene.Group;
导入javafx.scene.PerspectiveCamera;
导入javafx.scene.scene;
导入javafx.scene.sceneatialiasing;
导入javafx.scene.image.image;
导入javafx.scene.image.ImageView;
导入javafx.scene.image.PixelWriter;
导入javafx.scene.image.WritableImage;
导入javafx.scene.layout.StackPane;
导入javafx.scene.paint.Color;
导入javafx.scene.paint.PhongMaterial;
导入javafx.scene.shape.Box;
导入javafx.scene.shape.DrawMode;
导入javafx.scene.shape.MeshView;
导入javafx.scene.shape.TriangleMesh;
导入javafx.scene.transform.Rotate;
导入javafx.stage.stage;
公共类测试扩展了应用程序{
私人双鼠标塞,鼠标塞;
私人双鼠标;
私有最终旋转rotateX=新旋转(20,旋转X_轴);
私有最终旋转旋转Y=新旋转(-45,旋转Y_轴);
@凌驾
公共无效开始(阶段primaryStage){
//立方体
组=新组();
//立方体的大小
双倍尺寸=400;
group.getTransforms().addAll(rotateX,rotateY);
图像扩散图=创建图像(大小);
//显示噪声图像
ImageView iv=新的ImageView(扩散图);
iv.setTranslateX(-0.5*尺寸);
iv.setTranslateY(-0.20*尺寸);
iv.设置旋转(90);
iv.设置旋转轴(新点3D(1,0,0));
group.getChildren().add(iv);
//从噪波图像中创建材质
PhongMaterial材质=新的PhongMaterial();
材料。设置扩散图(扩散图);
//使用“噪波漫反射贴图”创建长方体
盒子=新盒子(100100);
箱体材料(材料);
group.getChildren().add(框);
//使用漫反射贴图创建金字塔
浮动h=150;//高度
浮点数s=150;//侧面
三角形网格棱锥网格=新三角形网格();
getTexCoords().addAll(1,1,1,0,0,1,0,0);
pyramidMesh.getPoints().addAll(
0,0,0,//点0-顶部
0,h,-s/2,//点1-前
-s/2,h,0,//点2-左
s/2,h,0,//第3点-返回
0,h,s/2//第4点-右侧
);
pyramidMesh.getFaces().addAll(
0,0,2,0,1,0,//左前面部
0,0,1,0,3,0,//右前方
0,0,3,0,4,0,//右背面
0,0,4,0,2,0,//左背面
4,0,1,0,2,0,//底部背面
4,0,3,0,1,0//底部正面
);
网格视图棱锥体=新网格视图(棱锥体网格);
金字塔.setDrawMode(DrawMode.FILL);
棱锥体。setTranslateY(-250);
//应用材料
//TODO:为什么不显示漫反射贴图?
金字塔。设置材料(材料);
group.getChildren().add(金字塔);
//场面
StackPane root=新的StackPane();
root.getChildren().add(组);
Scene-Scene=新场景(root,1600,900,true,sceneatialiasing.BALANCED);
scene.setCamera(新透视摄像头());
//互动听众
scene.setOnMousePressed(我->{
mouseOldX=me.getSceneX();
mouseOldY=me.getSceneY();
});
scene.setonMouseDrawed(我->{
mousePosX=me.getSceneX();
mousePosY=me.getSceneY();
rotateX.setAngle(rotateX.getAngle()-(mousePosY-mouseOldY));
rotateY.setAngle(rotateY.getAngle()+(mousePosX-mouseOldX));
mouseOldX=mousePosX;
mouseOldY=鼠标点;
});
primaryStage.SetResizeable(假);
初级阶段。场景(场景);
primaryStage.show();
}
/**
*创建带有随机噪声的图像
*/
公共图像createImage(双倍大小){
随机rnd=新随机();
整数宽度=(整数)大小;
整数高度=(整数)大小;
WritableImage wr=新的WritableImage(宽度、高度);
PixelWriter pw=wr.getPixelWriter();
对于(int x=0;x
截图
非常感谢你的帮助 问题
此形状由6个单一形状组成。这四个三角形都在A点相交。
底部有一个矩形,因为它们是三角形,所以创建矩形需要两个三角形。下图显示了该形状的俯视图
如你所见,我们得5分。所以它们必须被加到三角形网格的点上。一个点由三个浮点值(x、y、z)组成的元组组成。所以这个数组总是由3,6,9,…,15等大小组成
质地
如果你想有一个图像作为网格的材质(就像你做的那样),你可以
import java.util.Random;
import javafx.application.Application;
import javafx.geometry.Point3D;
import javafx.scene.Group;
import javafx.scene.PerspectiveCamera;
import javafx.scene.Scene;
import javafx.scene.SceneAntialiasing;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.image.PixelWriter;
import javafx.scene.image.WritableImage;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.paint.PhongMaterial;
import javafx.scene.shape.Box;
import javafx.scene.shape.DrawMode;
import javafx.scene.shape.MeshView;
import javafx.scene.shape.TriangleMesh;
import javafx.scene.transform.Rotate;
import javafx.stage.Stage;
public class Test extends Application {
private double mousePosX, mousePosY;
private double mouseOldX, mouseOldY;
private final Rotate rotateX = new Rotate(20, Rotate.X_AXIS);
private final Rotate rotateY = new Rotate(-45, Rotate.Y_AXIS);
@Override
public void start(Stage primaryStage) {
// cube
Group group = new Group();
// size of the cube
double size = 400;
group.getTransforms().addAll(rotateX, rotateY);
Image diffuseMap = createImage(size);
// show noise image
ImageView iv = new ImageView(diffuseMap);
iv.setTranslateX(-0.5 * size);
iv.setTranslateY(-0.20 * size);
iv.setRotate(90);
iv.setRotationAxis(new Point3D(1, 0, 0));
group.getChildren().add(iv);
// create material out of the noise image
PhongMaterial material = new PhongMaterial();
material.setDiffuseMap(diffuseMap);
// create box with noise diffuse map
Box box = new Box(100, 100, 100);
box.setMaterial(material);
group.getChildren().add(box);
// create pyramid with diffuse map
float h = 150; // Height
float s = 150; // Side
float hs = s / 2;
// coordinates of the mapped image
float x0 = 0.0f;
float y0 = 0.0f;
float x1 = 1.0f;
float y1 = 1.0f;
TriangleMesh pyramidMesh = new TriangleMesh();
pyramidMesh.getPoints().addAll( //
0.0f, 0.0f, 0.0f, // A 0 Top of Pyramid
hs, h, -hs, // B 1
hs, h, hs, // C 2
-hs, h, hs, // D 3
-hs, h, -hs // E 4
);
pyramidMesh.getTexCoords().addAll( //
x0, y0, // 0
x0, y1, // 1
x1, y0, // 2
x1, y1 // 3
);
pyramidMesh.getFaces().addAll(// index of point, index of texture, index of point, index of texture, index of point, index of texture
0, 0, 1, 1, 2, 3, // ABC (counter clockwise)
0, 0, 2, 1, 3, 3, // ACD (counter clockwise)
0, 0, 3, 1, 4, 3, // ADE (counter clockwise)
0, 0, 4, 1, 1, 3, // AEB (counter clockwise)
4, 0, 3, 1, 2, 3, // EDC (Bottom first triangle clock wise)
2, 0, 1, 1, 4, 3 // CBE (Bottom second triangle clock wise)
);
MeshView pyramid = new MeshView();
pyramid.setMesh(pyramidMesh);
pyramid.setDrawMode(DrawMode.FILL);
pyramid.setTranslateY(-250);
// apply material
// TODO: why is the diffuse map not displayed?
pyramid.setMaterial(material);
group.getChildren().add(pyramid);
// scene
StackPane root = new StackPane();
root.getChildren().add(group);
Scene scene = new Scene(root, 1600, 900, true, SceneAntialiasing.BALANCED);
scene.setCamera(new PerspectiveCamera());
// interaction listeners
scene.setOnMousePressed(me -> {
mouseOldX = me.getSceneX();
mouseOldY = me.getSceneY();
});
scene.setOnMouseDragged(me -> {
mousePosX = me.getSceneX();
mousePosY = me.getSceneY();
rotateX.setAngle(rotateX.getAngle() - (mousePosY - mouseOldY));
rotateY.setAngle(rotateY.getAngle() + (mousePosX - mouseOldX));
mouseOldX = mousePosX;
mouseOldY = mousePosY;
});
primaryStage.setResizable(false);
primaryStage.setScene(scene);
primaryStage.show();
}
/**
* Create image with random noise
*/
public Image createImage(double size) {
Random rnd = new Random();
int width = (int) size;
int height = (int) size;
WritableImage wr = new WritableImage(width, height);
PixelWriter pw = wr.getPixelWriter();
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
Color color = Color.rgb(rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256));
pw.setColor(x, y, color);
}
}
return wr;
}
public static void main(String[] args) {
launch(args);
}
}