#1 08.02.2005 07:48:09

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Mathe, zwei Positionen -> Richtung

Hi!

Okay, ich habe in Mathe oft gepennt oder hatte einen Kater, weil wir die Samstag morgens 2 Stunden lang hatten  big_smile

Also eine Mathe Frage:

Ich habe 1 Objekt (Sternentor), das soll immer genau zur Kamera zeigen.
Beide haben die selbe Y Korrdinate, aber verschiedene X und Z. Y ist der Vektor, der nach oben zeigt.

Also brauche ich eine MatrixRotationY.

Wie errechen ich diesen Wert?

Sagen wir mal Sternentor hat SX,SY und SZ, Kamera hat CX,CY und CZ.

Wir errechne ich den Wert, den ich bei MatrixRotationY einsetzen muss, damit das Sternentor genau auf die Kamera zeigt?

Danke sehr,

firle

Offline

 

#2 08.02.2005 09:40:08

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

Re: Mathe, zwei Positionen -> Richtung

Du berechnest den Vektor CXYZ - SXYZ um den Vektor vom Sternentor zur Cam zu bekommen.

Mit Hilfe meiner http://www.delphidev.de/phpBB2/viewtopic.php?t=69 kannst du dann die Matrix berechnen:

Front-Vektor: (CX-SX, CY-SY, CZ-SZ)
Normal-Vektor: (0,1,0)  (zeigt nach oben)
Position: (SX, SY, SZ)

Ich bin mir jetzt auswendig nicht sicher wie das Objekt (als 3D-Modell) ausgerichtet sein muss damit es im Spiel richtig ausgerichtet wird, also einfach testen...
Es müsste theoretisch so sein:
Links muss (1,0,0) sein. Oben muss (0,1,0) sein und Vorne (0,0,1).
Kannst dir auch einfach die Funktion entsprechnd ändern, so das es so hinkommt wie du es brauchst...

Coolcat


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

Offline

 

#3 08.02.2005 10:12:53

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Mathe, zwei Positionen -> Richtung

Hi Coolcat,

danke für den Hinweis. Habe mir das runtergezogen und gucke mal rein. Aber kann man das nicht irgendwie ganz einfach mit einer simplen Formel aus den beiden Positionen errechnen?

Firle

Offline

 

#4 08.02.2005 10:31:49

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

Re: Mathe, zwei Positionen -> Richtung

Das ist doch vom Prinzip eine Formel smile , nur das du dir den Umweg über den Winkel sparst...
Ggf, könnte man in deinem Fall noch die Normalisierung (teilweise) einsparen da beide Vektoren exakt im rechten winkel sind...

Coolcat


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

Offline

 

#5 08.02.2005 10:38:55

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Mathe, zwei Positionen -> Richtung

Hi Coolcat,

function D3DXMatrixRotationVec(out matrix: TD3DXMatrix; vecNormal, vecFront,
                                position: TD3DXVector3): TD3DXMatrix;

Womit muss ich das füttern?

Zitat:


Front-Vektor: (CX-SX, CY-SY, CZ-SZ)
Normal-Vektor: (0,1,0) (zeigt nach oben)
Position: (SX, SY, SZ)

Was ist Outmatrix? Und da kriege ich eine Matrix zurück, ist das dann schon die Rotierte Matrix (des Sternentors in meinem Fall)?

Firle

Offline

 

#6 08.02.2005 10:42:13

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

Re: Mathe, zwei Positionen -> Richtung

Zusatz: Du kannst dir natürlich auch einfach den Winkel über ArcSin, ArcCos bzw. ArcTan berechnen...musst du halt überlegen ob es das bringt....

Coolcat


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

Offline

 

#7 08.02.2005 10:43:15

Chris
ExtremeMember
Ort: Erlangen, Bay
Registriert: 24.01.2005
Beiträge: 694
Web-Seite

Re: Mathe, zwei Positionen -> Richtung

Ganz einfach.
Durufst das ganz mit den werten von oben auf un gibts noch ne Matrix mit rein.

Code:

D3DXMatrixRotationVec(matWorld, vecNormal, vecFront, vecPos);



und dann gehts....

mfg Chris


Nimm meinen Rat an - ich brauch ihn sowieso nicht

Offline

 

#8 08.02.2005 10:45:05

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

Re: Mathe, zwei Positionen -> Richtung

Das muss rein:
Front-Vektor: (CX-SX, CY-SY, CZ-SZ)
Normal-Vektor: (0,1,0) (zeigt nach oben)
Position: (SX, SY, SZ)

Das kommt raus:
Die out matrix ist die bereits fertig rotierte und verschobene Matrix.
"out" ist das Schlüssenwort für Ausgabe, ähnlich wie "var" oder "const"

Coolcat


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

Offline

 

#9 08.02.2005 10:46:34

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Mathe, zwei Positionen -> Richtung

Hi!

Ich habe mich nur gewundert, es ist ja auch eine Funktion und da kommt hinten auch noch ne Matrix raus....

Firle

Offline

 

#10 08.02.2005 10:48:11

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

Re: Mathe, zwei Positionen -> Richtung

Zitat:

da kommt hinten auch noch ne Matrix raus....

Die Matrizen sind identisch, ist bei den DirectX-Funktionen aus der SDK ja genauso...

Coolcat


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

Offline

 

#11 08.02.2005 10:49:20

Chris
ExtremeMember
Ort: Erlangen, Bay
Registriert: 24.01.2005
Beiträge: 694
Web-Seite

Re: Mathe, zwei Positionen -> Richtung

Des ist bei fast allen
D3DX... Funktionen so
die haben das Ergebnis als Rückgabewert und als 'Out-Parameter'.

mfg Chris

--edit--
mist Coolcat war schneller...  :mrgreen:


Nimm meinen Rat an - ich brauch ihn sowieso nicht

Offline

 

#12 10.02.2005 07:40:52

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Mathe, zwei Positionen -> Richtung

Hallo,

@Coolcat: Ich habe das mal jetzt ausprobiert, aber deine funktion läuft unter DX8 nicht, weil er da die erste Matrizen nicht kennt:

Code:

// =============================================================================
// D3DXMatrixRotationVec
// =============================================================================
// Berechnet aus einem Normal-Vektor (zeigt nach "oben") und einem 
// Front-Vektor (zeigt nach "vorne") eine Rotationsmatrix.
// Die beiden Vektoren brauchen nur ungef�r im rechten Winkel zu sein.
// Zus�zlich kann noch eine Position angegeben werden, 
// um das Objekt zu verschieben.
// Diese Funktion ist schneller als wenn man mit Winkel rechnen wrde.
function TCommandoform.D3DXMatrixRotationVec(out matrix: TD3DXMatrix; vecNormal, vecFront,
                                position: TD3DXVector3): TD3DXMatrix;
var vecLeft: TD3DXVector3;
begin
  D3DXVec3Normalize( vecNormal, vecNormal );
  D3DXVec3Normalize( vecFront, vecFront );
  D3DXVec3Cross( vecLeft, vecFront, vecNormal );
  D3DXVec3Normalize( vecLeft, vecLeft );
  D3DXVec3Cross( vecFront, vecNormal, vecLeft);
  matrix._00 := vecLeft.x;
  matrix._01 := vecLeft.y;
  matrix._02 := vecLeft.z;
  matrix._03 := 0;
  matrix._10 := vecNormal.x;
  matrix._11 := vecNormal.y;
  matrix._12 := vecNormal.z;
  matrix._13 := 0;
  matrix._20 := vecFront.x;
  matrix._21 := vecFront.y;
  matrix._22 := vecFront.z;
  matrix._23 := 0;
  matrix._30 := position.x;
  matrix._31 := position.y;
  matrix._32 := position.z;
  matrix._33 := 1;
  result := matrix;
end;



Muss ich bei allen Matrizen einfach +11 rechnen,
also Start mit matrix._11 statt 00 und _12 statt 01?

Und wie schalte ich Mipmapping ab?
Bei mir kommt kein einziger Mipmap-Schalter im Quellcode meines Projektes vor, aber in der DirectX8 Unit gibt es da ganz viele.

Danke!
Firle

Offline

 

#13 10.02.2005 09:04:07

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

Re: Mathe, zwei Positionen -> Richtung

Zitat:

Muss ich bei allen Matrizen einfach +11 rechnen,
also Start mit matrix._11 statt 00 und _12 statt 01?

jep... smile

@Mipmaps: Ich glaube beim Laden der Texturen konnte man ein MaxMipMapLevel angeben oder sowas....

Zitat:

MipLevels
    [in] Number of mip levels requested. If this value is zero or D3DX_DEFAULT, a complete mipmap chain is created.

Coolcat


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

Offline

 

#14 10.02.2005 09:41:48

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Mathe, zwei Positionen -> Richtung

Hi Coolcat,

danke für die Hinweise, ich probiere dann nochmal  big_smile

Firle

Offline

 

#15 11.02.2005 07:39:52

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Mathe, zwei Positionen -> Richtung

Hi!

Also ich verwende das jetzt und schwups ist das Sternentor ganz weg, da muß eine Verschiebung stattfinden.

Aufgerufener Code, um Sternentor zum Planeten zu drehen:

Code:

D3DXMatrixRotationVec(sternentor.matrot,
                      D3DXVector3(0,1,0),
                      d3dxvector3(planet3d[nchosenplanet].x - x,
                                  planet3d[nchosenplanet].y - y,
                                  planet3d[nchosenplanet].z - z),
                      d3dxvector3(x,y,z));


Editby Coolcat: Hab das mal lesbar gemacht, wenn das in einer Zeile steht kann das doch kein Mensch lesen...

Geänderte Funktion von Coolcat DX8:

Code:

// =============================================================================
// D3DXMatrixRotationVec
// =============================================================================
// Berechnet aus einem Normal-Vektor (zeigt nach "oben") und einem 
// Front-Vektor (zeigt nach "vorne") eine Rotationsmatrix.
// Die beiden Vektoren brauchen nur ungef�r im rechten Winkel zu sein.
// Zus�zlich kann noch eine Position angegeben werden, 
// um das Objekt zu verschieben.
// Diese Funktion ist schneller als wenn man mit Winkel rechnen wrde.
function TCommandoform.D3DXMatrixRotationVec(out matrix: TD3DXMatrix; vecNormal, vecFront,
                                position: TD3DXVector3): TD3DXMatrix;
var vecLeft: TD3DXVector3;
begin
  D3DXVec3Normalize( vecNormal, vecNormal );
  D3DXVec3Normalize( vecFront, vecFront );
  D3DXVec3Cross( vecLeft, vecFront, vecNormal );
  D3DXVec3Normalize( vecLeft, vecLeft );
  D3DXVec3Cross( vecFront, vecNormal, vecLeft);
  matrix._11 := vecLeft.x;
  matrix._12 := vecLeft.y;
  matrix._13 := vecLeft.z;
  matrix._14 := 0;
  matrix._21 := vecNormal.x;
  matrix._22 := vecNormal.y;
  matrix._23 := vecNormal.z;
  matrix._24 := 0;
  matrix._31 := vecFront.x;
  matrix._32 := vecFront.y;
  matrix._33 := vecFront.z;
  matrix._34 := 0;
  matrix._41 := position.x;
  matrix._42 := position.y;
  matrix._43 := position.z;
  matrix._44 := 1;
  result := matrix;
end;



Woran könnte das liegen?  :thx:

Firle

Offline

 

#16 11.02.2005 09:46:31

Chris
ExtremeMember
Ort: Erlangen, Bay
Registriert: 24.01.2005
Beiträge: 694
Web-Seite

Re: Mathe, zwei Positionen -> Richtung

Nicht matRot!! sondern das Objekt gleich mit der matrix Tranformieren die aus der func rauskommt.

da ist die Pos usw... schon drinnen..

mfg Chris


Nimm meinen Rat an - ich brauch ihn sowieso nicht

Offline

 

#17 11.02.2005 10:10:38

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Mathe, zwei Positionen -> Richtung

Hi Chris,

danke für den Tip.

Alter Code:

Code:

      x:=cos(planet3d[nchosenplanet].nweite/planet3d[nchosenplanet].nRotSpeed)*(planet3d[nchosenplanet].nrotx+14);
      z:=sin(planet3d[nchosenplanet].nweite/planet3d[nchosenplanet].nRotSpeed)*(planet3d[nchosenplanet].nrotx+14);
      y:=30-nchosenplanet*2;
      D3DXMatrixTranslation(sternentor.matxyz,x,y,z);
      //D3DXMatrixRotationY(sternentor.matrot,ncurrcamx1/x*ncurrcamy1/y);
      D3DXMatrixRotationVec(sternentor.matrot,D3DXVector3(0,1,0),d3dxvector3(planet3d[nchosenplanet].x-x,planet3d[nchosenplanet].y-y,planet3d[nchosenplanet].z-z),d3dxvector3(x,y,z));
      D3DXMatrixMultiply(matTmp, sternentor.matrot, sternentor.matxyz);
      xenscreen.Device.SetTransform(D3DTS_WORLD,mattmp);
      sternentor.g_pMesh.DrawSubset(_i);



Neuer Code:???

Code:

      x:=cos(planet3d[nchosenplanet].nweite/planet3d[nchosenplanet].nRotSpeed)*(planet3d[nchosenplanet].nrotx+14);
      z:=sin(planet3d[nchosenplanet].nweite/planet3d[nchosenplanet].nRotSpeed)*(planet3d[nchosenplanet].nrotx+14);
      y:=30-nchosenplanet*2;
      D3DXMatrixRotationVec(mattmp,D3DXVector3(0,1,0),d3dxvector3(planet3d[nchosenplanet].x-x,planet3d[nchosenplanet].y-y,planet3d[nchosenplanet].z-z),d3dxvector3(x,y,z));
      xenscreen.Device.SetTransform(D3DTS_WORLD,mattmp);
      sternentor.g_pMesh.DrawSubset(_i);



So in etwa  :?

Danke für die Hilfe!

Firle

Offline

 

#18 11.02.2005 11:10:46

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

Re: Mathe, zwei Positionen -> Richtung

jep, wird wohl richtig sein....

(deine Einrück-Technik versteh ich überings nich....)

Coolcat


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

Offline

 

#19 11.02.2005 11:44:07

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Mathe, zwei Positionen -> Richtung

Hi Coolcat,

ich rücke immer 2 Zeichen nach Begin ein, nur habe ich teilweise lange Zeilen, die in Delphi normal aussehen, hier aber so komisch umgebrochen werden ab einer gewissen Länge.

Firle

Offline

 

#20 11.02.2005 11:48:44

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

Re: Mathe, zwei Positionen -> Richtung

Zeilen sollte nicht länger als 80 Zeichen sein, falls man das ganze mal drucken will...


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

Offline

 

#21 13.02.2005 15:29:30

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Mathe, zwei Positionen -> Richtung

Hi Coolcat,

das ist eine super Funktion!!!

Spitze, vielen Dank  :thx2:

Firle

Offline

 

#22 13.02.2005 15:46:57

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

Re: Mathe, zwei Positionen -> Richtung

:mrgreen:


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

Offline

 

Brett Fußzeile

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson