O sistema de física em fluxus é baseado na biblioteca ODE, que permite a você adicionar propriedades físicas a objetos e colocá-los em movimento. Já que ODE foi projetada para simulações em corpos rígidos, estruturas são descritas em termos de objetos, dobras e forças. Uma explicação muito mais compreensiva destes conceitos pode ser encontrada na documentação de ODE, que você provavelmente baixou se teve que compilar fluxus, ou pode ser encontrado em @url{http://ode.org/ode-docs.html} Para ajudar com a depuração de dobras, tente chamar (render-physics) em cada frame, o que vai renderizar locators mostrando a você posições e eixos de dobras que possuem informação posicional.
Returns void
Habilita ou desabilita detecção de colisão. Padrão é desligado.
Example
(collisions 1)
Returns void
Cria um plano passivo infinito pra usar como 'chão'.
Example
(ground-plane (vector 0 1 0) 0)
Returns void
Permite que o objeto seja afetado pelo sistema físico, usando uma caixa como um volume limite. Como um objeto ativo, ele vai ser transformado por ODE. Nota: rotações só funcionam corretamente se você específicar suas escalagens primeiro, depois rotacionar (translação não importa) basicamente, ode não pode lidar com tranformações cortadas.
Example
(define mycube (build-cube)) (active-box mycube)
Returns void
Permite que o objeto seja afetado pelo sistema físico, usando um cilindro como um volume limite. Como um objeto ativo, ele vai ser transformado por ODE. Nota: rotações só funcionam corretamente se você específicar suas escalagens primeiro, depois rotacionar (translação não importa) basicamente, ode não pode lidar com tranformações cortadas.
Example
(define mycube (build-cube)) (active-cylinder mycube)
Returns void
Permite que o objeto seja afetado pelo sistema físico, usando uma esfera como um volume limite. Como um objeto ativo, ele vai ser transformado por ODE. Nota: rotações só funcionam corretamente se você específicar suas escalagens primeiro, depois rotacionar (translação não importa) basicamente, ode não pode lidar com tranformações cortadas.
Example
(define mycube (build-cube)) (active-sphere mycube)
Returns void
Permite que o objeto seja afetado pelo sistema de física, usando a malha como volume de colisão. Esta função funciona apenas em primitivas, lista de triangulos indexadas. Como um objeto ativo, ela vai ser transformada por ode. Nota: rotações só funcionam corretamente se você especificar suas transformações de escala antes, depois rotacionar (translação não importa), basicamente ode não consegue lidar com cisalhamento de transformações.
Example
(define myshape (load-primitive "bot.obj")) (active-mesh myshape)
Returns void
Permite que o objeto seja resolvido pelo sistema de física, usando uma caixa como o limite. Como um objeto passivo, objetos ativos vão colidir com ele, mas este não vai ser transformado. Nota: rotações só funcionam corretamente se você especificar suas transformaçoes de escala primeiro, depois rotacionar (translação não importa) basicamente, ode não pode lidar com transformações cortadas.
Example
(define mycube (build-cube)) (passive-box mycube)
Returns void
Permite que o objeto seja resolvido pelo sistema de física, usando um cilindro como o limite. Como um objeto passivo, objetos ativos vão colidir com ele, mas este não vai ser transformado. Nota: rotações só funcionam corretamente se você especificar suas transformaçoes de escala primeiro, depois rotacionar (translação não importa) basicamente, ode não pode lidar com transformações cortadas.
Example
(define mycube (build-cube)) (passive-cylinder mycube)
Returns void
Permite que o objeto seja resolvido pelo sistema de física, usando uma esfera como o limite. Como um objeto passivo, objetos ativos vão colidir com ele, mas este não vai ser transformado. Nota: rotações só funcionam corretamente se você especificar suas transformaçoes de escala primeiro, depois rotacionar (translação não importa) basicamente, ode não pode lidar com transformações cortadas.
Example
(define mycube (build-cube)) (passive-sphere mycube)
Returns void
Permite que o objeto seja atuado no sistema de física, usando a malha como o volume de colisão. Esta função funciona apenas em primitivas, lista-de-triangulos indexados. Como um objeto passivo, objetos ativos podem colidir com ela, mas ela não vai sofrer transformação. Nota: rotações só funcionam corretamente se você especificar suas transformaçoes de escala primeiro, depois rotacionar (translação não importa) basicamente, ode não pode lidar com transformações cortadas.
Example
(define myshape (load-primitive "bot.obj")) (passive-mesh myshape)
Returns void
Remove o objeto do sistema de física.
Example
(define mycube (build-cube)) (active-box mycube) (physics-remove mycube)
Returns void
Ajusta alguns parâmetros globais de superfície que afetam o atrito e reflexão. Veja seção 7.3.7 dos docs de ODE para uma explicação desses parâmetros.
Example
(surface-params 0.1 0.1 0.1 0.1)
Returns void
Cria um balljoint para conectar dois objetos (veja os docs de ode para uma descrição detalhada das diferenças entre os tipos de dobras). ODE considera as juntas(joints) serem uma restrição imposta entre dois objetos. Quando criando uma junção, é importante ter as duas primitivas sendo juntas na posição desejada antes de criar uma junção. Junções podem ser criadas, modificadas e indexadas de uma maneira similar a outras primitivas.
Example
(clear) (ground-plane (vector 0 1 0) -1) (collisions 1) (define shape1 (with-state (translate (vector -1 0 0)) (build-cube))) (active-box shape1) (define shape2 (with-state (translate (vector 1 0 0)) (build-cube))) (active-box shape2) (build-balljoint shape1 shape2 (vector 0 0 0)) (kick shape1 (vector 0 2 0)) (set-physics-debug #t)
Returns void
Cria uma junção para conectar um objeto ao ambiente global. Isto trava o objeto no lugar.
Example
(clear) (define shape1 (with-state (translate (vector 0 1 0)) (build-cube))) (active-box shape1) (build-fixedjoint shape1) ; not very exciting...
Returns void
Cria uma junção circular para conectar dois objetos ( veja os docs de ODE para uma descrição detalhada entre tipos de junções). ODE considera as juntas(joints) serem uma restrição imposta entre dois objetos. Quando criando uma junção, é importante ter as duas primitivas sendo juntas na posição desejada antes de criar uma junção. Junções podem ser criadas, modificadas e indexadas de uma maneira similar a outras primitivas.
Example
(clear) (ground-plane (vector 0 1 0) -1) (collisions 1) (define shape1 (with-state (translate (vector -1 0 0)) (build-cube))) (active-box shape1) (define shape2 (with-state (translate (vector 1 0 0)) (build-cube))) (active-box shape2) (build-hingejoint shape1 shape2 (vector 0 0 0) (vector 0 0 1)) (kick shape1 (vector 0 2 0)) (set-physics-debug #t)
Returns hingeid-number
Cria uma junção deslizante entre dois objetos (veja a documentação de ODE para uma descrição detalhada das diferenças entre os tipos de conexões). ODE considera as juntas(joints) serem uma restrição imposta entre dois objetos. Quando criando uma junção, é importante ter as duas primitivas sendo juntas na posição desejada antes de criar uma junção. Junções podem ser criadas, modificadas e indexadas de uma maneira similar a outras primitivas.
Example
(clear) (ground-plane (vector 0 1 0) -1) (collisions 1) (define shape1 (with-state (translate (vector -1 0 0)) (build-cube))) (active-box shape1) (define shape2 (with-state (translate (vector 1 0 0)) (build-cube))) (active-box shape2) (build-sliderjoint shape1 shape2 (vector 1 0 0)) (kick shape1 (vector 0 2 0)) (set-physics-debug #t)
Returns numero-id-dobradiça(hinge)
Cria uma dobradiça de junções para conectar dois objetos (veja a documentação de ODE para uma descrição detalhada das diferenças entre os tipos de conexões). ODE considera as juntas(joints) serem uma restrição imposta entre dois objetos. Quando criando uma junção, é importante ter as duas primitivas sendo juntas na posição desejada antes de criar uma junção. Junções podem ser criadas, modificadas e indexadas de uma maneira similar a outras primitivas.
Example
(clear) (ground-plane (vector 0 1 0) -1) (collisions 1) (define shape1 (with-state (translate (vector -1 0 0)) (build-cube))) (active-box shape1) (define shape2 (with-state (translate (vector 1 0 0)) (build-cube))) (active-box shape2) (build-hinge2joint shape1 shape2 (vector 0 0 0) (vector 1 0 0) (vector 0 1 0)) (kick shape1 (vector 0 2 0)) (set-physics-debug #t)
Returns número-id-dobradiça(hinge)
Cria uma junção com mobilidade angular para conectar dois objetos (veja a documentação de ODE para uma descrição detalhada das diferenças entre os tipos de conexões). ODE considera as juntas(joints) serem uma restrição imposta entre dois objetos. Quando criando uma junção, é importante ter as duas primitivas sendo juntas na posição desejada antes de criar uma junção. Junções podem ser criadas, modificadas e indexadas de uma maneira similar a outras primitivas.
Example
(clear) (ground-plane (vector 0 1 0) -1) (collisions 1) (define shape1 (with-state (translate (vector -1 0 0)) (build-cube))) (active-box shape1) (define shape2 (with-state (translate (vector 1 0 0)) (build-cube))) (active-box shape2) (build-amotorjoint shape1 shape2 (vector 1 0 0)) (kick shape1 (vector 0 2 0)) (set-physics-debug #t)
Returns número-id-dobradiça(hinge)
Ajusta o parâmetro da junção para uma junta onde param é um dos seguintes: "HiStop", "Vel", "FMax", "FudgeFactor", "Bounce, "CFM", "StopERP", "StopCFM", "SuspensionERP", "SuspensionCFM", "Vel2", "FMax2". Veja Seção 7.5.1 da documentação de ODE para uma explicação de cada um desses parâmetros, e a qual tipos de junções eles aplicam.
Example
(clear) (ground-plane (vector 0 1 0) -1) (collisions 1) (define shape1 (with-state (translate (vector -1 0 0)) (build-cube))) (active-box shape1) (define shape2 (with-state (translate (vector 1 0 0)) (build-cube))) (active-box shape2) (define j (build-hinge2joint shape1 shape2 (vector 0 0 0) (vector 1 0 0) (vector 0 1 0))) (joint-param j "Vel2" 0.1) (joint-param j "FMax2" 0.2) (joint-param j "LoStop" -0.75) (joint-param j "HiStop" 0.75) (set-physics-debug #t)
Returns void
Ajusta um novo ângulo para este joint, com uma velocidade dada para chegar lá.
Example
(clear) (ground-plane (vector 0 1 0) -1) (collisions 1) (define shape1 (with-state (translate (vector -1 0 0)) (build-cube))) (active-box shape1) (define shape2 (with-state (translate (vector 1 0 0)) (build-cube))) (active-box shape2) (define j (build-hingejoint shape1 shape2 (vector 0 0 0) (vector 0 1 0))) (joint-param j "FMax" 20) (joint-param j "LoStop" -1) (joint-param j "HiStop" 1) (set-physics-debug #t) (define (animate) (joint-angle j 0.1 (* 5 (sin (time)))))
Returns void
Aplica a força dada na direção do slide. Isto é, aplica uma força de magnitude força, na direçao do eixo do slide, ao corpo1, e com a mesma magnitude mas direção contrária ao corpo2.
Example
(clear) (ground-plane (vector 0 1 0) -1) (collisions 1) (define shape1 (with-state (translate (vector -1 0 0)) (build-cube))) (active-box shape1) (define shape2 (with-state (translate (vector 1 0 0)) (build-cube))) (active-box shape2) (define j (build-sliderjoint shape1 shape2 (vector 1 0 0))) (joint-param j "FMax" 20) (joint-param j "LoStop" -1) (joint-param j "HiStop" 1) (set-physics-debug #t) (define (animate) (joint-slide j (* 5 (sin (time)))))
Returns void
Ajusta o máximo número de objetos que o sistema de física pode lidar. Quando o máximo nível foi alcançado os objetos mais antigos são automaticamente destroidos.
Example
(clear) (set-max-physical 200) (every-frame (with-state (translate (vector 0 5 0)) (scale (srndvec)) (colour (rndvec)) (let ((ob (build-cube))) (active-box ob) (kick ob (vmul (srndvec) 3)) (twist ob (vmul (srndvec) 2)))))
Returns void
Ajusta a massa de um objeto ativo no sistema de física
Example
(clear) (ground-plane (vector 0 1 0) 0) (collisions 1) (set-max-physical 20) ; not a great example, but these boxes will have ; different mass, so behave a bit differently. (every-frame (when (> (rndf) 0.92) (with-state (translate (vector 0 5 0)) (scale (vmul (rndvec) 5)) (colour (rndvec)) (let ((ob (build-cube))) (active-box ob) (set-mass ob (* (rndf) 10)) (kick ob (vmul (srndvec) 3)) (twist ob (vmul (srndvec) 2))))))
Returns void
Ajusta a força e direção da gravidade.
Example
(clear) (ground-plane (vector 0 1 0) 0) (collisions 1) (set-max-physical 20) (every-frame (begin (gravity (vector 0 (sin (time)) 0)) ; change gravity! :) (when (> (rndf) 0.92) (with-state (translate (vector 0 5 0)) (scale (rndvec)) (colour (rndvec)) (let ((ob (build-cube))) (active-box ob) (kick ob (vmul (srndvec) 3)) (twist ob (vmul (srndvec) 2)))))))
Returns void
Aplica força de translação ao objeto.
Example
(clear) (collisions 1) (set-max-physical 20) (gravity (vector 0 0 0)) (every-frame (when (> (rndf) 0.92) (with-state (scale (rndvec)) (colour (rndvec)) (let ((ob (build-cube))) (active-box ob) (kick ob (vmul (srndvec) 3)) (twist ob (vmul (srndvec) 2))))))
Returns void
Aplica força rotacional ao objeto
Example
(clear) (collisions 1) (set-max-physical 20) (gravity (vector 0 0 0)) (every-frame (when (> (rndf) 0.92) (with-state (scale (rndvec)) (colour (rndvec)) (let ((ob (build-cube))) (active-box ob) (kick ob (vmul (srndvec) 3)) (twist ob (vmul (srndvec) 2))))))
Returns void
Adiciona força ao corpo
Example
(clear) (collisions 1) (for ([i (in-range 15)]) (let* ([p (vmul (srndvec) 15)] [c (with-state (translate p) (build-cube))]) (active-box c) (set-gravity-mode c #f) (add-force c (vmul p -10))))
Returns void
Adiciona torque ao corpo
Example
(clear) (define c (build-cube)) (active-box c) (add-torque c #(10 0 0))
Returns void
Ajusta se o corpo é influenciado pela gravidade do mundo ou não.
Example
(clear) (collisions 1) (define a (with-state (translate (vector -.95 5 0)) (build-cube))) (define b (build-cube)) (active-box a) (active-box b) (set-gravity-mode b #f)
Returns void
Retorna verdadeiro se a primitiva pega colidiu no ultimo frame.
Example
(clear) (ground-plane (vector 0 1 0) 0) (collisions 1) (set-max-physical 20) (define ob (with-state (translate (vector 0 5 0)) (build-cube))) (active-box ob) (every-frame (when (has-collided ob) (with-primitive ob (colour (rndvec)))))