Java3D проблема с освещением - PullRequest
1 голос
/ 11 января 2011

Кодирование на 20+ лет. Я новичок в Java3d, но я действительно впечатлен этим - сохраненный режим намного проще, чем прямой режим!

В любом случае у меня проблемы с освещением. Когда я создаю свою собственную геометрию, я не могу заставить освещение работать; Когда я использую геометрию, созданную утилитой java3d (например, Sphere ()), освещение работает нормально. Проблема, которую я вижу, в том, что мой объект белый со всех сторон. Я попытался добавить окружающий и направленный свет, и мои объекты всегда белые.

В документах говорится, что я не должен предоставлять цветовые атрибуты на своих объектах, если я хочу использовать освещение, а я этого не делаю. Это также говорит, что я должен поставить нормальные, и я делаю это. Я пробовал как создавать нормали вручную, так и с помощью NormalGenerator. Я пробовал Java3d 1.5.1 и предварительный релиз 1.6.0 без успеха. Я использую Java 1.6.0_18 в Windows 7 64 бит.

В этом коде немногое. Проблема должна быть чем-то очень простым, но я не вижу этого. Я вставил 2 функции создания геометрии здесь, где освещение не работает. Пожалуйста, посмотрите и дайте мне знать, что я делаю неправильно:

protected BranchGroup createTriangle() {
  Point3f[] vertices = { new Point3f(-1, 0, 0), new Point3f(1, 0, 0),
    new Point3f(0, 1, 0), };
  int indices[] = { 0, 1, 2, };

  GeometryInfo geometryInfo = new GeometryInfo(
    GeometryInfo.TRIANGLE_ARRAY);
  geometryInfo.setCoordinates(vertices);
  geometryInfo.setCoordinateIndices(indices);

 // NormalGenerator normalGenerator = new NormalGenerator();
 // normalGenerator.generateNormals(geometryInfo);

   Vector3f[] normals = { new Vector3f(0.0f, 0.0f, 1.0f), };
   int normalIndices[] = { 0, 0, 0, };
   geometryInfo.setNormals(normals);
   geometryInfo.setNormalIndices(normalIndices);

  Shape3D shape = new Shape3D(geometryInfo.getIndexedGeometryArray());

  BranchGroup group = new BranchGroup();
  group.addChild(shape);

  return group;
 }

 protected BranchGroup createBox() {

  Point3d[] vertices = { new Point3d(-1, 1, -1), new Point3d(1, 1, -1),
    new Point3d(1, 1, 1), new Point3d(-1, 1, 1),
    new Point3d(-1, -1, -1), new Point3d(1, -1, -1),
    new Point3d(1, -1, 1), new Point3d(-1, -1, 1), };

  int[] indices = { 0, 1, 5, 0, 5, 4, 1, 2, 6, 1, 6, 5, 2, 3, 7, 2, 7, 6,
    3, 0, 4, 3, 4, 7, 0, 3, 2, 0, 2, 1, 4, 5, 3, 2, 3, 5, };

  GeometryInfo geometryInfo = new GeometryInfo(
    GeometryInfo.TRIANGLE_ARRAY);
  geometryInfo.setCoordinates(vertices);
  geometryInfo.setCoordinateIndices(indices);

  NormalGenerator normalGenerator = new NormalGenerator();
  normalGenerator.generateNormals(geometryInfo);

  // Vector3f[] normals = { new Vector3f(0, 0, -1), new Vector3f(1, 0, 0),
  // new Vector3f(0, 0, 1), new Vector3f(-1, 0, 0),
  // new Vector3f(0, 1, 0), new Vector3f(0, -1, 0), };
  // int[] normalIndices = { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2,
  // 2,
  // 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, };
  // geometryInfo.setNormals(normals);
  // geometryInfo.setNormalIndices(normalIndices);

  Shape3D shape = new Shape3D(geometryInfo.getIndexedGeometryArray());

  BranchGroup group = new BranchGroup();
  group.addChild(shape);

  return group;
 }

1 Ответ

4 голосов
/ 12 января 2011

для получения затененного освещения для работы в Java 3D требуется как минимум нормали и компонент узла Material.Вы забыли установить внешний вид для своих экземпляров Shape3D.Итак, по умолчанию принято.В результате получается не затененная белая геометрия.

Добавьте следующий внешний вид в конструктор ваших Shap3D, и они будут / должны быть отображены красным цветом:

Appearance appearance = new Appearance();
Material material = new Material(); 
material.setDiffuseColor(1.0f, 0.0f, 0.0f);   // red
material.setSpecularColor(0.2f, 0.2f, 0.2f);  // reduce default values
appearance.setMaterial(material);

Рекомендуемая стабильная версия Java 3D1.5.2 и его можно скачать здесь: https://java3d.dev.java.net/binary-builds.html

Август

...