![]() |
Objekt zum Mittelpunkt routieren
An die Mathematiker von euch ;)
Ich hab ein Karussell auf dem Covers rotieren. Ich habe es jetzt so eingerichtet das beim Abspielen eines Liedes die CD aus den Cover herauskommt und sich in Y Richtung nach oben bewegt. Mein Anliegen ist aber die CD immer zum Mittelpunkt des Karussells zu bewegen unabhängig davon an welcher Position im Karussell diese sich gerade befindet. Irgendwie bekomme ich das nicht korrekt berechnet ohne eine menge IF Abfragen zu erstellen. Mein kläglicher Versuch!
Delphi-Quellcode:
gruss
if ShowCover then
begin for I := 0 to QuadCount - 1 do begin // Position initialisieren (aPos[0] = 0, aPos[1] = 0, aPos[2] = 10) aPos := Vector_Make3f(0, 0, 12); // Die Rotation des Quads (um den Mittelpunkt des Kreises, der durch die Quads gebildet wird) // + ListAnge, also die Rotation, die mit der Maus gemacht wird QuadAngle := DegToRad(360 / (QuadCount) * I) + ListAngle; // Den Positionvektor um den Mittelpunkt des Kreises um die Y-Achse rotieren aPos := Vector_Rotatef3(aPos, Vector_Make3f(0, 0, 0), QuadAngle, False, True, False); if not(LastAddCover = Round(NoCoverTexture)) then if LastAddCover = Trunc(quadTexture[I]) then begin glTranslatef(0, -6, -30); if rDisk < 10 then begin // CD ist im Cover glTranslatef((aPos[0] + QuadSizeS) - 2, aPos[1] + QuadSizeS - 1, aPos[2] - 0.12) end else if (rDisk > 10) and (rDisk < 140) then begin // Bewege die CD in Y Richtung nach oben. (Ist OK) AnimLblY := AnimLblY + 0.05; glTranslatef((aPos[0] + QuadSizeS) - 2, aPos[1] + QuadSizeS + AnimLblY, aPos[2] - 0.12); end // Diese Abfragen resultieren daraus das ich nicht von X-Beliebiger Stelle im Karrussell die CD zum Mittelpunkt rotiere. else if (rDisk > 140) and (rDisk < 360) then begin AnimLblX := AnimLblX + 0.05; // Zuviele IF Abfragen und das ergebniss ist bescheiden.. // Cover befindet sich links im Karussell wird aber nur in X Position verschoben bei gleichzeitiger Rotation um die eigene Y Achse. // soll aber immer zum Mittelpunkt rotieren.. if (aPos[0] + QuadSizeS) < 0 then begin glTranslatef((aPos[0] + QuadSizeS) + AnimLblX, aPos[1] + QuadSizeS + AnimLblY, aPos[2] - 0.12); glRotatef((rDisk - 180 + Y) * 2.5, (aPos[0] + QuadSizeS) + AnimLblX, 0, 0); end else begin // Cover ist auf der rechten Seite des Karussells glTranslatef((aPos[0] + QuadSizeS) - AnimLblX, aPos[1] + QuadSizeS + AnimLblY, aPos[2] - 0.12); glRotatef((rDisk - 180 + Y) * 2.5, (aPos[0] + QuadSizeS) + AnimLblX, 0, 0); end; end else if rDisk > 360 then // Mehr wie zwei Sekunden begin // CD ein wenig um die Achse drehen.. glRotatef((rDisk - 180 + Y) * 0.8, 1, 0, 0); glRotatef((rDisk - 180 + Y) * 1, 0, 1, 0); glRotatef((rDisk - 180 + Y) * 0.1, 0, 0, 1); end; end; end; end; |
AW: Objekt zum Mittelpunkt routieren
Hat sich erledigt...
Funktioniert nun wie es soll.
Delphi-Quellcode:
gruss
function RenderCompactDisc(This_Mod: PWinAMPVisModule): Integer;
Var Y: GLfloat; I: Integer; QuadAngle: single; aPos: TGLVectord3; SongLength_: Integer; SongPos_: Integer; begin PlayState := SendMessage(This_Mod^.hWNDParent, WM_WA_IPC, 0, IPC_ISPLAYING); if PlayState <> 0 then begin SongLength_ := SendMessage(This_Mod^.hWNDParent, WM_USER, 1, IPC_GETOUTPUTTIME); SongPos_ := SendMessage(This_Mod^.hWNDParent, WM_WA_IPC, 0, IPC_GETOUTPUTTIME); if SongPos_ <> 0 then songpos := SongPos_ else songpos := SendMessage(This_Mod^.hWNDParent, WM_WA_IPC, 0, IPC_GETOUTPUTTIME); if SongLength_ <> 0 then SongLength := SongLength_ else SongLength := SendMessage(This_Mod^.hWNDParent, WM_USER, 1, IPC_GETOUTPUTTIME); end else begin rDisk := 0; Center.X := 0; Center.Y := 0; Center.Z := 0; end; if (songpos div 1000) < SongLength then inc(rDisk); BackGroundBeat := 0; for I := 0 to 9 do BackGroundBeat := BackGroundBeat + This_Mod^.spectrumData[0][I] + This_Mod^.spectrumData[1][I]; BackGroundBeat := BackGroundBeat / 10 / 32; if BounceBeat then Y := BackGroundBeat else Y := 0; // Reset the matrix: glLoadIdentity; if ShowCover then begin for I := 0 to QuadCount - 1 do begin if not(LastAddCover = Round(NoCoverTexture)) then if LastAddCover = Trunc(quadTexture[I]) then begin if rDisk < 10 then begin aPos := Vector_Make3f(0, 0, 12); QuadAngle := DegToRad(360 / (QuadCount) * I) + ListAngle; aPos := Vector_Rotatef3(aPos, Vector_Make3f(0, 0, 0), QuadAngle, False, True, False); glTranslatef(0, -7, -30); // CD ist im Cover glTranslatef(aPos[0], aPos[1] + QuadSizeS, aPos[2] - 0.12) end else if (rDisk > 10) and (rDisk < 140) then begin //Bewege die CD in Y Richtung nach oben. aPos := Vector_Make3f(0, 0, 12); QuadAngle := DegToRad(360 / (QuadCount) * I) + ListAngle; aPos := Vector_Rotatef3(aPos, Vector_Make3f(0, 0, 0), QuadAngle, False, True, False); glTranslatef(0, -7, -30); AnimLblY := AnimLblY + 0.05; glTranslatef(aPos[0], (aPos[1] + QuadSizeS) + AnimLblY, aPos[2] - 0.12); Center.X := aPos[0]; Center.Y := (aPos[1] + QuadSizeS) + AnimLblY; Center.Z := aPos[2] - 0.12; end else if (rDisk > 140) and (rDisk <= 360) then begin //Bewege die CD ins Zentrum. glTranslatef(0, -7, -30); if (Trunc(Center.X) > 0) then Center.X := Center.X - 0.1 else if (Trunc(Center.X) < 0) then Center.X := Center.X + 0.1; if (Trunc(Center.Z) > 0) then Center.Z := Center.Z - 0.1 else if (Trunc(Center.Z) < 0) then Center.Z := Center.Z + 0.1; aPos := Vector_Make3f(Center.X, Center.Y, Center.Z); QuadAngle := DegToRad(360 / (QuadCount) * I) + ListAngle; aPos := Vector_Rotatef3(aPos, Vector_Make3f(0, 0, 0), QuadAngle, True, True, True); glTranslatef(Center.X, Center.Y, Center.Z); glRotatef((rDisk - 180) * 0.8, 1, 0, 0); glRotatef((rDisk - 180) * 1, 0, 1, 0); glRotatef((rDisk - 180) * 0.1, 0, 0, 1); end else if rDisk > 360 then begin // CD ein wenig um die Achse drehen.. if zoom < 14 then zoom := zoom + 0.2; glTranslatef(Center.X, 1.265, -34 + zoom); if rDisk > 540 then begin glRotatef((rDisk - 540) * 0.8, 1, 0, 0); glRotatef((rDisk - 540) * 1, 0, 1, 0); glRotatef((rDisk - 540) * 0.1, 0, 0, 1); end; end; glScalef(0.30, 0.30, 0.12); if zoom >= 14 then begin glTranslatef(Center.X, 1.265, -DiskPosition); glScalef(1.4, 1.4, 0.12); DrawDiscSpec(This_Mod); end; DrawCompactDisc; end; end; end else begin glTranslatef(0, 0, -DiskPosition + Y); if rDisk > 180 then begin glRotatef((rDisk - 180 + Y) * 0.8, 1, 0, 0); glRotatef((rDisk - 180 + Y) * 1, 0, 1, 0); glRotatef((rDisk - 180 + Y) * 0.1, 0, 0, 1); end; DrawDiscSpec(This_Mod); DrawCompactDisc; end; Result := 0; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz