AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Rotation und Position Key's Interpolieren
Thema durchsuchen
Ansicht
Themen-Optionen

Rotation und Position Key's Interpolieren

Ein Thema von Weazy · begonnen am 21. Dez 2005 · letzter Beitrag vom 22. Dez 2005
Antwort Antwort
Benutzerbild von Weazy
Weazy

Registriert seit: 7. Apr 2005
Ort: Bern (Schweiz)
414 Beiträge
 
Delphi 2007 Enterprise
 
#1

Rotation und Position Key's Interpolieren

  Alt 21. Dez 2005, 21:01
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!
Philippe Wechsler
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Rotation und Position Key's Interpolieren

  Alt 22. Dez 2005, 00:24
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:
  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
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:54 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