2012-09-17 25 views
0

我正在開發一個小應用程序,它在Java 3D SimpleUniverse中呈現球體,然後用線連接一些球體。創建球體正在工作,也創造線條。涉及配方中的運動時會出現麻煩。 使用Transform3D對象並給出新座標,移動球體非常容易。但是,我想更新連接兩個遙遠領域的線條,重要的是要提及這兩個領域可能已經向任意方向移動了任意數量的空間,並且計算每秒更新幾十次,並且他們不斷更新很長時間(超過5分鐘)。 有什麼簡單的方法來更新Java3D(我使用的LineArray對象)的座標? 下面是代碼的一些部分,我現在很努力:Java3D轉換線

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++; 
    } 
} 

在此先感謝。 P.S .:也許我需要通過變換矩陣來完成。在這種情況下,建議如何計算它將會非常有幫助。同樣在這種情況下,我想知道如果經過任意大的迭代,由於失去精度,線的末端可能不匹配球體的中心。

回答

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定義了一個子空間e行爲實際執行

+0

謝謝。這確實比我所尋找的要多。測試和工作:) 真正幫助我的是,您可以直接轉換行而無需轉換它們所在的容器(TransformGroup)。設置'ALLOW_COORDINATE_READ&WRITE'就足以在我的代碼中進行一些更改。謝謝! – Azurlake