Как рисовать простые 3D-точки (x, y, z) в java с помощью Java3D API?

Я делаю настольное приложение на платформе netbeans с использованием технологии Java. Я сделал некоторую обработку изображений, функциональность базы данных, процесс захвата изображения; но теперь я хочу рисовать изображения в 3D-виде.
Итак, я думаю, прежде всего, мне нужно создать массив точек из моего 16-битного изображения в оттенках серого в формате .tiff, а затем использовать этот массив точек. Я что-то пробовал, и мой код ниже, но он не работает.
Итак, как мне использовать этот массив точек для рисования моего изображения в 3D-виде?

import java.awt.BorderLayout;
import com.sun.j3d.utils.universe.*;
import java.awt.image.BufferedImage;
import javax.media.j3d.*;
import javax.media.jai.JAI;
import javax.media.jai.PlanarImage;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.vecmath.Color3f;
import javax.vecmath.Point3f;

public final class HelloJava3Da extends JPanel {

    PlanarImage plImg3 = JAI.create("fileload", "C:\\Users\\Desktop\\myImage.tiff");
    BufferedImage histImage = plImg3.getAsBufferedImage();
    int s = 0, count = 0;

    public HelloJava3Da() {
        setLayout(new BorderLayout());
        Canvas3D canvas3D = new Canvas3D(null);
        add("Center", canvas3D);

        BranchGroup scene = createSceneGraph();
        scene.compile();

        // SimpleUniverse is a Convenience Utility class
        SimpleUniverse simpleU = new SimpleUniverse(canvas3D);


        // This moves the ViewPlatform back a bit so the
        // objects in the scene can be viewed.
        simpleU.getViewingPlatform().setNominalViewingTransform();

        simpleU.addBranchGraph(scene);
    }
    public BranchGroup createSceneGraph() {
        BranchGroup lineGroup = new BranchGroup();
        Appearance app = new Appearance();
        ColoringAttributes ca = new ColoringAttributes(new Color3f(204.0f, 204.0f,          204.0f), ColoringAttributes.SHADE_FLAT);
        app.setColoringAttributes(ca);

        Point3f[] plaPts = new Point3f[histImage.getWidth()*histImage.getHeight()];

        for (int i = 0; i < histImage.getWidth(); i++) {
            for (int j = 0; j < histImage.getHeight(); j++) {
                s=histImage.getRaster().getSample(i, j, 0);
                plaPts[count] = new Point3f(i,j,s);
                count++;
            }
        }
        PointArray pla = new PointArray(histImage.getWidth()*histImage.getHeight(), GeometryArray.COORDINATES);
        pla.setCoordinates(0, plaPts);
        Shape3D plShape = new Shape3D(pla, app);
        TransformGroup objRotate = new TransformGroup();
        objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        objRotate.addChild(plShape);
        lineGroup.addChild(objRotate);
        return lineGroup;
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.add(new JScrollPane(new HelloJava3Da()));
        frame.setSize(300, 300);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

person Jay    schedule 07.09.2012    source источник
comment
Вы видите черный экран?   -  person huseyin tugrul buyukisik    schedule 07.09.2012
comment
Хорошо, если вы не укажете размер точки, вы почти ничего не увидите, потому что это всего лишь массив точек шириной в 1 пиксель. Если вы хотите связать их, используйте linestriparray. Если вам нужна поверхность, используйте массив треугольников, или треугольники, или треугольники, или треугольники, и треугольники. После всего этого вы указываете стиль многоугольника как линию заливки или точку.   -  person huseyin tugrul buyukisik    schedule 07.09.2012
comment
@tuğrulbüyükışık, не могли бы вы изменить мой код, пожалуйста? я не умею это делать.   -  person Jay    schedule 07.09.2012
comment
Хорошо, вы даете своим очкам целые числа. Например, 1 — это большая длина для начальной формы. Я имею в виду, что ваше построение массива точек предназначено для высоты вашего изображения, которая может быть 800 — слишком большой. Разделите на 1000, пожалуйста.   -  person huseyin tugrul buyukisik    schedule 07.09.2012
comment
ширина моего изображения составляет 1580, а высота - 1050, потому что мое изображение представляет собой 16-битное изображение в формате tiff, которое исходит от датчика наших зубов.   -  person Jay    schedule 07.09.2012
comment
Взгляните на мой вопрос здесь, если это удовлетворит ваши потребности, я создам для вас простой алгоритм рисования с 4 точками, но я собираюсь выполнить важную работу за 6,5 часов. Здесь: stackoverflow.com/questions/12314324/   -  person huseyin tugrul buyukisik    schedule 07.09.2012
comment
@tuğrulbüyükışık, да удовлетворяет.   -  person Jay    schedule 07.09.2012
comment
Я обновил с несколькими изменениями, потому что у меня не было размолвки. Но вы можете снова поставить части, которые я пропустил. Я просто добавил несколько вещей.   -  person huseyin tugrul buyukisik    schedule 07.09.2012
comment
Ставлю 4 балла за ответ. Можете ли вы прислать мне файл tiff, чтобы я мог попробовать ваше приложение с tiff или как я могу его создать?   -  person huseyin tugrul buyukisik    schedule 07.09.2012
comment
я добавил взаимодействие с мышью в последнем примере.   -  person huseyin tugrul buyukisik    schedule 07.09.2012
comment
@tuğrulbüyükışık я сделал изображение в 3D-виде, но оно показывает белое изображение и черный фон. теперь я хочу придать цвет определенной точке изображения. Итак, как это сделать? Я сделал и нарисовал изображение из массива точек изображения.   -  person Jay    schedule 08.09.2012
comment
вам нужно установить излучающий цвет для пользовательских цветов без необходимости освещения. Если вы используете только точки, вы просто меняете цвет точек с помощью класса атрибутов точек.   -  person huseyin tugrul buyukisik    schedule 08.09.2012
comment
я использовал Color[] для просмотра цвета Point3f[] в PointArray, но он дает цвет RGB, и я хочу использовать цвет GrayScale. Мое изображение .tiff, 16 бит и шкала серого. Итак, как я могу использовать атрибуты точки для установки цвета (оттенки серого) точек. Если у вас есть простой пример установки цвета точки с использованием атрибута точки. тогда предложите мне.   -  person Jay    schedule 08.09.2012
comment
Мне очень жаль, но мне пришлось работать еще 2 часа. тогда я составлю другой пример   -  person huseyin tugrul buyukisik    schedule 08.09.2012
comment
Оттенки серого ---- › просто приведите его к плавающему значению, затем используйте его для всех 3 параметров (r g b) Color3f (r, g, b) Color3f (gry, gry, gry)   -  person huseyin tugrul buyukisik    schedule 08.09.2012
comment
@tuğrulbüyükışık. да, ты прав. я знаю для изображения в градациях серого R = G = B. но как использовать Color3f[] или Color4f[] для установки цвета этой конкретной точки?   -  person Jay    schedule 08.09.2012
comment
Хорошо, добавил последнее изменение в конец ответа. Радоваться, веселиться.   -  person huseyin tugrul buyukisik    schedule 08.09.2012
comment
@tuğrulbüyükışık, как сделать треугольникArray[] из этого Point3f[]? и могу ли я использовать TriangleArray[] для создания 3D-изображения? что лучше TriangleArray[] или PointArray[]?   -  person Jay    schedule 09.09.2012
comment
если вы используете только разные элементы для массива треугольников, вокруг будут разделенные треугольники. Если вы хотите соединить их вместе, вы используете координаты двойного использования (используются дважды), чтобы объединить их.   -  person huseyin tugrul buyukisik    schedule 09.09.2012
comment
У тебя есть изменение цвета, которое я написал в ответ?   -  person huseyin tugrul buyukisik    schedule 09.09.2012
comment
Для вашей ситуации массив точек — это круто, потому что у вас есть миллионы точек, и ваше изображение на самом деле 2D, верно?   -  person huseyin tugrul buyukisik    schedule 09.09.2012
comment
Если вы хотите добавить глубины проецируемому изображению, вы можете изменить координату Z точки в соответствии с ее цветом. TriangleArray похож на PointArray, но вам нужно знать, что последовательные 3 точки образуют треугольник, когда вы выбираете POLYGON.LINE, и если вы хотите видеть поверхность, используйте POLYGON.FILL в атрибутах полигона. У меня есть аналогичная вещь в (последнем-1)-м примере, который я дал   -  person huseyin tugrul buyukisik    schedule 09.09.2012
comment
@tuğrulbüyükışık ya, у меня есть цвет, и я не могу понять одну вещь: как дать Vertex означает Vectore3f[] для установки нормалей TriangleArray?   -  person Jay    schedule 09.09.2012
comment
Он автоматически генерирует нормали, если вы определяете это в свойствах полигона. как CULL_FACE CULL_BACK CULL_NONE   -  person huseyin tugrul buyukisik    schedule 09.09.2012
comment
@tuğrulbüyükışık означает, что я беру Point3f[] из изображения и создаю один объект PointArray pla и pla.setCordinates(0,Point3f[]), и я не устанавливаю нормали, такие как setNormals(0,Vectore3f[]). поэтому мой письменный код дает мне изображение, но не очень хорошее по сравнению с PointArray. Итак, в моем коде есть ошибка? или не?   -  person Jay    schedule 09.09.2012
comment
@tuğrulbüyükışık, эй, чувак, как подсветить это мое 3D-изображение? означает, что я хочу дать рассеянный свет моему 3D-изображению. Итак, как я могу это сделать?   -  person Jay    schedule 10.09.2012
comment
Хм, рассеянного света нет :) можно поподробнее?   -  person huseyin tugrul buyukisik    schedule 10.09.2012
comment
Вы хотите добавить вектор нормали для каждой точки? Это сделано в последнем примере   -  person huseyin tugrul buyukisik    schedule 10.09.2012
comment
@tuğrulbüyükışık хорошо, чувак. большое спасибо.   -  person Jay    schedule 10.09.2012
comment
Вы можете использовать триангулятор для вашего изображения, чтобы получить 3D-форму (или поверхность). В последнем редактировании есть пример.   -  person huseyin tugrul buyukisik    schedule 10.09.2012
comment
@tuğrulbüyükışık, теперь я сделал идеальное 3D-изображение 16-битного изображения .tiff в java3D. большое спасибо маннннн.   -  person Jay    schedule 19.09.2012
comment
@tuğrulbüyükışık, привет, чувак. Теперь 1 вещь раздражает, что, когда я запускаю 3Dapp в XP или ПК с низкой графической конфигурацией, в то время создание 3Dimage занимает так много времени. я думаю, что эта проблема из-за того, что я использовал объект GraphicsConfiguration в коде. GraphicsConfiguration gc=SimpleUniverse.getPreferredConfiguration();. а в некоторых ноутбуках, таких как i5, 4 ГБ ОЗУ и некоторые графические карты, тогда на этом компьютере мое 3DApp делает 3D-изображение быстрее (через 2 секунды после щелчка). Итак, как я могу сделать общий код для запуска моего 3DApp, который не требует больше времени для создания 3D-изображения?   -  person Jay    schedule 29.09.2012
comment
Это превышает мои пределы :), но java3D должен использовать для этого процессор. Вы должны задать новый вопрос для этого. У меня нет времени искать сейчас. Мне жаль :(.   -  person huseyin tugrul buyukisik    schedule 30.09.2012


Ответы (1)


Создайте SimpleUniverse и Canvas3D с помощью класса SimpleUniverse.getPreferredConfiguration() GraphicsConfiguration. Затем создайте BranchGraph. Добавьте TransformGraph в качестве дочернего элемента BranchGraph. Затем добавьте свой Shape3D в качестве дочернего элемента TransformGraph. Shape3D должен иметь 2 вещи: геометрию (ваш массив точек) и внешний вид. Из внешнего вида вы делаете много спецификаций материала и освещения.

Если вы просто используете массив точек, вы видите только точки. Следует использовать TriangleStripArray или что-то подобное, если вы хотите заполнить многоугольники или LineStripArray, если вам нужны линии.

Используйте TransformGroup для вращения и перемещения. Не забудьте также добавить света.

TransformGroup требуется класс Transform3D в качестве параметра для поворота, перемещения или масштабирования.

Если ваш Shape3D представляет собой поверхность, вы можете придать ей собственный цвет или использовать материал и поместить свет рядом с ней, иначе вы не сможете ее увидеть. Не забудьте установить диапазон ограничения источника света, чтобы свет достигал объекта.

  • PointArray ---> Облакоподобные формы
  • LineArray ---> Для пунктирной линии
  • LineStripArray --> для строк
  • TriangleArray ---> разведенные треугольники (для поверхности)
  • TriangleStripArray --- > соседние треугольники (для поверхности)
  • TriangleFanArray ----> как построение треугольников вокруг точки (для поверхности)
  • QuadArray ----> Нужно шесть квадроциклов, чтобы получился куб
  • QuadStripArray ---> Может построить куб с меньшим массивом координат

Еще одна важная вещь:

simpleU.getViewingPlatform().getViewPlatform().setActivationRadius(300);
    SimpleU.getViewer().getView().setBackClipDistance ( 300.0 );

делает ваш диапазон обзора еще больше, чтобы объект не исчезал, когда вы двигаетесь.

Прикрепите взаимодействие с мышью к вашей группе преобразования

    MouseRotate m1=new MouseRotate();
    MouseZoom m2=new MouseZoom();
    MouseTranslate m3=new MouseTranslate();

Если вы хотите сопоставить изображение 1580 x 1050 с вашим диапазоном 3D-просмотра по умолчанию, вы должны разделить координаты точки на 1000 (или уменьшить масштаб до 1000 в группе преобразования).

Ищите учебники:

http://www.java3d.org/

http://www.java3d.org/tutorial.html

Здесь я переделал ваш учебник в energon.class.

//skipped imports(char limit in this post)
public final class energon extends JPanel {


    int s = 0, count = 0;

    public energon() {
        setLayout(new BorderLayout());
        GraphicsConfiguration gc=SimpleUniverse.getPreferredConfiguration();
        Canvas3D canvas3D = new Canvas3D(gc);//See the added gc? this is a preferred config
        add("Center", canvas3D);

        BranchGroup scene = createSceneGraph();
        scene.compile();

        // SimpleUniverse is a Convenience Utility class
        SimpleUniverse simpleU = new SimpleUniverse(canvas3D);


        // This moves the ViewPlatform back a bit so the
        // objects in the scene can be viewed.
        simpleU.getViewingPlatform().setNominalViewingTransform();

        simpleU.addBranchGraph(scene);
    }
    public BranchGroup createSceneGraph() {
        BranchGroup lineGroup = new BranchGroup();
        Appearance app = new Appearance();
        ColoringAttributes ca = new ColoringAttributes(new Color3f(204.0f, 204.0f,          204.0f), ColoringAttributes.SHADE_FLAT);
        app.setColoringAttributes(ca);

        Point3f[] plaPts = new Point3f[4];

        for (int i = 0; i < 2; i++) {
            for (int j = 0; j <2; j++) {
                plaPts[count] = new Point3f(i/10.0f,j/10.0f,0);
                //Look up line, i and j are divided by 10.0f to be able to
                //see the points inside the view screen
                count++;
            }
        }
        PointArray pla = new PointArray(4, GeometryArray.COORDINATES);
        pla.setCoordinates(0, plaPts);
        Shape3D plShape = new Shape3D(pla, app);
        TransformGroup objRotate = new TransformGroup();
        objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        objRotate.addChild(plShape);
        lineGroup.addChild(objRotate);
        return lineGroup;
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.add(new JScrollPane(new energon()));
        frame.setSize(300, 300);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

Выход:

введите здесь описание изображения

Хорошо, давайте добавим размер в пунктах, чтобы мы могли ясно их видеть (добавлю через минуту)

Новый код(просто добавил 2-3 строчки)

import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;

import com.sun.j3d.utils.universe.*;

import java.awt.image.BufferedImage;
import javax.media.j3d.*;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.vecmath.Color3f;
import javax.vecmath.Point3f;

public final class energon extends JPanel {


    int s = 0, count = 0;

    public energon() {
        setLayout(new BorderLayout());
        GraphicsConfiguration gc=SimpleUniverse.getPreferredConfiguration();
        Canvas3D canvas3D = new Canvas3D(gc);
        add("Center", canvas3D);

        BranchGroup scene = createSceneGraph();
        scene.compile();

        // SimpleUniverse is a Convenience Utility class
        SimpleUniverse simpleU = new SimpleUniverse(canvas3D);


        // This moves the ViewPlatform back a bit so the
        // objects in the scene can be viewed.
        simpleU.getViewingPlatform().setNominalViewingTransform();

        simpleU.addBranchGraph(scene);
    }
    public BranchGroup createSceneGraph() {
        BranchGroup lineGroup = new BranchGroup();
        Appearance app = new Appearance();
        ColoringAttributes ca = new ColoringAttributes(new Color3f(204.0f, 204.0f,          204.0f), ColoringAttributes.SHADE_FLAT);
        app.setColoringAttributes(ca);

        Point3f[] plaPts = new Point3f[4];

        for (int i = 0; i < 2; i++) {
            for (int j = 0; j <2; j++) {
                plaPts[count] = new Point3f(i/10.0f,j/10.0f,0);
                count++;
            }
        }
        PointArray pla = new PointArray(4, GeometryArray.COORDINATES);

        pla.setCoordinates(0, plaPts);
        //between here!
        PointAttributes a_point_just_bigger=new PointAttributes();
        a_point_just_bigger.setPointSize(10.0f);//10 pixel-wide point
        a_point_just_bigger.setPointAntialiasingEnable(true);//now points are sphere-like(not a cube)
        app.setPointAttributes(a_point_just_bigger);
        //and here! sets the point-attributes so it is easily seen.
        Shape3D plShape = new Shape3D(pla, app);
        TransformGroup objRotate = new TransformGroup();
        objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        objRotate.addChild(plShape);
        lineGroup.addChild(objRotate);
        return lineGroup;
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.add(new JScrollPane(new energon()));
        frame.setSize(300, 300);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

выход:

введите здесь описание изображения

Вот еще одно использование треугольников, чтобы нарисовать своего рода стрелку, в то время как вы можете увеличивать масштаб, вращать и переводить с помощью кнопок мыши (3 из них).

//skipped imports beause of char limit in this post
public final class energon extends JPanel {



    int s = 0, count = 0;

    public energon() {
        setLayout(new BorderLayout());
        GraphicsConfiguration gc=SimpleUniverse.getPreferredConfiguration();
        Canvas3D canvas3D = new Canvas3D(gc);
        add("Center", canvas3D);

        BranchGroup scene = createSceneGraph();
        scene.compile();

        // SimpleUniverse is a Convenience Utility class
        SimpleUniverse simpleU = new SimpleUniverse(canvas3D);


        // This moves the ViewPlatform back a bit so the
        // objects in the scene can be viewed.
        simpleU.getViewingPlatform().setNominalViewingTransform();

        simpleU.addBranchGraph(scene);
    }
    public BranchGroup createSceneGraph() {
        BranchGroup lineGroup = new BranchGroup();
        Appearance app = new Appearance();
        ColoringAttributes ca = new ColoringAttributes(new Color3f(204.0f, 204.0f,204.0f), ColoringAttributes.SHADE_FLAT);
        app.setColoringAttributes(ca);
        Point3f[] plaPts = new Point3f[5];
        for (int i = 0; i < 2; i++) {
            for (int j = 0; j <2; j++) {
                plaPts[count] = new Point3f(i/10.0f,j/10.0f,0);
                count++;
            }
        }
        plaPts[count] = new Point3f(3.0f/10.0f,2.0f/10.0f,0);
        int[]intArr=new int[5];
        intArr[0]=3;intArr[1]=4;intArr[2]=4;intArr[3]=3;intArr[4]=3;

        TriangleStripArray pla =new TriangleStripArray(20, GeometryArray.COLOR_3|GeometryArray.NORMALS|GeometryArray.COORDINATES,intArr);
        pla.setCoordinates(0, plaPts);
        PointAttributes a_point_just_bigger=new PointAttributes();
        a_point_just_bigger.setPointSize(10.0f);//10 pixel-wide point
        a_point_just_bigger.setPointAntialiasingEnable(true);//now points are sphere-like(not a cube)
        app.setPointAttributes(a_point_just_bigger);
        PolygonAttributes la=new PolygonAttributes();
        la.setPolygonMode(PolygonAttributes.POLYGON_FILL);
        la.setCullFace(PolygonAttributes.CULL_NONE);
        app.setPolygonAttributes(la);
        Material matt=new Material();
        matt.setAmbientColor(new Color3f(1,1,1));
        matt.setDiffuseColor(new Color3f(0.5f,0.5f,0.7f));
        matt.setEmissiveColor(new Color3f(0.2f,0.2f,0.3f));
        matt.setShininess(0.5f);
        matt.setSpecularColor(new Color3f(0.4f,0.6f,0.9f));
        matt.setLightingEnable(true);

        app.setMaterial(matt);
        RenderingAttributes ra=new RenderingAttributes();
        ra.setIgnoreVertexColors(true);
        app.setRenderingAttributes(ra);
        Shape3D plShape = new Shape3D(pla, app);

        TransformGroup objRotate = new TransformGroup();

        MouseRotate mr=new MouseRotate();
        mr.setTransformGroup(objRotate);
        mr.setSchedulingBounds(new BoundingSphere());
        lineGroup.addChild(mr);
        MouseZoom mz=new MouseZoom();
        mz.setTransformGroup(objRotate);
        mz.setSchedulingBounds(new BoundingSphere());
        lineGroup.addChild(mz);
        MouseTranslate msl=new MouseTranslate();
        msl.setTransformGroup(objRotate);
        msl.setSchedulingBounds(new BoundingSphere());
        lineGroup.addChild(msl);


        objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        objRotate.addChild(plShape);
        AmbientLight al=new AmbientLight();
      //  al.addScope(objRotate);
        al.setBounds(new BoundingSphere());
        al.setEnable(true);
        al.setColor(new Color3f(1,1,1));

        lineGroup.addChild(objRotate);
        lineGroup.addChild(al);
        return lineGroup;
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.add(new JScrollPane(new energon()));
        frame.setSize(300, 300);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

выход:

введите здесь описание изображения

Вы хотите изменить цвет точек? Вот новая версия:

//skipping imports..
public final class energon extends JPanel {


    int s = 0, count = 0;

    public energon() {
        setLayout(new BorderLayout());
        GraphicsConfiguration gc=SimpleUniverse.getPreferredConfiguration();
        Canvas3D canvas3D = new Canvas3D(gc);
        add("Center", canvas3D);

        BranchGroup scene = createSceneGraph();
        scene.compile();
        // SimpleUniverse is a Convenience Utility class
        SimpleUniverse simpleU = new SimpleUniverse(canvas3D);
        // This moves the ViewPlatform back a bit so the
        // objects in the scene can be viewed.
        simpleU.getViewingPlatform().setNominalViewingTransform();
        simpleU.addBranchGraph(scene);
    }
    public BranchGroup createSceneGraph() {
        BranchGroup lineGroup = new BranchGroup();
        Appearance app = new Appearance();
        ColoringAttributes ca = new ColoringAttributes(new Color3f(204.0f, 204.0f,          204.0f), ColoringAttributes.SHADE_FLAT);
        app.setColoringAttributes(ca);

        Point3f[] plaPts = new Point3f[4];
        Color3f[] colPts=new Color3f[4]; //parallel to coordinates, colors.
        for (int i = 0; i < 2; i++) {
            for (int j = 0; j <2; j++) {
                plaPts[count] = new Point3f(i/10.0f,j/10.0f,0);
                colPts[count]=new Color3f(i/3.0f,j/3.0f,(float) ((i+j)/3.0));//my arbitrary color set :)
                count++;
            }
        }
        PointArray pla = new PointArray(4, GeometryArray.COORDINATES|GeometryArray.COLOR_3);
        pla.setColors(0,colPts); //this is the color-array setting
        pla.setCoordinates(0, plaPts); 
        //between here!
        PointAttributes a_point_just_bigger=new PointAttributes();
        a_point_just_bigger.setPointSize(10.0f);//10 pixel-wide point

        a_point_just_bigger.setPointAntialiasingEnable(true);//now points are sphere-like(not a cube)
        app.setPointAttributes(a_point_just_bigger);
        //and here! sets the point-attributes so it is easily seen.
        Shape3D plShape = new Shape3D(pla, app);
        TransformGroup objRotate = new TransformGroup();
        objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        objRotate.addChild(plShape);
        lineGroup.addChild(objRotate);
        return lineGroup;
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.add(new JScrollPane(new energon()));
        frame.setSize(300, 300);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

Выход:

введите здесь описание изображения

Новый пример с пользовательской формой куба и двумя направленными источниками света при взаимодействии с левой кнопкой мыши:

//skipped imports relating with char limit in this post
public final class energon extends JPanel {
    int s = 0, count = 0;

    public energon() {

        setLayout(new BorderLayout());
        GraphicsConfiguration gc=SimpleUniverse.getPreferredConfiguration();
        Canvas3D canvas3D = new Canvas3D(gc);
        add("Center", canvas3D);

        BranchGroup scene = createSceneGraph();
        scene.compile();

        // SimpleUniverse is a Convenience Utility class
        SimpleUniverse simpleU = new SimpleUniverse(canvas3D);


        // This moves the ViewPlatform back a bit so the
        // objects in the scene can be viewed.
        simpleU.getViewingPlatform().setNominalViewingTransform();

        simpleU.addBranchGraph(scene);
    }
    public BranchGroup createSceneGraph() {
        BranchGroup lineGroup = new BranchGroup();
        Appearance app = new Appearance();

        QuadArray lsa = new QuadArray(48,QuadArray.COORDINATES|QuadArray.NORMALS);
        Vector3f [] normals=new Vector3f[24];
        for(int i=0;i<24;i++)normals[i]=new Vector3f();
        Point3f [] pts=new Point3f[24];
        for(int i=0;i<24;i++)pts[i]=new Point3f();
        Color3f [] clrs=new Color3f[24];
        for(int i=0;i<24;i++)clrs[i]=new Color3f(0.5f,0.5f,0.5f);
        //cube=6 quads 
        //first quad
        pts[0].x=-0.5f;pts[0].y=-0.5f;pts[0].z=-0.5f;
        pts[1].x=-0.5f;pts[1].y=-0.5f;pts[1].z=0.5f;
        pts[2].x=-0.5f;pts[2].y=0.5f;pts[2].z=0.5f;
        pts[3].x=-0.5f;pts[3].y=0.5f;pts[3].z=-0.5f;
        normals[0].x=-1;normals[1].x=-1;normals[2].x=-1;normals[3].x=-1;
        //second quad
        pts[4].x=0.5f;pts[4].y=-0.5f;pts[4].z=-0.5f;
        pts[5].x=0.5f;pts[5].y=-0.5f;pts[5].z=0.5f;
        pts[6].x=0.5f;pts[6].y=0.5f;pts[6].z=0.5f;
        pts[7].x=0.5f;pts[7].y=0.5f;pts[7].z=-0.5f;
        normals[4].x=1;normals[5].x=1;normals[6].x=1;normals[7].x=1;

        //third quad
        pts[8].x=-0.5f;pts[8].y=-0.5f;pts[8].z=-0.5f;
        pts[9].x=0.5f;pts[9].y=-0.5f;pts[9].z=-0.5f;
        pts[10].x=0.5f;pts[10].y=0.5f;pts[10].z=-0.5f;
        pts[11].x=-0.5f;pts[11].y=0.5f;pts[11].z=-0.5f;
        normals[8].z=-1;normals[9].z=-1;normals[10].z=-1;normals[11].z=-1;
        //fourth quad
        pts[12].x=-0.5f;pts[12].y=-0.5f;pts[12].z=0.5f;
        pts[13].x=0.5f;pts[13].y=-0.5f;pts[13].z=0.5f;
        pts[14].x=0.5f;pts[14].y=0.5f;pts[14].z=0.5f;
        pts[15].x=-0.5f;pts[15].y=0.5f;pts[15].z=0.5f;
        normals[12].z=1;normals[13].z=1;normals[14].z=1;normals[15].z=1;
        //fifth quad
        pts[16].x=-0.5f;pts[16].y=-0.5f;pts[16].z=-0.5f;
        pts[17].x=-0.5f;pts[17].y=-0.5f;pts[17].z=0.5f;
        pts[18].x=0.5f;pts[18].y=-0.5f;pts[18].z=0.5f;
        pts[19].x=0.5f;pts[19].y=-0.5f;pts[19].z=-0.5f;
        normals[16].y=-1;normals[17].y=-1;normals[18].y=-1;normals[19].y=-1;
        //sixth quad
        pts[20].x=-0.5f;pts[20].y=0.5f;pts[20].z=-0.5f;
        pts[21].x=-0.5f;pts[21].y=0.5f;pts[21].z=0.5f;
        pts[22].x=0.5f;pts[22].y=0.5f;pts[22].z=0.5f;
        pts[23].x=0.5f;pts[23].y=0.5f;pts[23].z=-0.5f;
        normals[20].y=1;normals[21].y=1;normals[22].y=1;normals[23].y=1;
        lsa.setNormals(0, normals);
        lsa.setCoordinates(0, pts);
        Shape3D sh=new Shape3D();
        PolygonAttributes pa=new PolygonAttributes();
        pa.setPolygonMode(PolygonAttributes.POLYGON_FILL);
        pa.setCullFace(PolygonAttributes.CULL_NONE);
        Material mat=new Material();
        mat.setEmissiveColor(new Color3f(0.5f,0.5f,0.5f));
        mat.setAmbientColor(new Color3f(0.1f,0.1f,0.1f));
        mat.setDiffuseColor(new Color3f(0.2f,0.3f,0.4f));
        mat.setSpecularColor(new Color3f(0.6f,0.3f,0.2f));
        mat.setLightingEnable(true);
        RenderingAttributes ra=new RenderingAttributes();
        ra.setIgnoreVertexColors(true);
        ColoringAttributes ca=new ColoringAttributes();
        ca.setShadeModel(ColoringAttributes.SHADE_GOURAUD);
        ca.setColor(new Color3f(0.2f,0.5f,0.9f));
        app.setColoringAttributes(ca);
        app.setRenderingAttributes(ra);   
        app.setMaterial(mat);
        app.setPolygonAttributes(pa);
        sh.setGeometry(lsa);
        sh.setAppearance(app);
        sh.setPickable(true); 
        TransformGroup objRotate = new TransformGroup();
        objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        objRotate.addChild(sh);

        DirectionalLight light1=new DirectionalLight();
        light1.setInfluencingBounds(new BoundingSphere(new Point3d(-5.0,0,0),10.0));
        light1.setColor(new Color3f(1f,1f,1f));
        light1.setDirection(new Vector3f(0,1,0));
        objRotate.addChild(light1);
        DirectionalLight light2=new DirectionalLight();
        light2.setInfluencingBounds(new BoundingSphere(new Point3d(5.0,0,0),10.0));
        light2.setColor(new Color3f(0.5f,1f,0.5f));
        light2.setDirection(new Vector3f(0,-1,0));
        objRotate.addChild(light2);
        MouseRotate f1=new MouseRotate();
        f1.setSchedulingBounds(new BoundingSphere());
        f1.setTransformGroup(objRotate);
        lineGroup.addChild(f1);
        objRotate.addChild(new Sphere(0.60f,1,128));
        lineGroup.addChild(objRotate);
        return lineGroup;
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.add(new JScrollPane(new energon()));
        frame.setSize(300, 300);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

Выход:

введите здесь описание изображения

Самое главное, вы можете использовать триангулятор, чтобы получить реальную трехмерную форму, используя только координаты точки

        GeometryInfo ginfo=new GeometryInfo(GeometryInfo.POLYGON_ARRAY);
        Triangulator tr = new Triangulator();
        NormalGenerator normalGenerator = new NormalGenerator();
        Stripifier st = new Stripifier();  
        int [] iint=new int[]{4,4,4,4,4,4};-->each face of cube has 4 points
        ginfo.setStripCounts(iint);
        ginfo.setCoordinates(pts); 
        tr.triangulate(ginfo); // ginfo contains the geometry     
        normalGenerator.generateNormals( ginfo );
        st.stripify(ginfo);
        sh.setGeometry(ginfo.getGeometryArray()); // shape is a Shape3D.
        //now you can use Shape3D-type sh as a 3D-surface-containing shape

В последнем примере вам пришлось использовать quadarray, но теперь вы можете сделать то же самое, используя только точки и триангулятор:

//skipping imports since char limit is reached in this answer
public final class energon extends JPanel {
    int s = 0, count = 0;
    public energon() {
        setLayout(new BorderLayout());
        GraphicsConfiguration gc=SimpleUniverse.getPreferredConfiguration();
        Canvas3D canvas3D = new Canvas3D(gc);
        add("Center", canvas3D);
        BranchGroup scene = createSceneGraph();
        scene.compile();
        // SimpleUniverse is a Convenience Utility class
        SimpleUniverse simpleU = new SimpleUniverse(canvas3D);
        // This moves the ViewPlatform back a bit so the
        // objects in the scene can be viewed.
        simpleU.getViewingPlatform().setNominalViewingTransform();
        simpleU.addBranchGraph(scene);
    }
    public BranchGroup createSceneGraph() {
        BranchGroup lineGroup = new BranchGroup();
        Appearance app = new Appearance();
        Vector3f [] normals=new Vector3f[24];
        for(int i=0;i<24;i++)normals[i]=new Vector3f();
        Point3f [] pts=new Point3f[24];
        for(int i=0;i<24;i++)pts[i]=new Point3f();
        Color3f [] clrs=new Color3f[24];
        for(int i=0;i<24;i++)clrs[i]=new Color3f(0.5f,0.5f,0.5f);
        //cube=6 quads 
        //first quad
        pts[0].x=-0.5f;pts[0].y=-0.5f;pts[0].z=-0.5f;
        pts[1].x=-0.5f;pts[1].y=-0.5f;pts[1].z=0.5f;
        pts[2].x=-0.5f;pts[2].y=0.5f;pts[2].z=0.5f;
        pts[3].x=-0.5f;pts[3].y=0.5f;pts[3].z=-0.5f;
        normals[0].x=-1;normals[1].x=-1;normals[2].x=-1;normals[3].x=-1;
        //second quad
        pts[4].x=0.5f;pts[4].y=-0.5f;pts[4].z=-0.5f;
        pts[5].x=0.5f;pts[5].y=-0.5f;pts[5].z=0.5f;
        pts[6].x=0.5f;pts[6].y=0.5f;pts[6].z=0.5f;
        pts[7].x=0.5f;pts[7].y=0.5f;pts[7].z=-0.5f;
        normals[4].x=1;normals[5].x=1;normals[6].x=1;normals[7].x=1;
        //third quad
        pts[8].x=-0.5f;pts[8].y=-0.5f;pts[8].z=-0.5f;
        pts[9].x=0.5f;pts[9].y=-0.5f;pts[9].z=-0.5f;
        pts[10].x=0.5f;pts[10].y=0.5f;pts[10].z=-0.5f;
        pts[11].x=-0.5f;pts[11].y=0.5f;pts[11].z=-0.5f;
        normals[8].z=-1;normals[9].z=-1;normals[10].z=-1;normals[11].z=-1;
        //fourth quad
        pts[12].x=-0.5f;pts[12].y=-0.5f;pts[12].z=0.5f;
        pts[13].x=0.5f;pts[13].y=-0.5f;pts[13].z=0.5f;
        pts[14].x=0.5f;pts[14].y=0.5f;pts[14].z=0.5f;
        pts[15].x=-0.5f;pts[15].y=0.5f;pts[15].z=0.5f;
        normals[12].z=1;normals[13].z=1;normals[14].z=1;normals[15].z=1;
        //fifth quad
        pts[16].x=-0.5f;pts[16].y=-0.5f;pts[16].z=-0.5f;
        pts[17].x=-0.5f;pts[17].y=-0.5f;pts[17].z=0.5f;
        pts[18].x=0.5f;pts[18].y=-0.5f;pts[18].z=0.5f;
        pts[19].x=0.5f;pts[19].y=-0.5f;pts[19].z=-0.5f;
        normals[16].y=-1;normals[17].y=-1;normals[18].y=-1;normals[19].y=-1;
        //sixth quad
        pts[20].x=-0.5f;pts[20].y=0.5f;pts[20].z=-0.5f;
        pts[21].x=-0.5f;pts[21].y=0.5f;pts[21].z=0.5f;
        pts[22].x=0.5f;pts[22].y=0.5f;pts[22].z=0.5f;
        pts[23].x=0.5f;pts[23].y=0.5f;pts[23].z=-0.5f;
        normals[20].y=1;normals[21].y=1;normals[22].y=1;normals[23].y=1;
        Shape3D sh=new Shape3D();
        PolygonAttributes pa=new PolygonAttributes();
        pa.setPolygonMode(PolygonAttributes.POLYGON_FILL);
        pa.setCullFace(PolygonAttributes.CULL_NONE);
        Material mat=new Material();
        mat.setEmissiveColor(new Color3f(0.5f,0.5f,0.5f));
        mat.setAmbientColor(new Color3f(0.1f,0.1f,0.1f));
        mat.setDiffuseColor(new Color3f(0.2f,0.3f,0.4f));
        mat.setSpecularColor(new Color3f(0.6f,0.3f,0.2f));
        mat.setLightingEnable(true);
        RenderingAttributes ra=new RenderingAttributes();
        ra.setIgnoreVertexColors(true);
        ColoringAttributes ca=new ColoringAttributes();
        ca.setShadeModel(ColoringAttributes.SHADE_GOURAUD);
        ca.setColor(new Color3f(0.2f,0.5f,0.9f));
        app.setColoringAttributes(ca);
        app.setRenderingAttributes(ra);
        app.setMaterial(mat);
        app.setPolygonAttributes(pa);
        sh.setAppearance(app);
        sh.setPickable(true);
        GeometryArray ga=null;
        GeometryInfo ginfo=new GeometryInfo(GeometryInfo.POLYGON_ARRAY);
        Triangulator tr = new Triangulator();
        NormalGenerator normalGenerator = new NormalGenerator();
        Stripifier st = new Stripifier();  
        int [] iint=new int[]{4,4,4,4,4,4};
        ginfo.setStripCounts(iint);
        ginfo.setCoordinates(pts); 
        tr.triangulate(ginfo); // ginfo contains the geometry     
        normalGenerator.generateNormals( ginfo );
        st.stripify(ginfo);
        sh.setGeometry(ginfo.getGeometryArray()); // shape is a Shape3D.
        TransformGroup objRotate = new TransformGroup();
        objRotate.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        objRotate.addChild(sh);   
        DirectionalLight light1=new DirectionalLight();
        light1.setInfluencingBounds(new BoundingSphere(new Point3d(-5.0,0,0),10.0));
        light1.setColor(new Color3f(1f,1f,1f));
        light1.setDirection(new Vector3f(0,1,0));
        objRotate.addChild(light1);
        DirectionalLight light2=new DirectionalLight();
        light2.setInfluencingBounds(new BoundingSphere(new Point3d(5.0,0,0),10.0));
        light2.setColor(new Color3f(0.5f,1f,0.5f));
        light2.setDirection(new Vector3f(0,-1,0));
        objRotate.addChild(light2);
        MouseRotate f1=new MouseRotate();
        f1.setSchedulingBounds(new BoundingSphere());
        f1.setTransformGroup(objRotate);
        lineGroup.addChild(f1);
        objRotate.addChild(new Sphere(0.60f,1,128));
        lineGroup.addChild(objRotate);
        return lineGroup;
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.add(new JScrollPane(new energon()));
        frame.setSize(300, 300);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

Вывод: То же самое! вы просто указываете координаты точек и номера граней-вершин

введите здесь описание изображениявведите здесь описание изображения

  • установить количество полос
  • установить координаты (из вашего размолвки)
  • треугольник
  • генерировать нормали
  • раздевать
  • .getGeometry(готово)
person Community    schedule 07.09.2012
comment
Я сделал все, как вы сказали, но это не работает для меня. мой код сейчас выше, если что-то не так, скажите мне или предложите мне. - person Jay; 07.09.2012
comment
я не знаю глубоко о java3D, я думаю, что изображение сделано из нескольких точек (пикселей) в (x, y, интенсивность). поэтому я хочу нарисовать это изображение в 3D-виде, используя его x как X-координату, y как Y-координату и интенсивность как Z-координата, поэтому изображение становится похожим на 3D-вид, потому что каждый пиксель изображения имеет свое собственное и другое значение интенсивности . Итак, как я могу нарисовать myImage.tiff в 3D-виде? а если серьезно, я не очень хорошо разбираюсь в Java 3D, но очень хорошо знаю Java SE. - person Jay; 07.09.2012
comment
У вас есть пример рисования любых 4 точек в 3D-виде? если да, то предлагает мне. - person Jay; 07.09.2012
comment
Хорошо, сейчас я тороплюсь на другую работу, я добавлю рисунок с 4 точками примерно через 7 часов. Извини - person huseyin tugrul buyukisik; 07.09.2012
comment
Спасибо mannnn. Я могу отправить вам одно изображение в формате TIFF, но я не знаю ваш адрес электронной почты. - person Jay; 08.09.2012
comment
теперь, если я хочу добавить источники света, либо AmbientLight, либо DirectionalLight, то как мне это сделать? - person Jony; 10.09.2012
comment
добавить свет просто как форму. При создании используйте BoundingSphere или BoundingBox, чтобы указать его диапазон. Окружающий свет немного темноват, поэтому вы можете использовать направленный свет. Я добавлю свет через несколько минут - person huseyin tugrul buyukisik; 10.09.2012
comment
добавить свет просто как форму. При создании используйте BoundingSphere или BoundingBox, чтобы указать его диапазон. Окружающий свет немного темноват, поэтому вы можете использовать направленный свет. Я добавлю свет через несколько минут - person huseyin tugrul buyukisik; 10.09.2012
comment
Но без массива полигонов он не будет использовать нормали. Вам нужны trainglearray, quadarray или их полосовые аналоги в качестве геометрии. В противном случае вы видите только линии или точки - person huseyin tugrul buyukisik; 10.09.2012
comment
Хорошо, я использовал триангулятор, чтобы избавиться от четырехмерного луча, поэтому вы можете использовать только свои координаты точек для создания геометрии трехмерной формы. Оформить последнее редактирование - person huseyin tugrul buyukisik; 10.09.2012
comment
Спасибо за этот очень всеобъемлющий пост. - person Kamil; 30.06.2013
comment
@Kamil Если вас интересует 3D в java, движок jmonkey более продвинутый и чаще обновляется, чем java3D, но в нем нет автоматической оптимизации для динамической геометрии. - person huseyin tugrul buyukisik; 30.06.2013
comment
Меня не интересуют более продвинутые двигатели. Меня интересуют простые 3D-решения для представления данных и т. д. - person Kamil; 30.06.2013
comment
@Kamil: Тогда это проще и быстрее. Радоваться, веселиться. - person huseyin tugrul buyukisik; 30.06.2013