# Textur - Koordinaten



## nagash56 (9. Aug 2004)

Ich habe folgendes Problem... ich brauche für eine Anwendung die Möglichkeit selbsterstellte (nicht wirklich komplexe) 
Shape3D - Objekte zu mappen. Leider verstehe ich nicht wirklich wie das mit den Texturkoordinaten funktioniert. Ich hab im folgenden Programm einfach eine Shape3D-Fläche erzeugt auf der ich zB. das unten angegebene Image _komplett_ draufhaben möchte und nicht 8 kleine Bilder so wie es momentan ist... Kann mir da vielleicht jemand helfen?


http://img33.exs.cx/img33/7672/logo53.jpg



```
import javax.swing.JFrame;
import java.awt.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.image.*;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.behaviors.mouse.*;
import javax.media.j3d.*;
import javax.vecmath.*;

public class Test3D extends JFrame
{
   private SimpleUniverse u = null;

 public Test3D()
 {
 	setSize (400, 400);
        setLocationRelativeTo (null);  
        setDefaultCloseOperation (EXIT_ON_CLOSE);  
	Container f = getContentPane();
        GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
	Canvas3D c = new Canvas3D(config);
	f.add(c);
	u = new SimpleUniverse(c);
	setViewPosition();
	u.addBranchGraph(createSceneGraph());
	setVisible(true);
 }

 
 void setViewPosition()
 {
   TransformGroup viewTG;
   Transform3D viewT3D = new Transform3D();
   viewTG = u.getViewingPlatform().getViewPlatformTransform();
   viewTG.getTransform(viewT3D);
   viewT3D.setTranslation(new Vector3f(0f,0f,8f));
   viewTG.setTransform(viewT3D);
  }
 
 public BranchGroup createSceneGraph()
 {
 	BranchGroup root = new BranchGroup();
 	TransformGroup imageTG = new TransformGroup();
 	
 	Appearance imageAppearance = new Appearance();
 	Shape3D complexObj;
 	
 	
 	imageAppearance.setTexture((new TextureLoader("logo.jpg",null)).
 			getTexture());
 	imageAppearance.setTexCoordGeneration(new TexCoordGeneration
 			(TexCoordGeneration.OBJECT_LINEAR,TexCoordGeneration.TEXTURE_COORDINATE_2));
 	imageAppearance.setTextureAttributes(new TextureAttributes
 			(TextureAttributes.REPLACE,new Transform3D(),new Color4f(),
 			TextureAttributes.NICEST));
 	
 	complexObj = createShape3D();
 	complexObj.setAppearance(imageAppearance);
 	imageTG.addChild(complexObj);
 	imageTG.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
 	imageTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
 	root.addChild(imageTG);
 	MouseRotate mr = new MouseRotate(imageTG);
 	mr.setSchedulingBounds(new BoundingSphere(new Point3d(),100000));
 	
 	
 	root.addChild(mr);
 	root.compile();
 	 	
	return root;
  }

 Shape3D createShape3D()
 {
    Shape3D S3D = new Shape3D();
    GeometryInfo GInfo;
    NormalGenerator NormGen = new NormalGenerator();
    Point3f[] CoordArr = new Point3f[4];
    int[] Vind = new int[4];
 
    CoordArr[0] = new Point3f( -2f, 0f, 0f);
    CoordArr[1] = new Point3f( 2f, 0f, 0f);
    CoordArr[2] = new Point3f( 2f, 2f, 0f);
    CoordArr[3] = new Point3f( -2f, 2f, 0f);
    
 
    Vind[0]=0; Vind[1]=1; Vind[2]= 2;
    Vind[3]=3; 
    
 
    GInfo = new GeometryInfo(GeometryInfo.QUAD_ARRAY);
    GInfo.setCoordinates(CoordArr);
    GInfo.setCoordinateIndices(Vind);
    NormGen.generateNormals(GInfo);
    S3D.addGeometry(GInfo.getGeometryArray());
    return S3D;
 }
 
 public static void main(String[] args)
 {
    new Test3D();
 }
}
```


----------



## Oxygenic (9. Aug 2004)

Texturkoordinaten sind  eigentlich nichts weiter als ein Faktor in x- und y-Richtung (auf dem Objekt), dem Breite und Höhe des Bildes entsprechen. Sprich steht für einen Koordinatenwert z.B. die Zahl 5, so heißt das, dass die Textur in dieser Richtung 5 mal wiederholt wurde. 0,0 ist dementsprechend der Anfangspunkt eines Bildes (ob das nun die linke obere oder untere Ecke ist, hängt vom Y_UP-Flag ab).


----------



## nagash56 (9. Aug 2004)

Ok danke das hat mir schon etwas weitergeholfen. Jetzt hab ich den Konstruktor abgeändert und die zwei Vektoren für PlaneS und PlaneT hinzugenommen die standardmäßig auf (1, 0, 0, 0), (0, 1, 0, 0) initialisiert sind. Dann hab ich von S den Wert geviertelt und den von T halbiert... Jetzt ist tatsächlich nur noch ein Bild auf dem Rechteck. Aber der Anfangspunkt des Bildes ist in der Mitte des Rechtecks sodass auf der einen Seite des Rechtecks das Bild "herausragt" und auf der anderen Seite "weiterläuft". Laut deinen Anmerkungen ist somit der 0,0 Anfangspunkt des Bildes eben nicht äquivalent mit der linken unteren Ecke des Rechtecks(Y_UP flag hab ich nix gesetzt). Ich hab versucht mit Hilfe einer Transformation bei den TextureAttributes eine Verschiebung um 2 in X - Richtung zu erreichen aber das scheint keine Auswirkung zu haben.
Vielleicht könntest du dir das nochmal anschauen?


```
TexCoordGeneration t = new TexCoordGeneration
        (TexCoordGeneration.OBJECT_LINEAR, TexCoordGeneration.TEXTURE_COORDINATE_2,
        		new Vector4f(0.25f, 0f, 0f, 0f), new Vector4f(0f, 0.5f, 0f, 0f));

imageAppearance.setTexCoordGeneration(t);
Transform3D t1 = new Transform3D();
t1.setTranslation(new Vector3f(-2f, 0f, 0f));
imageAppearance.setTextureAttributes(new TextureAttributes
         (TextureAttributes.REPLACE, t1, new Color4f(), TextureAttributes.NICEST));
```


----------

