Вопрос: Свет и текстуры в Java3D


Моя проблема заключается в различии между этим:

earths

и это:

spheres

Я пытаюсь создать красивую солнечную систему с Java3D, но когда я применяю текстуру, эффект освещения исчезает, и 3D-эффект (когда он не смотрит на планету сверху вниз) идет с ним. Как я могу иметь такой оттенок на текстурированных поверхностях?

Код, который я использовал для примера земли, приведен ниже. Текстура загружаема Вот ,

import com.sun.j3d.utils.geometry.Primitive;
import com.sun.j3d.utils.geometry.Sphere;
import com.sun.j3d.utils.image.TextureLoader;
import com.sun.j3d.utils.universe.SimpleUniverse;

import javax.imageio.ImageIO;
import javax.media.j3d.*;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
import javax.vecmath.Vector3d;

import java.awt.*;

import static java.lang.Math.PI;
import static java.lang.Math.cos;
import static java.lang.Math.sin;

public class Hello3d {

    public Hello3d()

    {

        SimpleUniverse universe = new SimpleUniverse();

        BranchGroup group = new BranchGroup();

        for(double i=0; i<2*PI; i+=PI/5) {
            group.addChild(basicSphere(0.8*cos(i),0.8*sin(i),0));
        }

        universe.getViewingPlatform().setNominalViewingTransform();

        BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 10000000.0);

        PointLight light = new PointLight();
        light.setColor(new Color3f(Color.WHITE));
        light.setPosition(0.0f,0.0f,0.0f);
        light.setInfluencingBounds(bounds);
        group.addChild(light);


        universe.addBranchGraph(group);

    }

    public static void main( String[] args ) {

        new Hello3d();

    }

    private TransformGroup basicSphere(double x, double y, double z) {
        try {
        int primflags = Primitive.GENERATE_NORMALS + Primitive.GENERATE_TEXTURE_COORDS;

        Texture tex = new TextureLoader(
                ImageIO.read(getClass().getResource("earthmap.jpg"))
        ).getTexture();
        tex.setBoundaryModeS(Texture.WRAP);
        tex.setBoundaryModeT(Texture.WRAP);

        TextureAttributes texAttr = new TextureAttributes();
        texAttr.setTextureMode(TextureAttributes.REPLACE);

        Appearance ap = new Appearance();
        ap.setTexture(tex);
        ap.setTextureAttributes(texAttr);

        Sphere sphere = new Sphere(0.1f, primflags, 100, ap);

        Transform3D transform = new Transform3D();
        transform.setTranslation(new Vector3d(x, y, z));

        TransformGroup transformGroup = new TransformGroup();
        transformGroup.setTransform(transform);

        transformGroup.addChild(sphere);

        return transformGroup;
        } catch(Exception e) { e.printStackTrace(); }
        return null;
    }

}

5


источник


Ответы:


С этим:

   texAttr.setTextureMode(TextureAttributes.REPLACE);

вы говорите, чтобы заменить вычисленное значение освещенности значением из текстуры. Вы хотите использовать MODULATE или BLEND, в зависимости от того, как именно вы хотите, чтобы он выглядел. Проверьте это  чтобы увидеть, что делают разные методы.


2