簡體   English   中英

Java3D 1.5.1-如何在Box零件上放置不同的紋理?

[英]Java3D 1.5.1 - How to place different textures on Box parts?

我試圖在Box側面放置不同的紋理,但沒有成功。

這是我的代碼:

BufferedImage texture1 =  ...; // brown image
BufferedImage texture2 =  ...; // green image

Box box = new Box(1f, 1f, 1f, Box.GENERATE_TEXTURE_COORDS, new Appearance());

TextureAttributes ta = new TextureAttributes();
ta.setTextureMode(TextureAttributes.MODULATE);

Appearance app = new Appearance();
app.setTexCoordGeneration(new TexCoordGeneration(TexCoordGeneration.OBJECT_LINEAR, TexCoordGeneration.TEXTURE_COORDINATE_2));
app.setTexture(new TextureLoader(texture1).getTexture());
app.setTextureAttributes(ta);
box.setAppearance(Box.TOP, app);

Appearance app2 = new Appearance();
app2.setTexCoordGeneration(new TexCoordGeneration(TexCoordGeneration.OBJECT_LINEAR, TexCoordGeneration.TEXTURE_COORDINATE_2));
app2.setTexture(new TextureLoader(texture2).getTexture());
app2.setTextureAttributes(ta);
box.setAppearance(Box.RIGHT, app2);

結果:

生成框

好了,它把圖像放在了兩面,但是正如您所看到的,它們是模糊的。

我認為這可能是由錯誤的TexCoordGeneration應用於側面的外觀引起的。 但是我也不確定是否用正確的參數創建Box實例。

我該如何解決?

非常感謝您的回答!

好的,我通過使用Vector4f對象生成自己的TexCoordGeneration對象來Vector4f

碼:

app.setTexCoordGeneration(this.generateTexCoord(box.getShape(Box.TOP)));

和方法generateTexCoord()

private TexCoordGeneration generateTexCoord(Shape3D shape) {
    BoundingBox bb = new BoundingBox(shape.getBounds());
    Point3d lower = new Point3d();
    Point3d upper = new Point3d();
    bb.getLower(lower);
    bb.getUpper(upper);

    double width = upper.x - lower.x;
    double height = upper.y - lower.y;
    double deep = upper.z - lower.z;
    Vector4f planeX = new Vector4f((float)(1.0/width), 0.0f, 0.0f, (float)(-lower.x/width));
    Vector4f planeY = new Vector4f(0.0f, (float)(1.0/height), 0.0f, (float)(-lower.y/height));
    Vector4f planeZ = new Vector4f(0.0f, 0.0f, (float)(1.0/deep), (float)(-lower.z/deep));

    TexCoordGeneration tcg = new TexCoordGeneration(TexCoordGeneration.OBJECT_LINEAR, TexCoordGeneration.TEXTURE_COORDINATE_2);
    if(width == 0) { // RIGHT, LEFT: YZ
        tcg.setPlaneS(planeZ);
        tcg.setPlaneT(planeY);
    } else if(height == 0) { // TOP, BOTTOM: XZ
        tcg.setPlaneS(planeX);
        tcg.setPlaneT(planeZ);
    } else { // FRONT, BACK: XY
        tcg.setPlaneS(planeX);
        tcg.setPlaneT(planeY);
    }
    return tcg;
}

希望對遇到同樣問題的人有所幫助。 :)

我遇到了與您相同的問題,我在互聯網上閱讀網頁,並且用不同的紋理完成了立方體的所有工作。 我使用了計算機上的圖像。 希望它對每個人都有效,我花了三天時間!

protected Node buildShape() {

    TextureLoader loader;
    Texture texture; 

    Box caja=new Box(1.5f,1.5f,1.5f,Box.GENERATE_TEXTURE_COORDS,new Appearance());
    Appearance ap = new Appearance();

    loader = new TextureLoader("blue.jpg",this);
    texture = loader.getTexture();
    ap.setTexture(texture);
    caja.setAppearance(Box.BACK,ap);

    Appearance ap2 = new Appearance();

    loader = new TextureLoader("white.jpg",this);
    texture = loader.getTexture();
    ap2.setTexture(texture);
    caja.setAppearance(Box.TOP,ap2);

    Appearance ap3 = new Appearance();

    loader = new TextureLoader("red.jpg",this);
    texture = loader.getTexture();
    ap3.setTexture(texture);
    caja.setAppearance(Box.BOTTOM,ap3);

    Appearance ap4 = new Appearance();

    loader = new TextureLoader("green.jpg",this);
    texture = loader.getTexture();
    ap4.setTexture(texture);
    caja.setAppearance(Box.LEFT,ap4);

    Appearance ap5 = new Appearance();

    loader = new TextureLoader("orange.jpg",this);
    texture = loader.getTexture();
    ap5.setTexture(texture);
    caja.setAppearance(Box.RIGHT,ap5);

     Appearance ap6 = new Appearance();

    loader = new TextureLoader("yellow.jpg",this);
    texture = loader.getTexture();
    ap6.setTexture(texture);
    caja.setAppearance(Box.FRONT,ap6);

    return caja;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM