Slow motion?

Voit pyytää apua ohjelmointiongelmiin täältä.
Post Reply
AllAh
Newcomer
Posts: 33
Joined: Mon Oct 08, 2007 8:37 am
Location: Muhos

Slow motion?

Post by AllAh »

Eli tarvisin rägdollitappeluuni sellaista hidastustilaa(bullet time/slow motion) jossa kaikki hidastuu. Painovoima,liikkeet,kaikki.
Onko jotain valmista viritelmää?
Valmiita:
Ragdollvoimistelua
Työn alla:
Rägdollitappelu jolle ei vielä nimeä löydy.
Valmiina:
Ei paljon mitään
Tulossa:
Kakkosplayeri, muutama ase,Bullet time,kenttiä
User avatar
CCE
Artist
Artist
Posts: 650
Joined: Mon Aug 27, 2007 9:53 pm

Re: Slow motion?

Post by CCE »

Itsekkin olen miettinyt aivan samaa räsynukkefysiikoiden kanssa, ja tullut siihen tulokseen ettei aivan yksinkertaista tapaa olekkaan. Korjatkaa mikäli olen väärässä.

Oma versioni perustuisi jäsenien liikuttamiseen taaksepäin, eli jokaisella ruumiinosalla olisi kordinaattien lisäksi tallessa vanhat kordinaatit, ja mikäli vauhtia haluttaisiin hidastaa, siirrettäisiin jäseniä taaksepäin haluttu määrä uusien sekä vanhojen kordinaattien välisessä kulmassa.

Tietenkin tämä haluttu määrä voisi olla jokin prosenttiluku, otettaisiin vanhan ja uuden pisteen välinen etäisyys jaettaisiin sadalla ja lopuksi kerrottaisiin halutulla prosenttimäärällä.

Tai sitten vain lasket framelimittiä :P
AllAh - Guest

Re: Slow motion?

Post by AllAh - Guest »

CCE wrote:Itsekkin olen miettinyt aivan samaa räsynukkefysiikoiden kanssa, ja tullut siihen tulokseen ettei aivan yksinkertaista tapaa olekkaan. Korjatkaa mikäli olen väärässä.

Oma versioni perustuisi jäsenien liikuttamiseen taaksepäin, eli jokaisella ruumiinosalla olisi kordinaattien lisäksi tallessa vanhat kordinaatit, ja mikäli vauhtia haluttaisiin hidastaa, siirrettäisiin jäseniä taaksepäin haluttu määrä uusien sekä vanhojen kordinaattien välisessä kulmassa.

Tietenkin tämä haluttu määrä voisi olla jokin prosenttiluku, otettaisiin vanhan ja uuden pisteen välinen etäisyys jaettaisiin sadalla ja lopuksi kerrottaisiin halutulla prosenttimäärällä.

Tai sitten vain lasket framelimittiä :P
Käsitin että tuo vaikuttaisi myös painovoimaan?
Korjatkaa jos olen väärässä.
Pitää jotain tuon pohjalta keksiä.
Guest CCE

Re: Slow motion?

Post by Guest CCE »

Kyllä, se vaikuttaa kaikkiin pelaajan liikkeisiin.
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: Slow motion?

Post by Jonez »

Eikö helpointa olisi laittaa ne raajojen ym. ominaisnopeudet muuttujaan, ja yksinkertaisesti pienentää muuttujan arvoa kun mennään bullet-timeen?
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
User avatar
CCE
Artist
Artist
Posts: 650
Joined: Mon Aug 27, 2007 9:53 pm

Re: Slow motion?

Post by CCE »

Uskoisin ettei tässä käytetyssä systeemissä raajoilla ole ominaisnopeuksia, vain pelkät pituudet sekä paikat.
Vai olenko missannut jotain tärkeää?
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: Slow motion?

Post by Jonez »

No täytyy myöntää ettei mulla ole paljoa kokemusta ragdoll-fysiikoista, mutta ihan maalaisjärjellähän sen tajuaa että siinä täytyy olla jonkinlaiset suureet joilla raajoja käännetään ja liikutellaan. Toteutuksesta en sitten tiedä.

Edit.
No kattelin tota edellisten foorumien yhtä esimerkkiä, ja onhan se vähän niin ettei tommosia arvoja noin vain voi muutella. Sain kuitenkin lisättyä kyseiseen esimerkkikoodiin helposti slow-motionin lisäämäällä ajastimen, jonka avulla rajoitin niiden uusien pisteiden laskemista.

Space laukaisee slow-motionin.

Code: Select all

SCREEN 800,600,0,1

// ihminen koostuu (tässä tapauksessa) yhdestätoista pisteestä, joilla jokaisella
// on nykyinen ja edellinen sijainti xy - tasolla.

// Ideana on pitää jokainen piste vakioetäisyydellä määritellyistä pisteistä, jolloin ne käyttäytyvät realisisen oloisesti

Dim xPosition(11) As Float
Dim yPosition(11) As Float

Dim previousXposition(11) As Float
Dim previousYposition(11) As Float

Const PAINOVOIMA = -0.05 // painovoima ( negatiivinen = alaspäin, positiivinen = ylöspäin)
Const ACCURACY = 5 // tarkkuus (mitä suurempi luku, sitä tarkempi, 1=minimi)

resetDoll()

Repeat
Box 150,50,500,500,0

Text 200,20,"LMB = drag left leg"
Text 400,20,"RMB = drag head"
Text 320,570,"R = reset doll"

If MouseDown(1) Then
xPosition(1) = MouseWX()
yPosition(1) = MouseWY()
ElseIf MouseDown(2) Then
xPosition(7) = MouseWX()
yPosition(7) = MouseWY()
EndIf

If KeyHit(19) Then resetDoll()

If KeyDown(cbkeyspace) Then
    nopeus = 50
Else
    nopeus = 0
EndIf

//Tähän lisätty ajastin, uudet sijainnit lasketaan aikaisempaa hitaammin.
If aika < Timer() - nopeus Then
    aika = Timer()
    // lasketaan fysiikat
    simulate()
EndIf


//piirretään viivat HUOM: Alkuperäsessä koodissa nämä kutsut olivat simulate-funktion lopussa
drawLine(1,2)
drawLine(2,3)
drawLine(3,4)
drawLine(4,5)
drawLine(3,6)
drawLine(6,7)
drawLine(7,8)
drawLine(8,9)
drawLine(7,10)
drawLine(10,11)

// piirretään pää "suunnilleen" oikealle paikalle
kulma = GetAngle(xPosition(6),yPosition(6),xPosition(7),yPosition(7))
Circle ScreenWidth()/2+Cos(kulma)*20+xPosition(7),ScreenHeight()/2-(Sin(kulma+180)*20+yPosition(7)),20,0

DrawScreen
Forever


Function Simulate()

// lasketaan jokaiselle pisteelle uusi sijainti
For i=1 To 11
calculateNewXposition(i)
calculateNewYposition(i)
Next i

// pisteet siirretään ACCURACY:n mukaan joko kerran tai useita kertoja vakioetäisyydelle toisistaan
For i=1 To ACCURACY
// parametrit = ensimmäisen pisteen sijainti taulukossa, toisen pisteen sijainti taulukossa, pidettävä välimatka
sustainDistance(1,2,25)
sustainDistance(2,3,25)
sustainDistance(3,4,25)
sustainDistance(4,5,25)
sustainDistance(3,6,25)
sustainDistance(6,7,25)
sustainDistance(7,8,25)
sustainDistance(8,9,25)
sustainDistance(7,10,25)
sustainDistance(10,11,25)

// pisteet eivät saa ylittää pelikenttää
For j=1 To 11
xPosition(j) = Min(Max(-250,xPosition(j)),250)
yPosition(j) = Min(Max(-250,yPosition(j)),250)
Next j
Next i


EndFunction


Function calculateNewXposition(pointNumber)
temp# = xPosition(pointNumber)
xPosition(pointNumber) = 2*xPosition(pointNumber) - previousXposition(pointNumber) // + kiihtyvyys X-suunnassa
previousXposition(pointNumber) = temp#
EndFunction


Function calculateNewYposition(pointNumber)
temp# = yPosition(pointNumber)
yPosition(pointNumber) = 2*yPosition(pointNumber) - previousYposition(pointNumber) + PAINOVOIMA // * PAINOVOIMAn tilalle voi sijoittaa minkä tahansa Y-suuntaisen kiihtyvyyden
previousYposition(pointNumber) = temp#
EndFunction


Function sustainDistance(firstPoint, secondPoint, distanceToSustain#)
xDistance# = (xPosition(firstPoint) - xPosition(secondPoint))
yDistance# = (yPosition(firstPoint) - yPosition(secondPoint))

currentDistance# = Sqrt(xDistance#^2+yDistance#^2)
multiplier# = (currentDistance#-distanceToSustain#)/currentDistance#

xPosition(firstPoint) = xPosition(firstPoint) - xDistance#*0.5*multiplier#
yPosition(firstPoint) = yPosition(firstPoint) - yDistance#*0.5*multiplier#
xPosition(secondPoint) = xPosition(secondPoint) + xDistance#*0.5*multiplier#
yPosition(secondPoint) = yPosition(secondPoint) + yDistance#*0.5*multiplier#
EndFunction


Function drawLine(firstPoint, secondPoint)
Line xPosition(firstPoint)+ScreenWidth()/2,ScreenHeight()/2-yPosition(firstPoint),xPosition(secondPoint)+ScreenWidth()/2,ScreenHeight()/2-yPosition(secondPoint)
EndFunction


Function resetDoll()
xPosition(1) = -50
yPosition(1) = -50
previousXposition(1) = -50
previousYposition(1) = -50

xPosition(2) = -25
yPosition(2) = -50
previousXposition(2) = -25
previousYposition(2) = -50

xPosition(3) = 0
yPosition(3) = -50
previousXposition(3) = 0
previousYposition(3) = -50

xPosition(4) = 25
yPosition(4) = -50
previousXposition(4) = 25
previousYposition(4) = -50

xPosition(5) = 50
yPosition(5) = -50
previousXposition(5) = 50
previousYposition(5) = -50

xPosition(6) = 0
yPosition(6) = -25
previousXposition(6) = 0
previousYposition(6) = -25

xPosition(7) = 0
yPosition(7) = 0
previousXposition(7) = 0
previousYposition(7) = 0

xPosition(8) = -25
yPosition(8) = 0
previousXposition(6) = -25
previousYposition(6) = 0

xPosition(9) = -50
yPosition(9) = 0
previousXposition(9) = -50
previousYposition(9) = 0

xPosition(10) = 25
yPosition(10) = 0
previousXposition(10) = 25
previousYposition(10) = 0

xPosition(11) = 50
yPosition(11) = 0
previousXposition(11) = 50
previousYposition(11) = 0
EndFunction 
Tässä vielä linkki alkuperäiseen koodiin.
http://www.coolbasic.com/oldforums/inde ... hl=ragdoll
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
Post Reply