1

20年以上コーディングしています。私は Java3d を初めて使用しますが、非常に感銘を受けました。保持モードは、直接モードよりもはるかに簡単です!

とにかく、照明に問題があります。独自のジオメトリを作成すると、照明が機能しません。java3d ユーティリティ (Sphere() など) によって作成されたジオメトリを使用すると、照明は正常に機能します。私が見ている問題は、オブジェクトがどの角度から見ても白いことです。アンビエント ライトとディレクショナル ライトを追加しようとしましたが、オブジェクトは常に白です。

ドキュメントによると、照明を使用したい場合、オブジェクトに色の外観属性を指定することは想定されていませんが、それを行っていません。また、法線を提供する必要があるとも書かれており、それを実行しています。手で法線を作成することと、NormalGenerator を使用することの両方を試みました。Java3d 1.5.1 とプレリリース 1.6.0 を試しましたが、成功しませんでした。Windows 7 64 ビットで Java 1.6.0_18 を使用しています。

このコードにはたいしたことはありません。問題は本当に基本的なものでなければなりませんが、私にはわかりません。ライティングが機能しない 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;
 }
4

1 に答える 1

4

Java 3D でシェーディング ライティングを機能させるには、少なくとも法線とマテリアル ノード コンポーネントが必要です。Shape3D インスタンスの Appearance を設定するのを忘れました。したがって、デフォルトが使用されます。その結果、シェーディングされていない白いジオメトリが生成されます。

次の外観を 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 3D の推奨安定バージョンは 1.5.2 で、 https ://java3d.dev.java.net/binary-builds.html からダウンロードできます。

8月

于 2011-01-12T10:21:50.527 に答える