Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Bas94

Frischling

  • »Bas94« ist der Autor dieses Themas

Beiträge: 12

Wohnort: Gräfenhainichen

Beruf: Schüler

  • Private Nachricht senden

1

21.05.2011, 15:38

Drehung eines Modells in Richtung eines Vektors

Hallo Leute,

dies ist mein erster Beitrag und ich hoffe ihr versteht mich insoweit da ich nicht der Sprachenkünstler bin ;-)
Nun zu meiner Frage:

Ich bin gerade dabei eine eigene Grafikengine zu entwickeln und bin dabei auf das Problem gestoßen, dass ich keinen Weg finde ein Objekt bzw Modell in eine Richtung in die ein Vektor zeigt zu drehen.
Mein Modell besteht aus einer Menge von Punkten die es nun in Richtung des Vektors neu auszurichten gilt.
Das Ausgangsmodell ist dabei immer mit einen Ausrichtungsvektor in Richtung x-Achse versehen.
Bsp in 2d:

Im 2dimensionalen könnte man Winkel berechnen und die Punkte mithilfe einer Rotationsmatrix drehen. Das Problem was ich nun habe ist aber einen Weg zu finden wie ich dies in einem 3d-Raum bewerkstelligen kann, da es dort relativ schwierig ist Winkel zu errechnen die zu einer Rotationsmatrix passen.

Ich hoffe ihr könnt mir helfen.

Mfg Bas94.
Murphys Gesetz gilt immer :!:

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

21.05.2011, 15:49

In 3d brauchst du 2 Vektoren um eine Ausrichtung zu definieren. Einen der in deine Richtung zeigt und einen zweiten der normal drauf steht. Dann kannst du dir übers Kreuzprodukt den dritten Basisvektor ausrechnen und diese drei Vektoren dann in die Spalten (oder Zeilen, je nachdem) einer Matrix schreiben.

Bas94

Frischling

  • »Bas94« ist der Autor dieses Themas

Beiträge: 12

Wohnort: Gräfenhainichen

Beruf: Schüler

  • Private Nachricht senden

3

21.05.2011, 16:02

Danke sehr das hilft mir schon ziemlich weiter .. ich werde es mal ausprobieren ^^
Murphys Gesetz gilt immer :!:

Bas94

Frischling

  • »Bas94« ist der Autor dieses Themas

Beiträge: 12

Wohnort: Gräfenhainichen

Beruf: Schüler

  • Private Nachricht senden

4

21.05.2011, 19:22

Ein kleiner Fehler ist irgendwie noch drinne
wenn ich den körper mit der matrix verändere wird dieser auch verzerrt. woran liegt das? ich habe eigentlich alle vektoren für die matrix normiert.

hier ein bild:



und der code (hoffentlich stöhrt es nicht dass er in delphi ist ^^)

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
function vecmatrixmult(vec:TVector; A:TMatrix3D):TVector;
var vecresult:TVector;
begin
  vecresult.x:=vec.x*A[1].x+vec.y*A[2].x+vec.z*A[3].x;
  vecresult.y:=vec.x*A[1].y+vec.y*A[2].y+vec.z*A[3].y;
  vecresult.z:=vec.x*A[1].z+vec.y*A[2].z+vec.z*A[3].z;
  result:=vecresult;
end;

procedure ausrichten(AusgForm:array of TVector; var FinForm:array of TVector; ausricht:TVector);
var orthovec,orthovec2:TVector;
    A:TMatrix3D; //nichts anderes als ein array von TVector mit der länge 3.. der index des arrays sind die spalten der matrix
    laenge,i:integer;
begin
  //zuerst bilde ich wie gesagt eine senkrechte auf den gegebenen vektor
  ausricht:=normieren(ausricht);
  if ausricht.z<>0 then begin
    orthovec:=tovec(1,0,0);
    orthovec.z:=(ausricht.x*orthovec.x+ausricht.y*orthovec.y)/ausricht.z;
  end else begin
    if ausricht.y<>0 then begin
    orthovec:=tovec(0,0,1);
    orthovec.y:=(ausricht.x*orthovec.x+ausricht.z*orthovec.z)/ausricht.y;
    end else begin
    orthovec:=tovec(0,1,0);
    orthovec.x:=(ausricht.y*orthovec.y+ausricht.z*orthovec.z)/ausricht.x;
    end;
  end;
  //nachdem alles nulldivisionen abgesichert sind normiere ich den vektor damit keine vergroeßerung des Objekts auftritt
  orthovec:=normieren(orthovec);
  // dann noch den 3. vektor errechnen
  orthovec2:=kreuzprodukt(ausricht,orthovec); 
  //und die 3 vektoren in die matrix eingeben
  A[1]:=ausricht; 
  A[2]:=orthovec;
  A[3]:=orthovec2;
  laenge:=length(AusgForm);//ermitteln der laenge des arrays mit den ausgangspunkten
  for i := 0 to laenge - 1 do begin
    FinForm[i]:=vecmatrixmult(AusgForm[i],A); //berechnen der neuen pkte
  end;
end;


MfG Bas94
Murphys Gesetz gilt immer :!:

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

21.05.2011, 23:16

Wenns verzerrt wird dann liegts dran dass die 3 Vektoren nicht orthonormal sind. Schau dir vielleicht mal an was genau die View Matrix tut und wie sie gebildet wird, bzw. wofür genau der Up Vektor ist. Im Prinzip wird da bei der Berechnung der Vektoren die in die Matrix kommen genau das Gleiche gemacht wie du machen willst. Ich spar mir mal eine genauere Erklärung und verweise einfach auf dieses Dokument Seite 22 im Absatz über Vertex Transformation.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (21.05.2011, 23:23)


Bas94

Frischling

  • »Bas94« ist der Autor dieses Themas

Beiträge: 12

Wohnort: Gräfenhainichen

Beruf: Schüler

  • Private Nachricht senden

6

21.05.2011, 23:57

danke sehr für die pdf .. die scheint sehr interessant zu sein ^^

der hinweis mit dem dem orthonormieren hat mich nochma zum überprüfen jeden einzelnen vektors getrieben un habe bemerkt dass der orthovec nicht unbedingt senkrecht war.
letztendlcih funktioniert nun alles

Danke für deine hilfe .. du hast mir einige wochen arbeit erspart ^^
Murphys Gesetz gilt immer :!:

Werbeanzeige