Autor Beitrag
battledevil
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 96

WinXP, Win7
C#, C++, VBNET
BeitragVerfasst: Mi 01.06.05 09:31 
Hallo Leute,

Ich brauch für ein Projekt eine Scherung im 3D-Raum und hab mich da mal schlau gemacht.
Offensichtlich ist die Matrix dfür die Folgende:


    |X| = | 1 s1 s2 0| * |x0|
    |Y| = |s3 1 s4 0| * |y0|
    |Z| = |s5 s6 1 0| * |z0|
    |1| = | 0 0 0 1| * | 1|


anders ausgedrückt gilt:

x = x0 + s1*y0 + s2*z0
y = s3*x0 + y0 + s4*z0
z = s5*x0 + s6*y0 + z0

s1-s6 sind Scherungsfaktoren, die die Stärke der Verzerrung angeben.
Ich hab dann also ein kleinen Programm geschrieben, erstmal nur mit einem Quadrat, aber sobald ich die Scherungsmatrix benutzen will, dann verschwindet mein Quadrat komplett und ich weiß nicht wohin es verschwunden ist.
Vielleicht hat jemand von euch eine Idee, wo der Fehler liegt.

Hier der Code (Variablen sind global definiert):
ausblenden volle Höhe Delphi-Quelltext
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:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
procedure TForm1.MyScene();
begin
  // Werte einlesen
  try
    tx:=TrackbarTx.Position/10;    // Werte für die Translation
    ty:=TrackbarTy.Position/10;
    tz:=TrackbarTz.Position/10;

    sx:=TrackbarSx.Position/100;   // Werte für die Skalierung
    sy:=TrackbarSy.Position/100;
    sz:=TrackbarSz.Position/100;

    rx:=TrackbarRx.Position;       // Werte für die Rotation
    ry:=TrackbarRy.Position;
    rz:=TrackbarRz.Position;

    sch1:=TrackbarS1.Position/100; // Werte für die Scherung
    sch2:=TrackbarS2.Position/100;
    sch3:=TrackbarS3.Position/100;
    sch4:=TrackbarS4.Position/100;
    sch5:=TrackbarS5.Position/100;
    sch6:=TrackbarS6.Position/100;

   except
    exit;
   end;

  // Wireframe anzeigen
  glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

  //Backface-Culling deaktivieren
  glDisable(GL_CULL_FACE);

  // Lichtquelle abschalten
  glDisable(GL_LIGHTING);

  glPushMatrix();

    // Translation
    glTranslatef(tx,ty,tz);

    // Scherung
    if checkboxScherung.Checked then
        Scherungf(sch1,sch2,sch3,sch4,sch5,sch6);

    // Skalierung
    if (sx<>1) or (sy<>1) or (sz<>1) then
        glScalef(sx,sy,sz);

    // Rotationen
    if rx<>0 then glRotatef(rx,1,0,0);
    if ry<>0 then glRotatef(ry,0,1,0);
    if rz<>0 then glRotatef(rz,0,0,1);

    // Farbe auf Weiss setzen
    glColor3f ( 1, 1, 1);

    // Quadrat zeichnen
    glBegin(GL_QUADS);
        // Fläche 1
        glColor3f ( 1, 1, 1);
        glVertex3f( 1,-1, 0);
        glVertex3f( 1, 1, 0);
        glVertex3f(-1, 1, 0);
        glVertex3f(-1,-1, 0);
    glEnd;

  glPopMatrix();
end;

procedure TForm1.Scherungf(s1,s2,s3,s4,s5,s6 : GLfloat);
var ScherungX, ScherungY, ScherungZ : GLfloat;
begin
    ScherungX:=1+s1+s2;
    ScherungY:=s3+1+s4;
    ScherungZ:=s5+s6+1;

    Scherungsmatrix[1]:=ScherungX;
    Scherungsmatrix[2]:=ScherungY;
    Scherungsmatrix[3]:=ScherungZ;
    Scherungsmatrix[4]:=1;

    // Scherungsmatrix anwenden
    glMultMatrixf(@Scherungsmatrix);
end;



Vielen Dank schon im Vorraus

Nico
Einloggen, um Attachments anzusehen!
battledevil Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 96

WinXP, Win7
C#, C++, VBNET
BeitragVerfasst: Mi 01.06.05 21:39 
Hab die Lösung doch noch selber gefunden.
Falls es jemanden interessiert, mein Fehler war es, x,y und z zu berechnen und das dann an glMultMatrixf(@ScherungsMatrix) zu übergeben, anstatt die Skalierungsmatrix direkt zu übergeben.

Hier die neue Prozedur mit Scherungsmatrix als array[1..16] of GLfloat:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TForm1.Scherungf(s1,s2,s3,s4,s5,s6 : GLfloat);
begin
    Scherungsmatrix[1]:=1;
    Scherungsmatrix[2]:=s1;
    Scherungsmatrix[3]:=s2;
    Scherungsmatrix[4]:=0;
    Scherungsmatrix[5]:=s3;
    Scherungsmatrix[6]:=1;
    Scherungsmatrix[7]:=s4;
    Scherungsmatrix[8]:=0;
    Scherungsmatrix[9]:=s5;
    Scherungsmatrix[10]:=s6;
    Scherungsmatrix[11]:=1;
    Scherungsmatrix[12]:=0;
    Scherungsmatrix[13]:=0;
    Scherungsmatrix[14]:=0;
    Scherungsmatrix[15]:=0;
    Scherungsmatrix[16]:=1;

    // Scherungsmatrix anwenden
    glMultMatrixf(@ScherungsMatrix);
end;