Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Rotation und Position Key's Interpolieren (https://www.delphipraxis.net/59399-rotation-und-position-keys-interpolieren.html)

Weazy 21. Dez 2005 20:01


Rotation und Position Key's Interpolieren
 
Ich habe in meiner 3D anwendung ein Objekt, welches ich z.B um eine beliebige Achse drehen lassen kann und die Position bestimmen kann. Ich möchte nun, das ich eine Textdatei schreiben kann, in welcher gespeichert ist, wie die Position und Rotation eines Objektes zu einem bestimmten Zeitpunkt ist. Die Angaben sind aber immer nur ca. alle 10 Frames, sodass mein Programm die Animation in den Frames dazwischen interpolieren können sollte.

Hat irgend jemand Erfahrungen damit oder eine Idee?

Danke!

dizzy 21. Dez 2005 23:24

Re: Rotation und Position Key's Interpolieren
 
In welcher Form liegen die Daten vor? Wie willst du interpolieren (linear, kubisch, etc.)? Wohin kommen die interpolierten Werte?

Im allgemeinen ist Interpolation immer gleich und simpel. Meist schnappt man sich nur einen Wert (also nicht gleich ganze vektoren o.ä.) und interpoliert zum nächsten. Die Signatur einer Interpolationsfunktion lautet daher idR:
Delphi-Quellcode:
  function Interpolate(WertA, WertB, k: Float): Float;
Das heisst du übergibst die zwei Werte zwischen denen gerechnet werden soll, und das "k" gibt an wie nah das Ergebnis WertA oder WertB sein soll. Meist läuft "k" von 0..1, wobei bei k=0 result=WertA ist, und für k=1 result=WertB.
Das wäre der Kern einer Interpolation. Einen ganzen Vektor z.B. interpoliert man einfach, indem man x, y und z mit gleichem k einzeln dadurch jagt.
Kubische und Hermite-Interpolation gehen noch ein Stück weiter, und brauchen 4 Randwerte, wobei der interpolierte Bereich zwischen dem 2. und 3. Wert liegt. Die 2 weiteren "aussen rum" sind mit einbezogen, um annähernde Stetigkeit über eine zwischen mehreren Werten interpolierte Strecke zu erlangen. Da muss man dann an den jeweiligen Rändern noch Werte hinzudichten :)

Hier mal ein paar Interpolationsfunktionen die ich einsetze: (nach o.g. Schema zu verwenden, mein "k" heisst hier "t")
Delphi-Quellcode:
// Einfache Verfahren die nur 2 Werte brauchen
function ILinear(a, b, t: Single): Single;
begin
  result := a*(1-t)+b*t;
end;

function ICosine(a, b, t: Single): Single;
var
  t2: Single;
begin
  t2 := (1-cos(t*PI))/2;
  result := a*(1-t2)+b*t2;
end;

// Ab hier wirds schöner, aber auch 4 Werte nötig; Zwischen b und c wird interpoliert.
function ICubic(a, b, c, d, t: Single): Single;
var
  a0, a1, a2, a3: Single;
  t2            : Single;
begin
  t2 := t*t;
  a0 := d - c - a + b;
  a1 := a - b - a0;
  a2 := c - a;
  a3 := b;
  result := a0*t*t2+a1*t2+a2*t+a3;
end;

function IHermite(a, b, c, d, t: Single): Single;
// Simplified: Bias = 0; Tension = 1;
var
  a0, a1, a2, a3: Single;
  m0, m1        : Single;
  t2, t3        : Single;
begin
  t2 := t*t;
  t3 := t2*t;

  a0 := 2*t3 - 3*t2 + 1;
  a1 :=   t3 - 2*t2 + t;
  a2 :=   t3 -   t2;
  a3 := -2*t3 + 3*t2;

  m0 := ((b-a)/2) + ((c-b)/2);
  m1 := ((c-b)/2) + ((d-c)/2);
  result := a0*b + a1*m0 + a2*m1 + a3*c;
end;
(Die Funktionen sind meine Übersetzung von diesen hier. Der besseren Übersicht wegen habe ich mal nicht meine voll optimierten Fassungen genommen.)


Gruss,
Fabian


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz