pêndulo - QUASE lá

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

pêndulo - QUASE lá

Mensagem por saim em Qua 07 Mar 2012, 14:13

O que era desejado
Um pêndulo que opere de modo moto-contínuo até que se adicione ou retire manualmente energia no sistema.

O que foi feito:
Depois de muito tentar, finalmente consegui chegar num pêndulo relativamente decente.
O problema de fazer um pêndulo usando as fórmulas da física real (tensão na corda, gravidade, vetor resultante) é que essas fórmulas usam aproximações.
Resolvi refazer uma engine que vi a muito tempo atrás mas que, na época, só consegui entender a idéia básica, que é a seguinte:
- Movimente o objeto normalmente, fingindo que não existe a corda (aplicando gravidade e tudo);
- Se a distância do objeto ao centro da corda for maior do que a corda, abre uma série de comandos:
...- Força a posição do pêndulo pra distância máxima;
...- Aponta a velocidade pra direção "posiçãoAnterior -> posiçãoAtual", mantendo o valor do módulo;
O código que estou usando é esse aqui:
Código:
ySpd += grav; //atualiza a velocidade vertical em função da gravidade
x += xSpd; y += ySpd; //atualiza a posição em função das velocidades
modSpd = point_distance(0, 0, xSpd, ySpd); //determina o módulo da velocidade
if (point_distance(x, y, cx, cy) > radius) { //se a distância ao centro for maior que o raio
   var ang;
   ang = point_direction(cx, cy, x, y); //define o ângulo do centro à posição
   x = cx + radius * cos(degtorad(ang)); y = cy + radius * sin(degtorad(-ang)); //puxa o objeto pra distância máxima
   dire = point_direction(xprev, yprev, x, y); //atualiza a direção do movimento, ligando a posição anterior à posição atual
   xSpd = modSpd * cos(degtorad(dire)); ySpd = modSpd * sin(degtorad(-dire)); //atualiza as velocidade horizontal/vertical em função da nova direção
   }

xprev = x; yprev = y; //a posição atual é a anterior do próximo step
Onde:
cx/cy = centro do pêndulo
xSpd/ySpd = velocidades horizontal/vertical
modSpd = módulo da velocidade, como vetor
xprev/yprev = x/y previous
radius = raio
grav = gravidade

radius * cos(degtorad(ang)) = lengthdir_x(radius, ang);
radius * sin(degtorad(-ang)) = lengthdir_y(radius, ang);
(estou tentando deixar de lado alguns vícios)

O que deu errado:
De alguma forma, o sistema está ganhando energia. Eu esperava que, ao completar 180°, a velocidade voltasse a zero, já que o objeto estaria subindo e, portanto, a gravidade estaria reduzindo a velocidade. Como o trecho a subir é o mesmo trecho que o objeto tem que descer, uma coisa eliminaria a outra.
Isso quase funcionou. Mas o objeto subiu um pouco mais do que devia e isso aconteceu em todas as voltas. Em pouco tempo, o objeto estava rodando ao redor do centro.
Se eu multiplico o valor de modSpd por 0.995 ou 0.9945, o pêndulo funciona adequadamente, mas esses valores foram encontrados na base da tentativa-e-erro, não há matemática envolvida.
Gostaria de pedir ajuda aos universitários. Literalmente. Alguém que esteja com mecânica fundamental mais fresca, na cabeça, por favor examine essas equações e me diga em que momento a energia está entrando no sistema.
Ou algum estudante de segundo grau mesmo, que seja bom com números, verifique essas contas e veja o que há de errado.
Se for necessário (pra jogar no excell, sei lá) tenho como gerar um texto com o valor dessas variáveis no final de cada step.


Última edição por saim em Qui 08 Mar 2012, 14:39, editado 1 vez(es)

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: pêndulo - QUASE lá

Mensagem por cascavelo em Qua 07 Mar 2012, 15:44

Enfrentei o mesmo problema desenvolvendo um engine para uma bola que quicava, por mais que eu tentasse controlar a gravidade a bola ia subindo a cada quique que dava até sumir da tela. Quebrei a cabeça um tempão e cheguei na conclusão que é um bug do sistema de gravidade do GM. Tive que retirar altura do sprite artificialmente pra conseguir o resultado desejado.
O problema parece ser a maneira que o GM lida com a gravidade, não parece ser algo real. O GM parece péssimo para lidar com física.

cascavelo

Ranking : Nota A
Número de Mensagens : 1011
Idade : 46
Data de inscrição : 08/12/2011
Notas recebidas : A - A - A - A - A -A -C
Reputação : 71
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 2
   : 1

Voltar ao Topo Ir em baixo

Re: pêndulo - QUASE lá

Mensagem por saim em Qua 07 Mar 2012, 16:12

Só que o GM não está lidando com física, nesse caso. Todas as variáveis são manipuladas manualmente, justamente pra evitar o uso de uma engine built-in que eu não sei como funciona. Nesse caso, a culpa não tem como ser do GM...

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: pêndulo - QUASE lá

Mensagem por cascavelo em Qua 07 Mar 2012, 17:35

Ok, agora entendi o que você fez, achei que tinha usado a "gravity". Mas acho melhor você postar o código completo para que se possa testar.

cascavelo

Ranking : Nota A
Número de Mensagens : 1011
Idade : 46
Data de inscrição : 08/12/2011
Notas recebidas : A - A - A - A - A -A -C
Reputação : 71
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 2
   : 1

Voltar ao Topo Ir em baixo

Re: pêndulo - QUASE lá

Mensagem por PedroX em Qua 07 Mar 2012, 18:42

Não é bem moto-continuo, porque perde velocidade, mas pode te servir:
http://dl.dropbox.com/u/38888521/Pendulo.gmk

Tem como adicionar uma força em uma certa direção, no exemplo adiciona na direction que já está movendo, ao apertar espaço.

É bem simples e pode ser transformado em base de seno e cosseno.

Até mais!

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: pêndulo - QUASE lá

Mensagem por saim em Qui 08 Mar 2012, 08:13

cascavelo escreveu:Mas acho melhor você postar o código completo para que se possa testar.
Está completo, basta definir as variáveis citadas no create event. O código que postei, obviamente, fica no step.

Pedrø escreveu:Não é bem moto-continuo, porque perde velocidade, mas pode te servir
AARGH!!! Agora vou ter que esperar até chegar em casa pra testar!
Perder velocidade não é exatamente um problema, eu ia mesmo colocar um atrito artificialmente, quando tudo desse certo, só queria que DESSE certo antes de modificar.
Valeu! Smile

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: pêndulo - QUASE lá

Mensagem por cascavelo em Qui 08 Mar 2012, 14:34

Está completo, basta definir as variáveis citadas no create event. O código que postei, obviamente, fica no step.

Dá este erro:

ERROR in
action number 1
of Step Event
for object object0:

Error in code at line 8:
dire = point_direction(xprev, yprev, x, y); //atualiza a direção do movimento, ligando a posição anterior à posição atual
^
at position 28: Unknown variable xprev

cascavelo

Ranking : Nota A
Número de Mensagens : 1011
Idade : 46
Data de inscrição : 08/12/2011
Notas recebidas : A - A - A - A - A -A -C
Reputação : 71
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 2
   : 1

Voltar ao Topo Ir em baixo

Re: pêndulo - QUASE lá

Mensagem por saim em Qui 08 Mar 2012, 14:40

Ah, tá, esqueci dessas. Agora já atualizei o tópico inicial.
Elas devem ser definidas como xprev = x e yprev = y, no create.
[edit]Aliás, deixa eu motrar como está o create:
Código:
cx = x; cy = y; radius = 50; grav = 0.5;
x += radius;
xprev = x; yprev = y;
xSpd = 0; ySpd = 0; modSpd = 0; dire = 0;
maxMod = 0;

Edit 2
saim escreveu:@Pedrø, o exemplo funciona de um jeito muito bacana, mas não é o que eu estou procurando, por dois motivos (culpa minha, que não citei essas premissas):
- Quando a massa está acima do centro, ela não cai. Eu gostaria que caísse, como se a massa estivesse presa a uma corda.
- Você usa speed e direction. Eu tenho birra de usar essas variáveis, porque eu não sei como elas funcionam internamente. Aí, qualquer coisa que funcione, vai ser meio que uma "mágica". Nada contra usar lengthdir, porque essas eu SEI como funcionam, mas nunca sei exatamente como speed, hspeed, vspeed e direction são tratadas internamente e, mesmo quando a coisa é simples (como nesse caso) eu fico na dúvida se as posições são atualizadas ANTES ou DEPOIS do código ser executado.

Tem um terceiro problema que também é culpa minha, mas ESSE pode ser resolvido: eu não entendi nada! --\' Não entendi como você adiciona energia, não entendi como o objeto atualiza sua posição, não entendi o motivo do "-1" - nada. Eu adoraria ver uma versão comentada desses scripts. Por mais que eles não sirvam pro meu jogo (se é que esse jogo sai do papel), são muito interessantes.

Moçada, foi mal pelo double post. Dormi no ponto. Corrigido.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: pêndulo - QUASE lá

Mensagem por PedroX em Qui 08 Mar 2012, 23:09

Atualizei o exemplo no mesmo link.
Veja agora se melhorou os comentários.
Fiz versões alternativas para que você veja a diferença entre as funções do GM e as contas usadas manualmente.

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: pêndulo - QUASE lá

Mensagem por saim em Sex 09 Mar 2012, 13:51

Melhorou no sentido de mostrar como fazer sem usar as built-ins (estava muito tarde e não cheguei a testar, mas vi os comentários), mas ainda não entendi como os códigos funcionam, o que eles fazem, etc.
Talvez porque estava muito tarde - e eu estava muito empolgado com um outro assunto (relacionado a games, mas que não tem nada a ver com game maker) - eu não consegui visualizar qual o sentido dos seus códigos. Por outro lado, você tem uma cabeça bem complexa, você está tão acostumado a pescar que pode se esquecer que precisa explicar como amarrar o anzol.

Mas não esquenta com isso não, ainda que eu consiga entender, o código não vai me servir, porque eu realmente quero que, quando o objeto estiver em baixa velocidade e acima do centro, ele caia por gravidade simples, sem continuar o movimento circular (a corda que une o objeto ao centro não pode ser rígida).

A pergunta inicial permanece, agora piorada: porque se eu reduzo a velocidade, multiplicando por um valor mais baixo como 0.7, por exemplo, o objeto se prende ao chegar a uns 45°?
Isso mesmo, se eu multiplico, no step dos meus códigos, o módulo da velocidade por um valor desses, o objeto fica preso, flutuando, perto de 45°.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: pêndulo - QUASE lá

Mensagem por Klior em Sex 09 Mar 2012, 15:51

saim sempre com suas duvidas interessantes...
tem que acrescentar isso na sua assinatura:
"Meus tutoriais: Variáveis, Arrays, Máquina de Estados Finitos, Game genérico, Surfaces, cores, Blend Modes, A* pathfinding, Debugando, lengthdir_x/y, lasers
Minhas engines: Desenhar bandeira, Efeitos texto
Minhas duvidas: ........."

sobre sua duvida estarei dando uma olhada no fds, caso ainda não esteja resolvida..

Klior

Número de Mensagens : 426
Idade : 25
Data de inscrição : 07/03/2010
Reputação : 13
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: pêndulo - QUASE lá

Mensagem por Mr. Kaleb em Sex 09 Mar 2012, 18:27

Ah, saim, agora o bicho pegou, porque, você quer uma corda maleável, então você vai ter que achar um extensão ou algo parecido, porque, digo por experiência própria, já tentei fazer algo parecido, e é bastante complexo ao meu ver.
O jeito mais fácil de fazer seria com joints, lembra daquelas engines do Jiraya de localização de pontos? Pois é, seria algo parecido, mas mesclado com um sistema de física que fosse complexa o suficiente para se adequar.
Fora isso, não sei de mais nada.

Mr. Kaleb

Ranking : Nota C
Número de Mensagens : 1400
Idade : 19
Data de inscrição : 07/09/2010
Notas recebidas : C
Reputação : 21
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: pêndulo - QUASE lá

Mensagem por PedroX em Sex 09 Mar 2012, 19:01

Entendi saim.

Para descomplicar um pouco, adicionei mais comentários.
Facilitou um bom tanto.

Qualquer coisa posta ai. Não desista não.

Edit

Assim que você entender, passo para a parte dele cair, como numa corda flexível.
Mas isso exigirá um pouco de trabalho.

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: pêndulo - QUASE lá

Mensagem por Conteúdo patrocinado Hoje à(s) 20:21


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum