matter

Introdução ao Matter.js: criando corpos físicos

O Matter.js é uma biblioteca JavaScript que permite criar simulações físicas realistas em 2D. Com ela você pode:

  • Criar corpos com propriedades físicas (peso, atrito, elasticidade)

  • Simular colisões e interações entre objetos

  • Desenvolver jogos e experiências interativas

Exemplo Prático: Simulação de Corpos Físicos

Aqui está a animação que usaremos como referência:

Passo 1: Configurando o ambiente

Antes de começarmos a programar, certifique-se de ter um ambiente de desenvolvimento configurado:

  • Um editor de código (VS Code)

  • Um navegador (Google Chrome)
  • Arquivo de template

Passo 2: Declaração de variáveis

Aqui estamos declarando as variáveis que serão usadas para armazenar os módulos do Matter.js e os corpos físicos.

				
					// Módulos do Matter.js
const Engine = Matter.Engine;
const World = Matter.World;
const Bodies = Matter.Bodies;
const Body = Matter.Body;

// Variáveis do jogo
let engine;
let world;
var ball;
var ground;
var wall;
var angle=60;
var wall2;
var ball_options;
var ground_options;
var wall_ops;
				
			
  • Engine: O “cérebro” que calcula todas as interações físicas

  • World: O “container” onde todos os objetos físicos existem

  • Bodies: Ferramenta para criar novos objetos

  • Body: Permite manipular objetos após a criação (ex.: girar paredes)

Passo 4: Função setup()

A função setup() é executada apenas uma vez e configura o ambiente do jogo.

  • createCanvas(400,400): Cria uma área de desenho de 550×600 pixels
				
					function setup(){
  createCanvas(550,600);
 
				
			

Agora criamos o motor de física:

				
					  // Cria o motor de física
  engine = Engine.create();
  world = engine.world;
				
			
  • Engine.create(): Inicializa o motor de física
  • engine.world: Acessa o mundo físico criado

Vamos configurar as opções do chão, sabendo que ele é um corpo estático:

				
					 // Configuração do chão (objeto estático)
  ground_options = {
    isStatic: true  // Não se move, mesmo com colisões
  };
				
			
  • isStatic: true: Faz o corpo ficar imóvel (perfeito para chão e paredes)

Agora criamos o corpo do chão:

				
					  // Cria o chão
 ground = Bodies.rectangle(200, 390, 400, 20, ground_options);
 World.add(world,ground);
				
			
  • Bodies.rectangle(): Cria um retângulo físico nas coordenadas (275,590) com 550×20 pixels
  • World.add(): Adiciona o corpo ao mundo físico

E criamos mais duas paredes com propriedades iguais:

Para a primeira parede temos:

				
					  // Parede 1
  wall_ops={
    isStatic:true
  };
  
  wall = Bodies.rectangle(300, 150, 70, 10, ground_options);
  World.add(world,wall);
				
			
  • isStatic: true: Faz o corpo ficar imóvel (perfeito para chão e paredes)
  • Bodies.rectangle(): Cria um retângulo físico
  • World.add(): Adiciona o corpo ao mundo físico

Para a segunda parede temos:

				
					  // Parede 2
  wall_ops={
    isStatic:true
  };
  
wall2 = Bodies.rectangle(100,200,100,20,wall_ops);
World.add(world,wall2);
				
			
  • isStatic: true: Faz o corpo ficar imóvel (perfeito para chão e paredes)
  • Bodies.rectangle(): Cria um retângulo físico
  • World.add(): Adiciona o corpo ao mundo físico

E por fim criamos a bola:

				
					  // Configuração da bola
  ball_options = {
    restitution: 0.95,
    frictionAir: 0.01
  };
  
ball = Bodies.circle(100,10,20,ball_options);
World.add(world,ball);

}
				
			
  • restitution: 0.95: Define um quique alto (95% da energia conservada)
  • friction: 0.01: Muito pouco atrito
  • Bodies.circle(): Cria um círculo físico
  • World.add(): Adiciona o corpo ao mundo físico

Passo 5: Função draw()

A função draw() é chamada continuamente para atualizar e renderizar:

  • background("gray"): Define o fundo da tela como cinza.
  • Engine.update(): Calcula todas as interações físicas a cada frame
				
					function draw() {
  background("gray");
  
  // Atualiza a física
  Engine.update(engine);
				
			

Agora vamos rotacionar a parede dois gradualmente:

				
					  // Rotaciona wall2 gradualmente
  Matter.Body.rotate(wall2,angle);
  push();
  translate(wall2.position.x,wall2.position.y);
  rotate(angle);
  rect(0,0,100,20);
  pop();
  angle +=0.1;
				
			
  • Matter.Body.rotate(wall2,angle): Rotaciona o corpo físico
  • push(): Salva o estado gráfico atual
  • translate(): Move a origem para a posição da parede
  • rotate(angle): Aplica rotação gráfica
  • rect(0,0,100,20): Desenha a parede rotacionada
  • pop(): Restaura o estado gráfico
  • angle +=0.1: Atualiza o ângulo para animação

Por fim, renderizamos os corpos para aparecem na tela:

				
					  // Desenha o chão
  fill("green");
  rect(ground.position.x,ground.position.y,400,20);

  fill("red");
  ellipse(ball.position.x,ball.position.y,20);
 
  fill("blue");
  rect(wall.position.x,wall.position.y,70,10);
}
				
			
  • fill: preenchimento com cor do corpo
  • position.x/y: Acessa a posição atual do corpo

Posts Similares

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *