#1 05.01.2008 23:09:14

simon
ProMember
Ort: Düsseldorf
Registriert: 03.06.2006
Beiträge: 168

Einen Planeten mit der Maus drehen - aber Richtig!

Hi Leute smile
Folgendes Problem, ich habe vor mir (Kamera) einen Planeten (Kugel) den ich aber immer so drehen möchte wie ich meine Maus bewege - dh
wenn ich die Maus nach oben bewege soll er sich immer nach oben drehen usw - und nicht (wie bis jetzt) wenn ich die Kugel paar mal drehe bewegt sie sich wie sie will.
Das Größte Problem dabei - ich kann auf keine Dx Spezifischen Liberys zugreifen. (eigentlich schreibe ich das für eine kleine Palmtop App.)
Zur Verfügung stehen mir:
MouseX und MouseY (also die Stylus Position)
und die Kugel kann ich via SetRotation (XYZ) rotieren.

Könnt ihr mir Tips geben?

schönen Gruß,

Simon


grrr

Offline

 

#2 06.01.2008 11:09:40

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Einen Planeten mit der Maus drehen - aber Richtig!

Also für mein JavaScript-Dings benutze ich aktuell folgendes:

Code:

float horSin = (float)Math.sin(viewAngleHorizontal);
float horCos = (float)Math.cos(viewAngleHorizontal);
float verSin = (float)Math.sin(viewAngleVertical);
float verCos = (float)Math.cos(viewAngleVertical);
Vector3f eye = new Vector3f(
  horSin * verCos * viewDistance,
  verSin * viewDistance,
  horCos * verCos * viewDistance );

setView(eye, new Vector3f(0,0,0), new Vector3f(0,1,0));

viewDistance ist halt der Abstand der Camera vom Mittelpunkt. viewAngleHorizontal kann man von 0 bis 360 Grad einstellen. Also wenn man die Maus in X-Richtung dreht, änderst du den Wert um den entsprechdenden Wert. Genauso mit dem Wert viewAngleVertical, diesen kann man aber nur von -70 bis +70 Grad ändern. Beachte das die Sicht nicht parallel zum Up-Vector werden darf. Wenn du das brauchst musst du den Up-Vector noch zusätzlich anpassen.

Allerdings habe ich das selbst noch nicht an die Maus gekoppelt, JavaScript ist einfach zu langsam mit vielen Planeten wie in meinem Fall. Ich werde einfach Buttons einbauen wo man die Ansicht dann in z.B. 10 Grad Schritten drehen kann.

Falls die die Methode setView fehlt, kannst du die einfach wie folgt selbst implementieren. Achtung: Im Gegensatz zur Methode im DGL-Wiki wird bei mir der Up-Vektor nicht normalisiert, da er sowieso immer 010 ist.

Code:

/** calculate a view matrix.
 * @param eye Eye/Camera-Position
 * @param lookAt LookAt-Position
 * @param up Up-Vector (has to be normalized!) */
public void setView(Vector3f eye, Vector3f lookAt, Vector3f up) {
  Vector3f f = lookAt.sub(eye).normalize();
  Vector3f s = f.cross(up).normalize();
  Vector3f u = s.cross(f);

  view = new Matrix44f(
     s.x,  s.y,  s.z, (-s.x*eye.x) - s.y*eye.y - s.z*eye.z,
     u.x,  u.y,  u.z, (-u.x*eye.x) - u.y*eye.y - u.z*eye.z,
    -f.x, -f.y, -f.z,  f.x*eye.x + f.y*eye.y + f.z*eye.z,
     0  ,  0  ,  0  , 1  );

  this.side = s;
  this.up = u;
}

(siehe auch http://wiki.delphigl.com/index.php/gluLookAt )


My software never has bugs. It just develops random features.

Offline

 

#3 06.01.2008 12:42:38

simon
ProMember
Ort: Düsseldorf
Registriert: 03.06.2006
Beiträge: 168

Re: Einen Planeten mit der Maus drehen - aber Richtig!

oo cool werde es gleich mal implementieren -
mir fällt aber gerade auf - dreht man hier nicht die Kamera??
naja ist in meinem Fall ehh egal smile
danke!!! hat mir sehr geholfen !! smile

Beitrag geändert von simon (06.01.2008 12:44:10)


grrr

Offline

 

#4 06.01.2008 13:49:48

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Einen Planeten mit der Maus drehen - aber Richtig!

Ja, man dreht die Kamera. Da die View-Matrix aber eh in die World-Matrix mit eingebaut wird dürfte das wohl keine Rolle spielen. Für den Computer ist es das gleiche ob die die Kamera bewegst oder die Welt.


My software never has bugs. It just develops random features.

Offline

 

#5 06.01.2008 14:28:29

simon
ProMember
Ort: Düsseldorf
Registriert: 03.06.2006
Beiträge: 168

Re: Einen Planeten mit der Maus drehen - aber Richtig!

jup smile
danke nochmal


grrr

Offline

 

Brett Fußzeile

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson