Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  10 1728
Hei

Jeg er ute etter en formel (gjærne skrevet i c/c++) som lager en slik kurve:
http://www.graficonn.no/kurve.jpg

Det skal brukes til å flytte kamera fra ett punkt til ett annet, og forhindre at forflyttningen starter eller slutter brått.

Scha
ser ut som Gauss http://mathworld.wolfram.com/gimg963.gif eller Cosine ( cos(x) ) .

Gauss er litt mer komplisert ( http://mathworld.wolfram.com/GaussianFunction.html ). Men om du tenkte å drive med statistikk eller fouriertransformer senere er Gauss din beste venn

Cosine funksjon er lett å implementere . Om du tar noe som ligner på (1-cos(x*a))*b så har du det du vil. Bruker a og b til å strekke kurven i Verdi og Tid...
Sist endret av simonj; 9. juni 2005 kl. 12:31. Grunn: bilde
Scha's Avatar
Trådstarter
simonj: din måråt.
Dersom jeg skal kunne bruke denne: (1-cos(x*a))*b, så må jeg allerede vite både a og b, og målet er jo å finne a utifra b.

Dessuten tror jeg ikke gauss kan brukes direkte til dette nei.

Noen andre? (helst c kode)

Scha
antar at du skal ha max_y(x)=1 i x=1, og at f(x)=0 for alle x<0 og f(x)=1 for alle x>1
#include <stdio.h>
#include <math.h>
#define PI 3.14159265358979323846264338328

double foo(double x){
if (x<0) return 0;
if (x>1) return 1;

double a=PI;
double b=0.5;
return (1-cos (x*a))*b;
}
Vis hele sitatet...
rocketscience? (http://www.stud.ntnu.no/~simonj/soppel/bah.gif)
Dette kalles splines og det finnes tusenvis av kodeeksempler rundt dette. Søk i google etter Bezier-splines, Catmul-rom splines, eller TCB-splines.
si at du har et tidsinterval {0,maxx} og et verdiinterval {0,maxy}, du ønsker at df/dx=0 i x=0, maxx. her er tingen:

Kode

#include <stdio.h>
#include <math.h>
#define PI 3.14159265358979323846264338328

double foo(double x,double maxy,double maxx){
if (x<0) return 0;
if (x>maxx) return maxy;
return (1-cos (x*PI/maxx))*0.5*maxy;
}
Kurven er en sigmoid.

http://mathworld.wolfram.com/SigmoidFunction.html

y= 1 / ( 1 + e^-x )
Scha's Avatar
Trådstarter
frevev: Jeg har ikke gått på skole på over 5 år. Det skal brukes i ett spill for å flytte kamera fra ett punkt til ett annet, med en naturlig akselrasjon og deakselrasjon.

simonj: tusen takk for svar, ser helt flott ut Var ute etter en som ga fra 0 til 1 ja...

Scha
I like turtles
Skyfex's Avatar
Jeg har bare brukt en vanlig 3. grads funksjon. Tar litt tid å modifisere den til å bli akkurat slik du vil, men det fungerer.
ax^3+bx^2+cx+d=0

Ellers ser de andre eksemplene bra ut. Kanskje bruke de neste gang
Bob Sacamano
John B's Avatar
Dette er forresten en god artikkel om Catmull-Rom splines ( på norsk ):

http://www.demoscene.no/artikkel.php?artikkel=4
▼ ... mange måneder senere ... ▼
Sitat av Scha
frevev: Jeg har ikke gått på skole på over 5 år. Det skal brukes i ett spill for å flytte kamera fra ett punkt til ett annet, med en naturlig akselrasjon og deakselrasjon.

simonj: tusen takk for svar, ser helt flott ut Var ute etter en som ga fra 0 til 1 ja...

Scha
Vis hele sitatet...
Bruk newtons lover i forbindelse med fart akselerasjon og tid: her er en rutine jeg har skrevet selv, som er mer fleksibel enn bare s = .5*a*t*t + v0*t;

float s=s0, v = v0, a=a0?, dt = (tnaa-tsist);

while(tiden_gaar) {
dt = tnaa - tsist;//finn tidsforandring siden sist frame ble tegnet opp og legg det i dt
v += a * dt;
s += v * dt (- eller +, husker ikke, lenge siden, bare fant ut at det gjorde dette mer nøyaktig) 1/2 * a * dt * dt; // til sammenlikning med en nøyaktig rett formel, s = .5*a*t*t
}, for å flytte kameraet kan du da bruke bruke konstant eller varierende akselerasjon/retardasjon for å flytte kameraet, bare pass på at ved varierende akselerasjon, kan det bli vanskelig å beregne hvor kameraet blir av.

Det vil også lønne seg og bruke en form for 3d-vektor klasse(som bruker long double x, y og z) istedenfor float, slik du kan bestemme om det skal være 2 eller 3 dimensjonalt.

Du kan med dette da lage til en funksjon som akselererer opp hva enn du vil flytte til en fart før den så retarderer(deakselererer) ned igjen farten og stopper på ett forhåndsbestemt punkt, høres det greit ut?