Rotationsachse eines 3D Objektes festlegen

Shaguar

Mitglied
Hi zusammen,
ich sitze gerade an einem Java 3D Objekt und lade 3D Objekte welche dann vom Benutzer per Maus gedreht und betrachtet werden können.
Ich habe nun 2 Modelle von Stühlen und einer von den beiden Stühlen dreht sich leider nicht um seine eigene Achse (zumindest die X-achse) sonder um einen Achse die ein Stück rechts vom Stuhl liegt, der andere Stuhl hingegen dreht sich so wie er es soll um seine eigenen Achsen.
Ich habe beide Models von Sweet Home 3D : 3D models import als Obj Dateien bezogen.
Es wurden auch von mir keine Einstellungen deswegen vorgenommen, alles ist sozusagen auf "Standard".
Die Rotation habe ich folgendermaßen realisiert:
Java:
MouseRotate mausDreh = new MouseRotate();
        mausDreh.setTransformGroup(transGroup);
        mausDreh.setSchedulingBounds(new BoundingSphere(new Point3d(0.0, 0.0, 0.0), Double.MAX_VALUE));
Ich betrachte die Models zusätzlich immer mit dem Programm PoseRay und auch dort kann ich was die Rotationsachsen angeht keine Unterschiede zwischen den Stühlen feststellen und dort im Preview Fenster von PoseRay drehen sich auch beide Stühle um ihre eigenen Achsen. Das Problem besteht also nur bei mir im Programm.
Kann man denn da überhaupt irgendwas falsch einstellen, weil eigentlich kann ich mir nicht vorstellen das es an meinem Code liegt, weil der andere Stuhl ja soweit funktioniert.
Wie kann man denn die Rotationsachsen eines 3d Models manuell setzen? (Falls das überhaupt möglich ist)

Gruß

Falls erforderlich der komplette Quellcode:
Java:
import java.awt.*;
....
....

public class SimpleModelView extends JFrame {

    private Canvas3D canvas;

    private SimpleUniverse universe;

    private BranchGroup root;
    

    public SimpleModelView() throws IOException {
        configureWindow();
        configureCanvas();
        conigureUniverse();
        addModelToUniverse();
        addLightsToUniverse();
        universe.addBranchGraph(root);
    }

    private void configureWindow() {
        setTitle("Basic Java3D Program");
        setSize(640, 480);
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        int locationX = (screenSize.width - getWidth()) / 2;
        int locationY = (screenSize.height - getHeight()) / 2;
        setLocation(locationX,locationY);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private void configureCanvas() {
        canvas = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
        canvas.setDoubleBufferEnable(true);
        getContentPane().add(canvas, BorderLayout.CENTER);
    }


    private void conigureUniverse() {
        universe = new SimpleUniverse(canvas);
        universe.getViewingPlatform().setNominalViewingTransform();
    }


    private void addModelToUniverse() throws IOException {
        Scene scene = getSceneFromFile("officeChair3.obj"); 
        root = new BranchGroup(); 
        
        scene.getSceneGroup().setCapability(Shape3D.ALLOW_APPEARANCE_WRITE);

        Transform3D transforms = new Transform3D();

        TransformGroup transGroup = new TransformGroup(transforms);
        transGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        
        MouseRotate mausDreh = new MouseRotate();
        mausDreh.setTransformGroup(transGroup);
        mausDreh.setSchedulingBounds(new BoundingSphere(new Point3d(0.0, 0.0, 0.0), Double.MAX_VALUE));
        
        transGroup.addChild(scene.getSceneGroup());
        root.addChild(transGroup);
        root.addChild(mausDreh);    


    }
    
    private void addLightsToUniverse() {
        
    	AmbientLight lightA = new AmbientLight();
        lightA.setInfluencingBounds(new BoundingSphere(new Point3d(0.0, 0.0, 0.0), Double.MAX_VALUE));
        root.addChild(lightA);       

        Background background = new Background(new Color3f(Color.WHITE)); 

        background.setApplicationBounds(new BoundingSphere()); 

        root.addChild(background);
    }

    public static Scene getSceneFromFile(String location) throws IOException {
        ObjectFile file = new ObjectFile(ObjectFile.RESIZE);
        return file.load(new FileReader(location));
    }

    public static void main(String[] args) {
        try {
            new SimpleModelView().setVisible(true);
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
    
    
}

Das sind die 2 Stühle die ich benutzt habe:
http://www.sweethome3d.com/models/contributions/officeChair2.zip -> Geht
http://www.sweethome3d.com/models/contributions/officeChair3.zip -> Geht nicht
 
Hab' mal beide in MeshLab aufgebmacht: Die befinden sich eben an komplett unterschiedlichen Positionen im Raum :bahnhof: Beim chai 2 passt es noch, aber der Chair 3 ist ziemlich weit vom Ursprung weg. Du könntest dir vermutlich die Bounding box des Objektes berechnen, und es dann so verschieben, dass das Zentrum der BoundingBox im Ursprung liegt. Aber in den allermeisten Fällen muss man sich eben selbst überlegen, um welchen Punkt rotiert werden soll...
 
Man kann sich die Koordinaten einzelner Vertices ansehen (im Menü irgendwo "Point selection" oder so wählen). Im Zweifelsfall kann man die OBJ auch in einem Texteditor aufmachen, oder... einfach beide Stühle auf einmal in MeshLab laden: Die sind sehr weit auseinander 😉
 

Neue Themen


Zurück
Oben