# Eine Frage zur ViewBesetzung



## Developer_X (30. Jun 2009)

HI, ich hab eine frage an euch, wie kann ich 
die folgende Methode in mein Java3D Programmeinbauen, ohne dass folgende Fehlermeldung kommt?

```
public void setView()
	{
		view = new Transform3D();
		view.setTranslation(new Vector3f(0,0,0.5f));
		View = new TransformGroup();
		View.setTransform(view);
		View.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		View = u.getViewingPlatform().getViewPlatformTransform();
		
		viewPoint = new Transform3D();
		viewPoint.rotY(Math.toRadians(rot));
		viewPoint.setTranslation(new Vector3f(x,y,z));
		ViewPoint = new TransformGroup();
		ViewPoint.setTransform(viewPoint);
		ViewPoint.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                         ViewPoint.addChild(View);
		
	}
```


```
Exception in thread "main" javax.media.j3d.MultipleParentException: Group.addChild: child already has a parent
	at javax.media.j3d.GroupRetained.checkValidChild(GroupRetained.java:452)
	at javax.media.j3d.GroupRetained.addChild(GroupRetained.java:461)
	at javax.media.j3d.Group.addChild(Group.java:271)
	at Game1.Game3D21.setView(Game3D21.java:120)
	at Game1.Game3D21.<init>(Game3D21.java:52)
	at Game1.Game3D21.main(Game3D21.java:166)
```


----------



## Marco13 (30. Jun 2009)

Da gibt's fast nur eine Möglichkeit:

```
try
{
    setView();
}
catch (Exception e)
{
    // Do nothing...
}
```

Ansonsten müßtest du die Methode so ändern, dass nicht ein Knoten, der schon ein parent hat, zu einen anderen hinzugefügt wird.


----------



## Developer_X (30. Jun 2009)

ich habs versucht, mit dem zwischenSchritt TransView
geht aber auch nicht, hier mal mein gesamter Code:

```
package Game1;

import java.awt.event.*;
import java.awt.*;

import javax.media.j3d.*;
import javax.swing.*;
import javax.vecmath.*;

import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.universe.*;

@SuppressWarnings("serial")
public class Game3D21 extends JFrame implements KeyListener, MouseMotionListener
{
	//Attribute
		Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
		
		float x,y,z;
		float rot;
		
		Transform3D viewPoint;
		TransformGroup ViewPoint;
		
		Transform3D transview = new Transform3D();
		TransformGroup TransView = new TransformGroup();
		
		BranchGroup X = new BranchGroup();
		
		Transform3D view;
		TransformGroup View;
		
	    BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 1000.0);

	    SimpleUniverse u;
	    
	//Constructor
	public Game3D21()
	{
		super("Game3D21");
		//sets n' adds
		setSize(d);
		setUndecorated(true);		
		setLayout(new BorderLayout());

		addWindowListener(new WindowListener());
		
		BranchGroup scene = createScene();       
		GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
        Canvas3D canvas = new Canvas3D(config);
        add("Center", canvas);       
        canvas.addKeyListener(this);
        canvas.addMouseMotionListener(this);
        u = new SimpleUniverse(canvas);       
        u.addBranchGraph(scene);
        try
        {
		setView();
        }
        catch(Exception e)
        {
        	
        }
		setVisible(true);
	}
	
	//implement Methods
	public void keyPressed(KeyEvent arg0) 
	{		
		if(arg0.getKeyCode()==KeyEvent.VK_UP)
		{
			forward();
		}
		else if(arg0.getKeyCode()==KeyEvent.VK_DOWN)
		{
			backward();
		}
		else if(arg0.getKeyCode()==KeyEvent.VK_LEFT)
		{
			leftward();
		}
		else if(arg0.getKeyCode()==KeyEvent.VK_RIGHT)
		{
			rightward();
		}
	}

	public void keyReleased(KeyEvent arg0) 
	{		
	}

	public void keyTyped(KeyEvent arg0)
	{
	}
	
	//Most Important Methods!!!
	public void forward()
	{
		
	}
	public void backward()
	{
		
	}
	public void leftward()
	{
		
	}
	public void rightward()
	{
		
	}

	
	public void setView()
	{
		view = new Transform3D();
		View = new TransformGroup();
		View.setTransform(view);
		View.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		View = u.getViewingPlatform().getViewPlatformTransform();
		
		transview = new Transform3D();
		transview.setTranslation(new Vector3f(0,0,0.5f));
		TransView = new TransformGroup();
		TransView.setTransform(transview);		
		TransView.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		
		viewPoint = new Transform3D();
		viewPoint.rotY(Math.toRadians(rot));
		viewPoint.setTranslation(new Vector3f(x,y,z));
		ViewPoint = new TransformGroup();
		ViewPoint.setTransform(viewPoint);
		ViewPoint.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
		ViewPoint.addChild(TransView);

	}
	
	public void mouseDragged(MouseEvent arg0)
	{		
	}


	public void mouseMoved(MouseEvent arg0) 
	{	
		
		double x = MouseInfo.getPointerInfo().getLocation().getX(); 
	  //double y = MouseInfo.getPointerInfo().getLocation().getY();
		
		if(x<=d.width/2)
		{
			if(rot>=-45)
			{
			rot = rot - 0.1f;
			viewPoint.rotY(Math.toRadians(rot));
			ViewPoint.setTransform(viewPoint);
			
			View.getTransform(transview);
			
			}
			else
			{
				;
			}
		}
		else if(x>d.width/2)
		{
			if(rot<=+45)
			{
			rot = rot + 0.1f;
			viewPoint.rotY(Math.toRadians(rot));
			ViewPoint.setTransform(viewPoint);
			
			View.getTransform(transview);
			}
			else
			{
				;
			}
		}

	}
 	
	//Main
	public static void main(String[]arg)
	{
		new Game3D21();
	}

	//3DGroups
	public BranchGroup createScene()
	{
		X = new BranchGroup();
		
		Transform3D b1 = new Transform3D();
		b1.setTranslation(new Vector3f(0,0,-2));
		TransformGroup B1 = new TransformGroup();
		B1.setTransform(b1);
		X.addChild(B1);
		B1.addChild(new Sphere(0.1f,null));
		
//////////////Lights
	       Color3f lightColor = new Color3f(.3f,.3f,.3f);
	       AmbientLight ambientLight= new AmbientLight(lightColor);
	       ambientLight.setInfluencingBounds(bounds);
	       X.addChild(ambientLight);
	       DirectionalLight directionalLight = new DirectionalLight();
	       directionalLight.setColor(lightColor);
	       directionalLight.setInfluencingBounds(bounds);
	       X.addChild(directionalLight);       
		
		return X;
	}
	
	//Classes
	class WindowListener extends WindowAdapter{public void windowClosing(WindowEvent e)
	{
		System.exit(0);
	}}

}
```

Da kommt zwar keine Exception mehr, dafür aber, bewegt sich die Kamera nicht mehr


----------



## Developer_X (30. Jun 2009)

Wenn ich dich noch was fragen könnte, gibt es einen Listener, für Mäuse, der abfragt, ob die maus nach links oder rechts bewegt wird?


----------



## Marco13 (30. Jun 2009)

Alle Transforms, die du ausführen willst, kannst du in die "View" schreiben - es gibt keinen Grund für eine "ViewPoint".

Mausbewegungen kann man mit MouseBehaviours abfragen.


----------



## Developer_X (30. Jun 2009)

doch es gibt einen grund, ich will dass die TransformGroup ViewPoint durch den KeyLístener bewegt wird, hab ich da jetzt nicht ist aber so, zweites will ich dass View sich um ViewPoint dreht, wenn ich die maus bewege


----------



## Developer_X (30. Jun 2009)

Das man Maus bewegungen mit MouseBehaviors abfangen kann ist mir bewusst, ich würde sie aber gerne implementieren


----------



## Marco13 (30. Jun 2009)

Sinngemäß:

Transform3D transformVonDerTastatur = ... Wird mit der Tastatur verändert
Transform3D transformVonDerMaus = ... Wird mit der Maus verändert

Transform3D transformFürDieView = transformVonDerTastatur.mul(transformVonDerMaus );
u.getViewingPlatform().getViewPlatformTransform().setTransform(transformFürDieView );


----------



## Developer_X (30. Jun 2009)

gut danke schön, das mit dem "mul" hat mich weiter gebracht
doch ich habe immer noch 2 Probleme:
1.Problem
Jetzt bewegt sie seltsamerweise gar ncihts mehr wenn ich die maus beweg:

```
package Game1;
 
import java.awt.event.*;
import java.awt.*;
 
import javax.media.j3d.*;
import javax.swing.*;
import javax.vecmath.*;
 
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.universe.*;
 
@SuppressWarnings("serial")
public class Game3D21 extends JFrame implements KeyListener, MouseMotionListener
{
    //Attribute
        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
        
        float x,y,z;
        float rot;
        
        Transform3D viewPoint;
                
        BranchGroup X = new BranchGroup();
        
        Transform3D view;
        TransformGroup View;
        
        BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 1000.0);
 
        SimpleUniverse u;
        
    //Constructor
    public Game3D21()
    {
        super("Game3D21");
        //sets n' adds
        setSize(d);
        setUndecorated(true);       
        setLayout(new BorderLayout());
 
        addWindowListener(new WindowListener());
        
        BranchGroup scene = createScene();       
        GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
        Canvas3D canvas = new Canvas3D(config);
        add("Center", canvas);       
        canvas.addKeyListener(this);
        canvas.addMouseMotionListener(this);
        u = new SimpleUniverse(canvas);       
        u.addBranchGraph(scene);

        setView();
        
        setVisible(true);
    }
    
    //implement Methods
    public void keyPressed(KeyEvent arg0) 
    {       
        if(arg0.getKeyCode()==KeyEvent.VK_UP)
        {
            forward();
        }
        else if(arg0.getKeyCode()==KeyEvent.VK_DOWN)
        {
            backward();
        }
        else if(arg0.getKeyCode()==KeyEvent.VK_LEFT)
        {
            leftward();
        }
        else if(arg0.getKeyCode()==KeyEvent.VK_RIGHT)
        {
            rightward();
        }
    }
 
    public void keyReleased(KeyEvent arg0) 
    {       
    }
 
    public void keyTyped(KeyEvent arg0)
    {
    }
    
    //Most Important Methods!!!
    public void forward()
    {
        
    }
    public void backward()
    {
        
    }
    public void leftward()
    {
        
    }
    public void rightward()
    {
        
    }
 
    
    public void setView()
    {   
        viewPoint = new Transform3D();
        viewPoint.rotY(Math.toRadians(rot));
        viewPoint.setTranslation(new Vector3f(x,y,z));
       
        view = new Transform3D();
        view.mul(viewPoint );    
        view.setTranslation(new Vector3f(0,0,0.5f));
        u.getViewingPlatform().getViewPlatformTransform().setTransform(view);
    }
    
    public void mouseDragged(MouseEvent arg0)
    {       
    }
 
 
    public void mouseMoved(MouseEvent arg0) 
    {   
        
        double x = MouseInfo.getPointerInfo().getLocation().getX(); 
      //double y = MouseInfo.getPointerInfo().getLocation().getY();
        
        if(x<=d.width/2)
        {
            if(rot>=-45)
            {
            rot = rot - 0.1f;
            viewPoint.rotY(Math.toRadians(rot));
            view.mul(viewPoint);            
            }
            else
            {
                ;
            }
        }
        else if(x>d.width/2)
        {
            if(rot<=+45)
            {
            rot = rot + 0.1f;
            viewPoint.rotY(Math.toRadians(rot));
            view.mul(viewPoint);            
            }
            else
            {
                ;
            }
        }
 
    }
    
    //Main
    public static void main(String[]arg)
    {
        new Game3D21();
    }
 
    //3DGroups
    public BranchGroup createScene()
    {
        X = new BranchGroup();
        
        Transform3D b1 = new Transform3D();
        b1.setTranslation(new Vector3f(0,0,-2));
        TransformGroup B1 = new TransformGroup();
        B1.setTransform(b1);
        X.addChild(B1);
        B1.addChild(new Sphere(0.1f,null));
        
//////////////Lights
           Color3f lightColor = new Color3f(.3f,.3f,.3f);
           AmbientLight ambientLight= new AmbientLight(lightColor);
           ambientLight.setInfluencingBounds(bounds);
           X.addChild(ambientLight);
           DirectionalLight directionalLight = new DirectionalLight();
           directionalLight.setColor(lightColor);
           directionalLight.setInfluencingBounds(bounds);
           X.addChild(directionalLight);       
        
        return X;
    }
    
    //Classes
    class WindowListener extends WindowAdapter{public void windowClosing(WindowEvent e)
    {
        System.exit(0);
    }}
 
}
```
2.Problem, 
ich will dass wenn die maus ein stückchen nach links geschoben wird, das float rot um eins addier wird, wenn es dann 45 erreicht hat, soll nichts geschehen, in Sachen addition
&&
ich will dass wenn die maus ein stückchen nach rechts geschoben wird, das float rot um eins subtrahiert wird, wenn es dann -45 erreicht hat, soll nichts geschehen, in Sachen Subtraktion

verstehst du?
Könntest du mir sagen was ich falsch mache und wie ich das realisieren könnte?


----------



## Developer_X (30. Jun 2009)

ist schon gut ich habs rausbekommen, danke, damit hab ich was neues gelernt, wirklich danke,
PS: ich habe aber immer noch ein problem
hier:

```
public void mouseMoved(MouseEvent arg0) 
    {   
        int last = 0;
        
        double x = MouseInfo.getPointerInfo().getLocation().getX(); 
      //double y = MouseInfo.getPointerInfo().getLocation().getY();
        
        if(x>=last)
        {
            rot = rot+0.5f;
            view.rotY(Math.toRadians(rot));
            u.getViewingPlatform().getViewPlatformTransform().setTransform(view);  
                 
            last = (int) rot;
        }
        else if(x<=last)
        {
        	rot = rot-0.5f;
            view.rotY(Math.toRadians(rot));
            u.getViewingPlatform().getViewPlatformTransform().setTransform(view);  
            
            last = (int) rot;
        }
 
    }
```
egal wo meine maus ist und was ich tue, der rot wird nur addiert nich subtrahiert.


----------



## Developer_X (30. Jun 2009)

und wenn ich die methode mul einsetzte, dann wird die methode setTranslation ganz und gar ignoriert


----------



## Marco13 (30. Jun 2009)

Lass' das mit der MouseInfo und PointerInfo (um Himmels willen, das hat ja das Potential das neue "getGraphics" zu werden ...  ). Schau dir an, was man mit MouseBehaviors machen kann - da gibt es Beispiele dazu. Im Zweifelsfall kann man aber auch einen ganz normalen MouseMotionListener verwenden....


----------



## Developer_X (1. Jul 2009)

gut, ich werds mir mal anschauen,
aber du hast mir immer noch nichts zu meinem zweiten Problem gesagt:
Ich hab dir ne zeichnung angelegt, die zeigt, was ich will:

Der schwarze ball ist die Kamera, die immer auf den ball schaut.

Der rote Ball ist das zentrum, ist eine TransformGroup, die später mal eine Figur im spiel werden wird, diese wird mit den pfeiltasten bewegt, 

Also durch Mausbewegungen soll der schwarze ball um den roten Ball gedreht werden.
Aber genauer gesagt, der rote ball befindet sich hinter dem schwarzen, wenn nun der rote gedreht wird, dreht sich der schwarze um die rote, verstehst du?

Wie soll ich das realisieren, bevor ich nämlich das mit den mausbewegungen machen, und mir die behaviors anschaue, muss ich erst einmal das machen, was ich will, verstehst du?

Kannst du mir da weiterhelfen?
Und mir eventuell sagen, was ich in der Methode setView ändern sollte?


----------



## Marco13 (1. Jul 2009)

Was ich verstanden habe hätte man mit "Third Person Game" zusammenfassen können. Aber... was soll ich dazu sagen... ob ich Zeit und Lust habe, das gepostete Zeug mal zu compilieren ... mal sehen.


----------



## Developer_X (1. Jul 2009)

ok, ich kann so lang warten, bitte ich will dich zu nichts drängen,
versteh das bitte nicht falsch, aber könntest du mir schon in wenigen Tagen, ca. 4 vielleicht einen Lösung vorschlag geben?


----------



## Marco13 (1. Jul 2009)

Soll ich dir auch noch den Arsch hinterhertragen? Ich hatte es mir schon so oft vorgenommen, aber irgendwie schaff' ich es nicht, mir anzugewöhnen, in deinen Threads nicht mehr zu antworten. Ich sollte wirklich mal das mit der Ignore-Liste ausprobieren

```
// Von http://www.java-forum.org/spiele-und-multimedia-programmierung/85149-eine-frage-zur-viewbesetzung.html
//package Game1;

import java.awt.event.*;
import java.awt.*;

import javax.media.j3d.*;
import javax.swing.*;
import javax.vecmath.*;

import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.universe.*;

@SuppressWarnings("serial")
public class Game3D21 extends JFrame implements KeyListener, MouseMotionListener
{
    //Attribute
        Dimension d = new Dimension(500,500); //Toolkit.getDefaultToolkit().getScreenSize();

        float x,y,z;
        float rot;

        //Transform3D viewPoint;

        BranchGroup X = new BranchGroup();

        //Transform3D view;
        //TransformGroup View;

        BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 1000.0);

        SimpleUniverse u;
        TransformGroup B1;

     Matrix4f sphereTransform = new Matrix4f();
     Matrix4f viewTransform = new Matrix4f();
     Vector3f relativeTranslation = new Vector3f();

     Point previousMousePosition = new Point();

    //Constructor
    public Game3D21()
    {
        super("Game3D21");
        //sets n' adds
        setSize(d);
        //setUndecorated(true);
        setLayout(new BorderLayout());

        addWindowListener(new WindowListener());

        sphereTransform.setIdentity();
        //sphereTransform.setTranslation(new Vector3f(0,0,-2));

        relativeTranslation = new Vector3f(0,0,2);

        viewTransform.setIdentity();

        BranchGroup scene = createScene();
        GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
        Canvas3D canvas = new Canvas3D(config);
        add("Center", canvas);
        canvas.addKeyListener(this);
        canvas.addMouseMotionListener(this);
        u = new SimpleUniverse(canvas);
        u.addBranchGraph(scene);

        //setView();

        updateView(0,0);


        setVisible(true);
    }

    //implement Methods
    public void keyPressed(KeyEvent arg0)
    {
        if(arg0.getKeyCode()==KeyEvent.VK_UP)
        {
            forward();
        }
        else if(arg0.getKeyCode()==KeyEvent.VK_DOWN)
        {
            backward();
        }
        else if(arg0.getKeyCode()==KeyEvent.VK_LEFT)
        {
            leftward();
        }
        else if(arg0.getKeyCode()==KeyEvent.VK_RIGHT)
        {
            rightward();
        }
    }

    public void keyReleased(KeyEvent arg0)
    {
    }

    public void keyTyped(KeyEvent arg0)
    {
    }

    //Most Important Methods!!!
    public void forward()
    {
        move(0, 0.01f,0);
    }
    public void backward()
    {
        move(0,-0.01f,0);
    }
    public void leftward()
    {
        move(-0.01f,0,0);
    }
    public void rightward()
    {
        move( 0.01f,0,0);
    }

    private void move(float dx, float dy, float dz)
    {
        Matrix4f transform = new Matrix4f();
        transform.setIdentity();
        transform.setTranslation(new Vector3f(dx,dy,dz));
        sphereTransform.mul(transform, sphereTransform);
        B1.setTransform(new Transform3D(sphereTransform));

        updateView(0,0);
    }


    /*
    public void setView()
    {
        viewPoint = new Transform3D();
        viewPoint.rotY(Math.toRadians(rot));
        viewPoint.setTranslation(new Vector3f(x,y,z));

        view = new Transform3D();
        view.mul(viewPoint );
        view.setTranslation(new Vector3f(0,0,0.5f));
        u.getViewingPlatform().getViewPlatformTransform().setTransform(view);
    }
    */

    public void mouseDragged(MouseEvent arg0)
    {
        float dx = arg0.getX() - previousMousePosition.x;
        float dy = arg0.getY() - previousMousePosition.y;

        updateView(dy/100.0f, dx/100.0f);

        previousMousePosition = arg0.getPoint();
    }


    public void mouseMoved(MouseEvent arg0)
    {


        previousMousePosition = arg0.getPoint();

    }

    private void updateView(float dx, float dy)
    {
        Matrix4f transform = new Matrix4f();
        transform.setIdentity();
        transform.rotX(dx);
        viewTransform.mul(transform, viewTransform);

        transform.setIdentity();
        transform.rotY(dy);
        viewTransform.mul(transform, viewTransform);

        Matrix4f fullTransform = new Matrix4f();
        fullTransform.setIdentity();

        fullTransform.mul(sphereTransform);
        fullTransform.mul(viewTransform);

        transform.setIdentity();
        transform.setTranslation(relativeTranslation);
        fullTransform.mul(transform);

        u.getViewingPlatform().getViewPlatformTransform().setTransform(new Transform3D(fullTransform));
    }




    //Main
    public static void main(String[]arg)
    {
        new Game3D21();
    }

    //3DGroups
    public BranchGroup createScene()
    {
        X = new BranchGroup();

        B1 = new TransformGroup();
        B1.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        B1.setTransform(new Transform3D(sphereTransform));
        X.addChild(B1);
        B1.addChild(new Sphere(0.1f,null));

//////////////Lights
           Color3f lightColor = new Color3f(.3f,.3f,.3f);
           AmbientLight ambientLight= new AmbientLight(lightColor);
           ambientLight.setInfluencingBounds(bounds);
           X.addChild(ambientLight);
           DirectionalLight directionalLight = new DirectionalLight();
           directionalLight.setColor(lightColor);
           directionalLight.setInfluencingBounds(bounds);
           X.addChild(directionalLight);

        return X;
    }

    //Classes
    class WindowListener extends WindowAdapter{public void windowClosing(WindowEvent e)
    {
        System.exit(0);
    }}

}
```


----------



## Developer_X (1. Jul 2009)

danke, aber
sorry ich hoffe du hast das nicht falsch verstanden,
ich danke dir wirklich sehr,
aber ich wollte nicht unhöflich erscheinen, verstehst du das?
Bitte versteh es nicht falsch


----------



## Marco13 (1. Jul 2009)

Ich neige dazu, Dinge so zu verstehen, wie sie gesagt werden, und auf Höflichkeit (im Klassischen Sinn) lege ich mal SOwas von keinen wert.


----------



## Developer_X (2. Jul 2009)

es tut mir leid, aber ich hab mich falsch ausgedrückt, es war meine Schuld, verzeihst du mir=?


----------



## tuxedo (2. Jul 2009)

Man man man.. @DevX ... du hinterlässt gerade eine "schleimspur" das ist der Hammer...


----------



## Developer_X (2. Jul 2009)

wenn ich mich einmal entschuldige, wird dies gleich als "schleimen" angesehen, das ist mir egal was die anderen denken, ich will dir nur sagen, dass es mir leid tut, und dass ich mich hiermit entschuldige, ein weiteres mal


----------



## Developer_X (2. Jul 2009)

Ich hab mir den Quelltext etwas versucht abzuändern, um mein Ziel zu erreichen ging aber nicht.

Mit deinem Code habe ich aber ein problem, ich hab im Anhang mal ein little standard level, nichts besonderes, mit deinem Code benutzt,


Also das Bild im Anhang, das zeigt wies momentan mit deinem ProgrammVorschlag geht, man kann mit den pfeiltasten vor, rück, links und rechtswärts
und man kann egal wo man ist, sich mit der Maus umgucken, eines gefällt mir daran aber nicht:

1.wie du siehst, habe ich das mit der X-Achse weggemacht, weil ich ein Problem hatte, ich wollte, dass wenn der float der die X_Achse bestimmt
entweder -20 oder 20 überschreitet, die funktion begrenzen sollte, verstehst du?

2.wie du siehst, habe ich dir alles auf die zeichung gepackt, aber das, was ich will, ist noch nicht ganz erreicht, 
also:
angenommen ich befinde mich auf Punkt 0,0;
Und jetzt, drehe ich die kamera sagen wir 20° um die Y-Achse
wenn ich jetzt gerade aus laufe, läuft er so entlang, als ob die Y_Achse 0 wäre, es geht darum, dass mit der Methode move, sich ja der ball bewegt, und die Methode mit dem *view dreht ja nur die Kamera um den schwarzen ball, aber das ist ja genau der schwer puntk, 
was ich eigentlich will, ist nichts anderes, außer dass der Ball ebenfalls gedreht wird, sodass die Kamera immer nur den Rücken, des Balls filmt, denn dann würde die bewegung quer durch den Raum möglich.

Also um das ganze zusammen zufasseN:
Ich habe 2 Probleme#

Problem 1:
Ich möchte gerne die methode updateView so blokieren, dass man mit die X-Achse des Balls, nicht weiter, als 20f bzw. -20f drehen kann.

Problem 2:
Ich möchte gerne dass der Ball ebenfalls durch die Mausbewegung gedreht wird, sodass die Kamera immer auf den Rücken des Balls filmt, und ich mich quer durch den raumbewegen kann, wenn ich also zum Beispiel, mit der Kamera 45° um die Y_Achse gedreht habe, dann soll der Ball, nicht wie gewohnt den linien folgenden, sondern einfach quer durch den Raum gesteuert werden können, wie "Bild.jpg" zeigt,

Ich habe keine Ahung wie ich das anstellen sollte, 
da:
1. wegen dem ersten Problem:
Du verwendest da ja ein float, dass du durch 100 teilst, 
wie aber bekomme ich die aktuelle X_Achse_rotation
sodass ich bestimmen kann, mit if-clauseln, dass die X_achse höchstens 20 bzw. -20
'°'
 erreichen darf.
2. da hab ich gar keine ahnung wie ich das anstellen sollte, kannst du mir da einen Tipp geben bitte?


----------



## Marco13 (2. Jul 2009)

Den Tipp, den du schon oft genug gehört hast: Ein 3D-Spiel Programmieren ist nichts für Anfänger, und sich einen Haufen zusammenkopierter Trivialitäten durch ständiges Nachfragen im Forum mit den Dingen zusammenkitten zu lassen, bei denen man vielleicht mal _nachdenken_ muss, ist nicht der richtige Weg. Das hervorgehobene Wort im letzten Satz ist auch das entscheidende Stichwort: Du solltest _nachdenken_, wie das, was du vorhast erreicht werden könnte. Du solltest dir im klaren darüber sein, welche Auswirkungen welche Folge von Transformationen hat, und zumindest eine Idee davon haben, was "Kommutativität" ist. Dann kannst du dir ein paar Formeln aufschreiben (ja, richtig mit Bleistift und diesem dünnen, weißen Zeug... Papier!) und vielleicht ein paar Bildchen dazu, und wenn du sicher bist, die Lösung gefunden zu haben, kannst du den Computer einschalten und dann versuchen, dich schrittweise zu dieser Lösung hinzuarbeiten. Nicht zu sagen "Ich will eine Figur durch ein Level steuern", sondern sagen "Ich will dass die Bewegung eines Objektes von einer Drehung abhängig ist, die vorher durchgeführt wurde" - und dieses Problem dann formaler und präziser beschreiben und zu lösen versuchen. Vielleicht ist dir trotz der vielen derartigen Hinweise, die du schon bekommen hast, eine Sache nicht klar geworden: _Programmieren ist nicht leicht_, und dass man nach 13 Jahren Schulmathematik noch mal 2 Jahre 10 Stunden am Tag _Informatik studiert_ bevor man sich die ersten Vorlesungen zur Graphischen Datenverarbeitung (dem, was du zu machen glaubst) anhört, hat seinen Grund. Ich will damit ganz ausdrücklich NICHT sagen, dass das eine Voraussetzung für das ist, was du vorhast. Ich habe mich auch schon vorher mit solchen Sachen beschäftigt - auf dem Level, das ich mir damals eben Computer Graphics Principles and Practice angeschafft habe, und ich mit C mal ein Programm geschrieben habe, das eine Matrix mit einem Punkt multipliziert, so dass man dann ein Drahtgittermodell eines Würfels mit der Maus drehen konnte. Ich programmiere jetzt seit 15 Jahren. Aber ich würde mir nicht zutrauen, ein auch nur ansatzweise "vernünftiges" 3D-Spiel zu schreiben. "Lernen" heißt in diesem Bereich auch oft "Bescheidenheit lernen".

Um deine Frage zu beantworten: Du musst die Reihenfolge der Matrixmultiplikationen ändern.


----------



## tuxedo (3. Jul 2009)

Developer_X hat gesagt.:


> wenn ich mich *einmal *entschuldige, wird dies gleich als "schleimen" angesehen, das ist mir egal was die anderen denken, ich will dir nur sagen, dass es mir leid tut, *und dass ich mich hiermit entschuldige, ein weiteres mal*



So langsam sind deine vielen entschuldigungen "stressig". 

Im übrigen:

@Marco13
Full ACK

Klein anfangen, dann hocharbeiten. Zwischen dem ersten Satzteil und dem letzten kannst du locker mal 10 Jahre vergehen lassen.

- Alex


----------



## Developer_X (3. Jul 2009)

Marco13 hat gesagt.:


> Den Tipp, den du schon oft genug gehört hast: Ein 3D-Spiel Programmieren ist nichts für Anfänger, und sich einen Haufen zusammenkopierter Trivialitäten durch ständiges Nachfragen im Forum mit den Dingen zusammenkitten zu lassen, bei denen man vielleicht mal _nachdenken_ muss, ist nicht der richtige Weg. Das hervorgehobene Wort im letzten Satz ist auch das entscheidende Stichwort: Du solltest _nachdenken_, wie das, was du vorhast erreicht werden könnte. Du solltest dir im klaren darüber sein, welche Auswirkungen welche Folge von Transformationen hat, und zumindest eine Idee davon haben, was "Kommutativität" ist. Dann kannst du dir ein paar Formeln aufschreiben (ja, richtig mit Bleistift und diesem dünnen, weißen Zeug... Papier!) und vielleicht ein paar Bildchen dazu, und wenn du sicher bist, die Lösung gefunden zu haben, kannst du den Computer einschalten und dann versuchen, dich schrittweise zu dieser Lösung hinzuarbeiten. Nicht zu sagen "Ich will eine Figur durch ein Level steuern", sondern sagen "Ich will dass die Bewegung eines Objektes von einer Drehung abhängig ist, die vorher durchgeführt wurde" - und dieses Problem dann formaler und präziser beschreiben und zu lösen versuchen. Vielleicht ist dir trotz der vielen derartigen Hinweise, die du schon bekommen hast, eine Sache nicht klar geworden: _Programmieren ist nicht leicht_, und dass man nach 13 Jahren Schulmathematik noch mal 2 Jahre 10 Stunden am Tag _Informatik studiert_ bevor man sich die ersten Vorlesungen zur Graphischen Datenverarbeitung (dem, was du zu machen glaubst) anhört, hat seinen Grund. Ich will damit ganz ausdrücklich NICHT sagen, dass das eine Voraussetzung für das ist, was du vorhast. Ich habe mich auch schon vorher mit solchen Sachen beschäftigt - auf dem Level, das ich mir damals eben Computer Graphics Principles and Practice angeschafft habe, und ich mit C mal ein Programm geschrieben habe, das eine Matrix mit einem Punkt multipliziert, so dass man dann ein Drahtgittermodell eines Würfels mit der Maus drehen konnte. Ich programmiere jetzt seit 15 Jahren. Aber ich würde mir nicht zutrauen, ein auch nur ansatzweise "vernünftiges" 3D-Spiel zu schreiben. "Lernen" heißt in diesem Bereich auch oft "Bescheidenheit lernen".
> 
> Um deine Frage zu beantworten: Du musst die Reihenfolge der Matrixmultiplikationen ändern.




Also soll ich mir die Methode updateView etwas genauer ansehen?


----------



## Xams (3. Jul 2009)

NEIN


Du sollst Programmieren von Grund auf lernen und dich erst mit Basisdingen beschäftigen (OOP, z.B)
bevor du dich ansowas setzt.


----------



## TheChemist (4. Jul 2009)

Developer_X hat gesagt.:


> Also soll ich mir die Methode updateView etwas genauer ansehen?



Wow, ich wollte ja eigentlich nix zu der ganzen Sache schreiben, aber der Post war zu hart. Hast du eigentlich geschrieben was Marko13 da geschrieben hat? Das ging wohl in besonderem Maße an dich! Die Antwort ist schon echt frech, so irgnorant ist sie.

Kann den anderen aber nur zustimmen. Beschäftige mich auch noch nicht so lang mit Programmierung und lerne eigentlich jedesmal etwas neues wenn ich mich nochmal mit den Basics beschäftige.


----------



## Developer_X (4. Jul 2009)

ok,


----------



## Marco13 (4. Jul 2009)

Developer_X hat gesagt.:


> Also soll ich mir die Methode updateView etwas genauer ansehen?



Nein. Du sollst dir genau überlegen, wie du das erreichen kannst, was du vorhast, und DANN erst den Computer einschalten, und versuchen, das zu programmieren.


----------

