Kim Bo Napisano 7 Październik 2011 Napisano 7 Październik 2011 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???
olaf Napisano 7 Październik 2011 Napisano 7 Październik 2011 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ć.
Grave Napisano 7 Październik 2011 Napisano 7 Październik 2011 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/
Kim Bo Napisano 8 Październik 2011 Autor Napisano 8 Październik 2011 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 :)
bolitic Napisano 10 Październik 2011 Napisano 10 Październik 2011 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); } } } 1
Rekomendowane odpowiedzi
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ę