0

Java 3D SimpleUniverse で球体をレンダリングし、球体の一部を線で接続する小さなアプリケーションを開発しています。球の作成は機能しており、線も作成されています。レシピに動きがあると困ります。球体の移動は、Transform3D オブジェクトを使用して新しい座標を与えることで非常に簡単です。しかし、私は 2 つの離れた球体を結ぶ線を更新したいと思います。重要なのは、両方の球体が任意の量の空間を任意の方向に移動した可能性があり、計算が 1 秒あたり数十回更新され、かなりの時間更新され続けることです。長時間(5分以上)。Java3D (私が使用している LineArray オブジェクト) でライン座標を更新する簡単な方法はありますか? ここに私が現在取り組んでいるコードの一部があります:

TransformGroup [] segments;

public void createLines(SphereSet sphereSet, BranchGroup branchGroup) {
    segments = new TransformGroup[sphereSet.getEdgeSet().size()]; //Each edge connects two spheres in the sphereSet.
    Point3f [] source_dest = new Point3f[2];
    int lineIndex = 0;
    for (Edge e : sphereSet.getEdgeSet()) {
        segments[lineIndex] = new TransformGroup();
        segments[lineIndex].setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
/**
 *  Now create the Point3f pair that represents a segment connecting two spheres.
 */
        source_dest[0] = new Point3f();
        source_dest[1] = new Point3f();
        source_dest[0].setX(e.getSource().getCoordinates()[0]);
        source_dest[0].setY(e.getSource().getCoordinates()[1]);
        source_dest[0].setZ(e.getSource().getCoordinates()[2]);
        source_dest[1].setX(e.getTarget().getCoordinates()[0]);
        source_dest[1].setY(e.getTarget().getCoordinates()[1]);
        source_dest[1].setZ(e.getTarget().getCoordinates()[2]);

        LineArray line = new LineArray(2, LineArray.COORDINATES);
        line.setCoordinates(0, source_dest);

        Appearance lineApp = new Appearance();
        LineAttributes lineAttr = new LineAttributes(2, LineAttributes.PATTERN_SOLID, true);
        lineApp.setLineAttributes(lineAttr);

        Shape3D lineShape = new Shape3D(line, lineApp);
        segments[lineIndex].addChild(lineShape);

        branchGroup.addChild(segments[lineIndex]);

        lineIndex++;
    }
}

//Now, spheres' coordinates are updated... and we need to update lines' coordinates.

public void updateLines(SphereSet sphereSet) {

    int segmentIndex = 0;
    for (Edge e : sphereSet.getEdgeSet()) {
        //MYSTERIOUS CODE GOES HERE
        segmentIndex++;
    }
}

前もって感謝します。PS: 変換マトリックスを介して行う必要があるかもしれません。そんな時、計算方法を教えていただけると助かります。また、そのような場合、精度の低下により、任意の大きな反復回数の後、線の端が球の中心と一致しない可能性があるかどうかを知りたいです。

4

1 に答える 1

1

1) javax.media.j3d.Behavior から派生したクラスを作成します。例:

public class MyBehavior extends Behavior {

    private WakeupCondition wc = new WakeupOnElapsedTime(100); // Every 0.1 sec.

    public void initialize() {

      wakeupOn(wc);
    }

    public void processStimulus(Enumeration criteria) {

      double[] p = { 0, 0, 0 };
      for(int i = 0;i < nLinePoints;i++) {
          line.getCoordinate(i,p);
          p[0] += RandGenerator.randUniform(-0.1,0.1);
          p[1] += RandGenerator.randUniform(-0.1,0.1);
          p[2] += RandGenerator.randUniform(-0.1,0.1);
          line.setCoordinate(i,p);
      }
      wakeupOn(wc);
    }
}

2)createLines()メソッドで、座標の読み取りと書き込みを許可します。

line.setCapability(LineArray.ALLOW_COORDINATE_READ);
line.setCapability(LineArray.ALLOW_COORDINATE_WRITE);

3) ビヘイビアーをシーン グラフにアタッチします。

MyBehavior randomEffect = new MyBehavior();
randomEffect.setSchedulingBounds(new BoundingSphere(new Point3d(0.0, 0.0,0.0), 100.0));
rootBranchGroup.addChild(randomEffect);

BoundingSphere は、動作が実際に実行される部分空間を定義します

于 2012-09-19T04:29:48.310 に答える