# HUD mit OrientedShape3D



## Florianer (16. Nov 2007)

Hi,

wieder ein Schritt weiter und somit ne neue Frage:
Ich will ein HUD realisieren, dass mir (dynamisch die Entfernung/Schnittpunkt) einen Text anzeigt. Nun hab ich das SUN Beispiel für das OrientatedShape3D auszugsweise übernommen... und konnte das Teil auch Erstellen. Wo ich allerdings noch nicht dahinter gekommen bin ist, wie ich dem Ding sagen kann, dass es immer auf der gleichen relativen Position zur ViewingPlatform sein soll... also immer im Bild und zwar oben links in der Ecke. Außerdem will ich den Text ja dynamisch anpassen... (davon hab ich auch noch keine Ahnung, wo ich das machen soll - ich schau jetzt erst mal wie man die von der PickingRay ausgehenden Strahlen mit Schnittpunkt in ne Entfernungsangabe bringt und geb die erst mal auf der Konsole aus...)


----------



## Florianer (19. Nov 2007)

So, da ich leider noch keine Antwort bekommen habe, zeigt ich jetzt mal, was ich habe...


```
private Transform3D HUDtranslation;
	private TransformGroup HUDtransform;
	private Text3D txt;

	public void updateHUD(String arg0){
		
    this.txt.setString(arg0);
	}
	public void setHUDPosition( Vector3d vector3d){
		vector3d.x -= 0; 
		vector3d.y -= 0; 
		vector3d.z -= 1; 
		
		HUDtranslation.setTranslation( vector3d);
    HUDtransform.setTransform( HUDtranslation);

	}
	private BranchGroup showHUD() {
		HUDtranslation = new Transform3D();
		HUDtransform = new TransformGroup( HUDtranslation);
		String textString = "Entfernung: ";
		float sl = textString.length();
    BranchGroup objRoot = new BranchGroup();
    
    Appearance apText = new Appearance();
  	Material m = new Material();
  	m.setLightingEnable(true);
  	apText.setMaterial(m);

    TransformGroup objScale = new TransformGroup();
    Transform3D textMat = new Transform3D();
    // Assuming uniform size chars, set scale to fit string in view
    textMat.setScale(0.2/sl);
    objScale.setTransform(textMat);

    // create 3D text 
    Font3D f3d = new Font3D(new Font("Arial", Font.PLAIN, 2),
                            new FontExtrusion());
    txt = new Text3D(f3d, textString, new Point3f( -sl/2.0f, 3.0f, 0.0f));
    OrientedShape3D textShape = new OrientedShape3D();
    textShape.setGeometry(txt);
    textShape.setAppearance(apText);
    textShape.setAlignmentAxis( 0.0f, 1.0f, 0.0f);

		//create transform group node
    objScale.addChild( textShape );
    
    HUDtransform.addChild( objScale);
    objRoot.addChild( HUDtransform);

    // Setzen der Capability, damit während der Animation die Parameter geändert werden können. 
    HUDtransform.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
    txt.setCapability( Text3D.ALLOW_STRING_WRITE);

    objRoot.compile();
    setHUDPosition( new Vector3d( 0.0d, 0.0, 16.0d));
		return objRoot;
	}
```

So bekomme ich zwar eine Textanzeige, die sich auch über updateHUD mit neuen Werten versehen lässt, jedoch funktioniert nun das OrientedShape3d nicht, wie erwartet. Es bewegt sich zwar mit der ViewingPlatform mit, aber nur, solange man sich nicht dreht. Dann scheint das Teil einfach hängen zu bleiben. Außerdem ruckelt und springt das während eine Bewegung sichtbar. Kann ich denn net einfach dem Text sagen, dass er immer in der linken unteren Bildschirmecke bleiben soll und stets dem Betrachter zugewandt ist?


----------



## Illuvatar (19. Nov 2007)

Was hindert dich eigentlich daran, den Text einfach mit Graphics2D auf das Canvas3D zu pinseln?

€dith meint: Siehe zum Beispiel auch hier


----------



## Florianer (21. Nov 2007)

öhm ja... 
Ausrede: Ich wollte mal ein OrientedShape3D verwenden um es kennen zu lernen
Richtig: Ich wusste net wie und wollte eigentlich genau das machen, was du in deinem andren Post gemacht hast. Wieder um was schlauer. Die Lösung find ich so schön einfach, wenn man weiß, was man machen soll  Ich könnte dich jetzt noch fragen, was dein Content war, aber ich hab die Variablen einfach in eine Zeile gemacht, da suchen die sich dann schon selbst den Platz - zumindest für's erste! Vllt mach ich ja mal 2 Zeilen oder über Content ne feste Position. Ich nehm mal an, der weiß, wie groß das Vorgängerelement war, oder?


----------

