GlowScript – Google – Programação 3D

Publicado: 22 de março de 2014 em 3D

GlowScript é um ambiente fácil de usar, poderoso para a criação de animações em 3D e publicá-las na web.  No glowscript.org, você pode escrever e executar programas GlowScript diretamente no seu navegador, armazená-los na nuvem de graça, e facilmente compartilhá-los com outras pessoas.

GlowScript, foi inspirado pelo VPython e oferece uma seleção semelhante de objetos 3D (caixa, cilindro, etc) para os programas de JavaScript, usando a biblioteca gráfica WebGL  3D disponíveis em muitos navegadores atuais. A intenção é tornar mais fácil para escrever em tempo real objetos 3D navegáveis ​​que são executados em uma página do navegador web, enquanto que os programas VPython, sendo baseado em Python, não são executados em navegadores. Existe um programa Python que faz uma conversão parcial do VPython para GlowScript.

Com usar

GlowScript foi adotado pela Google e você pode programar diretamente das nuvens, para isto é necessário somente uma conta do Google e o navegador Google Chrome, caso queira utilizar o GlowScript de outro navegador basta instalar o plug-in Google Chrome Frame.

Entre no site http://www.glowscript.org/ e efetue um login, crie um novo programa, cole o código abaixo e rode o programa. Como o GlowScript roda diretamente do browser você pode usar este link para testar o código direto da web.

Rode direto da web: AtomicSolid

glow

Exemplo:

Neste exemplo criamos vários objetos sphere 3D unidos  por objetos helix animados simulando efeitos de molas.

GlowScript

GlowScript 1.0
/* In GlowScript programs, rotate the camera by dragging with the right mouse button, or hold down the Ctrl key and drag.

To zoom, drag with the left+right mouse buttons, or hold down the Alt key and drag, or use the mouse wheel.*/

vec.axes = [vec(1,0,0), vec(0,1,0), vec(0,0,1)]

var k = 1
var m = 1
var spacing = 1.0
var atom_radius = 0.3*spacing
var L0 = spacing-1.8*atom_radius
var V0 = pi*pow(0.5*atom_radius,2)*L0 // initial volume of spring
var N = 3
var crystal = makeCrystal(N, atom_radius, spacing, 0.1*spacing*sqrt(k/m))
scene.center = 0.5*(N-1)*vec(1,1,1)
scene.autoscale = false
var dt = 0.04*(2*pi*sqrt(m/k))

function display_instructions() {
    var s1 = "In GlowScript programs:\n\n"
    var s2 = "    Rotate the camera by dragging with the right mouse button,\n        or hold down the Ctrl key and drag.\n\n"
    var s3 = "    To zoom, drag with the left+right mouse buttons,\n         or hold down the Alt key and drag,\n         or use the mouse wheel."
    scene.caption.text(s1+s2+s3)
}

// Display text below the 3D graphics:
scene.title.text("A model of a solid represented as atoms connected by interatomic bonds")
display_instructions()

function makeCrystal( N, atom_radius, spacing, momentumRange ) {
    var crystal = { atoms:[], springs:[] }
    var atom
    var x,y,z

    function atomAt(np) {
        if (np.x>=0 && np.y>=0 && np.z>=0 && np.x            return crystal.atoms[np.x + np.y*N + np.z*N*N]
        // Otherwise create an invisible wall and return it
        var w = box()
        w.visible = false  // comment out to see the true model
        w.size = atom_radius*vec(1,1,1)
        w.pos = np*spacing
        w.momentum = vec(0,0,0)
        return w
    }

    // Create N^3 atoms in a grid
    for(z=0; z<N; z++)
        for(y=0; y<N; y++)
            for(x=0; x<N; x++) {
                atom = sphere()
                atom.pos = vec(x,y,z)*spacing
                atom.size = 2*atom_radius*vec(1,1,1)
                atom.color = vec(0,0.58,0.69)
                atom.momentum = momentumRange*vec.random()
                crystal.atoms.push( atom )
            }

    // Create a grid of springs linking each atom to the adjacent atoms
    // in each dimension, or to invisible walls where no atom is adjacent
    for(var d=0; d<3; d++)
        for(z=-1; z<N; z++)
            for(y=-1; y<N; y++)
                for(x=-1; x<N; x++) {
                    atom = atomAt(vec(x,y,z))
                    var neighbor = atomAt(vec(x,y,z)+vec.axes[d])

                    if (atom.visible || neighbor.visible) {
                        var spring = helix()
                        spring.visible = atom.visible && neighbor.visible
                        spring.thickness = 0.05
                        spring.size = vec(spacing,atom_radius,atom_radius)
                        spring.up = vec(1,1,1) // prevent fibrillation of vertical springs
                        spring.atoms = [ atom, neighbor ]
                        spring.color = vec(1,0.5,0)
                        crystal.springs.push(spring)
                    }
                }
    return crystal
}

while (true) {
    rate(30,wait)
    for(var a=0; a<crystal.atoms.length; a++) {
        var atom = crystal.atoms[a]
        atom.pos = atom.pos + atom.momentum/m*dt
    }
    for(var s=0; s<crystal.springs.length; s++) {
        var spring = crystal.springs[s]
        spring.axis = spring.atoms[1].pos - spring.atoms[0].pos
        var L = mag(spring.axis)
        spring.axis = spring.axis.norm()
        spring.pos = spring.atoms[0].pos+0.5*atom_radius*spring.axis
        var Ls = L-1*atom_radius
        spring.size.x = Ls
        var Fdt = spring.axis * (k*dt * (1-spacing/L))
        spring.atoms[0].momentum = spring.atoms[0].momentum + Fdt
        spring.atoms[1].momentum = spring.atoms[1].momentum - Fdt
    }
}

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s