Skocz do zawartości

[Action Script 3.0] Krzywe beziera


Rekomendowane odpowiedzi

Napisano

Witam szukam przykładowych skryptów/algorytmów prostej grawitacji. Potrzebuję stworzyć efekt rzucania piłką. Gdy ograniczeniami odbicia są jedynie proste ściany (np zewnętrzne krawędzie sceny) wszystko działa spoko, jednak chcę aby piłeczka reagowała również na krzywe, np turlała się na skośnej podłodze itp. Przy czym nie chcę korzystać z gotowych silników typu Box2D.

 

Mam jeszcze jedno pytanko. Mianowicie przy zadeklarowanych stałych typu rotacja(kąt pod jakim będziemy rzucać piłkę), siła, friction i grawitacja, chciałbym wyznaczyć krzywą reprezentującą ruch który ma nastąpić. Ktoś może pomóc???

  • Odpowiedzi 4
  • Created
  • Ostatniej odpowiedzi

Top Posters In This Topic

Top Posters In This Topic

Napisano

jak nie chcesz korzystać z innych silników to czeka Cie długa droga. Dwa razy widziałem jak zdolni flash devi pisali engine fizyki i dwa razy harmonogram tego nie wytrzymał ;) do tego optymalizacja itp. jednym słowem - skorzystaj.

 

druga sprawa to zwykła matma - przy silniku cudzym on to załatwi za Ciebie, przy własnym modyfikujesz wektor ruchu zgodnie z danymi siły, tarcia, masy i oddziaływań. jak wyzej - odpuść sobie nie ma co ameryki wymyślać.

Napisano
Witam szukam przykładowych skryptów/algorytmów prostej grawitacji. Potrzebuję stworzyć efekt rzucania piłką. Gdy ograniczeniami odbicia są jedynie proste ściany (np zewnętrzne krawędzie sceny) wszystko działa spoko, jednak chcę aby piłeczka reagowała również na krzywe, np turlała się na skośnej podłodze itp.?

Przeanalizuj sobie CDK http://code.google.com/p/collisiondetectionkit/

Napisano

dzięki Grave!! Całkiem fajne przykłady tam znalazłem, ale muszę jeszcze nad tym popracować ;) jak dojdę do czegoś konkretnego to podzielę się rezultatem :)

Napisano

Tak jak Grave napisał. W przykładnie gdzie się rysuje przeszkody dla piłeczki jest dosyć sprytnie napisany silniczek fizyczny. Osobiście zrobiłem z niego osobna klasę, z której często korzystam. Tutaj masz jej cały kod:

 

Ta klasa, najlepije działa z innymi klasami z com.coreyoneil.collision. W parametrze metody calcColl (calculate Collision), podajesz tablice z kolizjami, oraz objekt, który ma właściwości vx i vy (wektory 2D). trzeci parametr to określenie czy funkcja ma zwrócić same wektory, czy też przemieścić obiekt, poprzez dodanie wektorów do pozycji x i y. Ostatnim parametrem jest siła grawitacji.

 

package com.coreyoneil.collision

 

{

import engine.Enum;

 

public class Repulse

{

private var GRAVITY :Number;

private const FRICTION :Number = .98;

private const IMMOVABLE :Number = 10000;

private var returnVec :Array;

private const MAXSPEED :int = 20;

 

public function Repulse()

{

// constructor code

}

 

public function calcColl(collisions:Array, _object:Object, _speed:Number, vOrXY:String, gravityParam:Number = .75):Array

{

if(collisions.length)

{

var collision:Object = collisions[0];

var angle:Number = collision.angle;

var overlap:int = collision.overlapping.length;

 

var sin:Number = Math.sin(angle);

var cos:Number = Math.cos(angle);

 

var vx0:Number = _object.vx * cos + _object.vy * sin;

var vy0:Number = _object.vy * cos - _object.vx * sin;

 

vx0 = ((_object.mass - IMMOVABLE) * vx0) / (_object.mass + IMMOVABLE);

_object.vx = vx0 * cos - vy0 * sin;

_object.vy = vy0 * cos + vx0 * sin;

 

_object.vx -= cos * overlap / _object.radius;

_object.vy -= sin * overlap / _object.radius;

 

_object.vx += _speed;

}

GRAVITY = gravityParam;

_object.vy += GRAVITY;

_object.vy *= FRICTION;

_object.vx *= FRICTION;

 

//this is very importent set of ifs - without it object can take very high vx and vy

//if you wish to have faster object - set the MAXSPEED

if (_object.vy > MAXSPEED) _object.vy = MAXSPEED;

if (_object.vx > MAXSPEED) _object.vx = MAXSPEED;

if (_object.vy

if (_object.vx

 

switch (vOrXY)

{

case Enum.VECTOR:

{

returnVec = new Array();

returnVec.push(_object.vx);

returnVec.push(_object.vy);

return(returnVec);

}

case Enum.XY:

{

_object.x += _object.vx;

_object.y += _object.vy;

}

}

return(null);

}

}

}

  • Like 1

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się



×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Wykorzystujemy cookies. Przeczytaj więcej Polityka prywatności