
Etiquetas: ThreeJS WebGL canvas
ThreeJS puede renderizar de dos modos: canvas y WebGL. El rendimiento de WebGL es muy superior, pero canvas tiene la ventaja de que está soportado en la mayoria de navegadores, incluidos los móbiles.
En la página http://caniuse.com podemos ver el soporte de los distintos navegadores para desktop y mobile de la etiqueta canvas:

Como se puede ver esta etiqueta está soportada por la mayoria de navegadores, incluso por los de móvil. En el caso de Internet Explorer 7 y 8, no son compatibles con esta etiqueta, pero existe la posibilidad de utilizar la libreria http://code.google.com/p/explorercanvas/ para que el contenido se visualice en estos navegadores.
En el caso de WebGL tenemos la siguiente tabla de compatibilidades:

El soporte total se limita a Chrome en escritorio, aunque la mayoria de cosas funcionan también en Firefox y Opera. En Mobile hay compatibilidad en Firefox para Android, aunque el rendimiento es bastante pobre (un cubo rotando en un Samsung galaxy S3 se mueve a 20fps).
Para IE hay una opción llamada http://iewebgl.com/ que permite instalar un plugin para el navegador y poder visualizar asi contenido WebGL en Explorer, pero esta instalación hay que realizarla en cada dispositivo.

Etiquetas: canvas strokeStyle beginPath stroke lineTo
Una de las novedades de HTML5 es la etiqueta <canvas>. Esta etiqueta permite crear dinámicamente formas y elementos 2d. En este ejemplo, crearemos una pizarra sencilla con esta nueva etiqueta y algo de JavaScript.
La sintaxis para crear un objeto canvas, es la siguiente:
<canvas id="pizarra" width="300px" height="200px"></canvas>
Como vemos, especificamos un ancho, un alto, y un id ("pizarra") que utilizaremos para manipular el canvas desde JavaScript. El código JavaScript comentado sería este:

Etiquetas: BitmapData Bitmap smoothing mask drawCircle
En este ejemplo voy a tratar de explicar como se hace el "Efecto lupa" en Flash, con Actionscript 3.0.
Para simplificar voy a explicar la teoria basándome en una imagen que tengo en un MovieClip el escenario. Por supuesto esto se puede modificar para cargar imágenes externamente o como se necesite.
Los pasos que tenemos que seguir para crear el "efecto lupa" son estos:
-Crear una copia del MovieClip en BitmapData, y ponerla por encima a una escala mayor que el original:
//Creo un pantallazo del clip, lo pongo con una escala == zoomvar myBitmapData:BitmapData = new BitmapData(clip.width, clip.height);
myBitmapData.draw(clip);
var bmp:Bitmap = new Bitmap(myBitmapData);
bmp.smoothing = true;
contenedor.addChild(bmp);
contenedor.scaleX = contenedor.scaleY = zoom;
addChild(contenedor);
-Poner a la copia una máscara circular, de manera que solo se vea el trozo de imágen tapado por la máscara:
//Le pongo una mascara del tamaño t al contenedormascara.graphics.beginFill(0x000000, 1);
mascara.graphics.drawCircle(0, 0, t);
contenedor.mask = mascara;addChild(mascara);
-Añadimos un evento enterframe. Dentro de la función del evento vamos a mover la máscara siguiendo al ratón, y a recolocar la "copia grande":
addEventListener(Event.ENTER_FRAME,renderizar)
En la función del evento tenemos que mover la máscara para que siga al ratón, y recolocar la imagen grande para que el trozo que se vé sea el que corresponde a la imagen pequeña. La función es cuestión es esta:
private function renderizar(e:Event):void {
//Calculo el porcentaje que tengo que mover el pantallazovar porcentajeX = clip.mouseX / clip.width;
var porcentajeY = clip.mouseY / clip.height;
//Recoloco el contenedorcontenedor.x = -(contenedor.width - clip.width) * porcentajeX
contenedor.y = -(contenedor.height - clip.height) * porcentajeY
//Muevo la mascaramascara.x = escenario.mouseX;
mascara.y = escenario.mouseY;
}Adjunto fuentes con todos los materiales, por si queda alguna duda.

En Actionscript 3.0 disponemos de dos operadores para verificar tipos: "as" e "is". Es decir, con estos operadores podemos comprobar, por ejemplo, si un elemento del escenario es de tipo Sprite, o si una variable es de tipo Number.
Para ver como funcionan estos dos operadores voy a utilizar un escenario sobre el que tengo 3 MovieClips de la clase "Cuadrado", que extiende de MovieClip, y 3 MovieClips de la clase "Circulo", que también extiende de MovieClip.
El operador is
Permite comprobar si una variable o expresión forma parte de un tipo de datos. No solo verifica si un objeto es una instancia de la clase especificada, sino también si es una subclase de ella o implementa la misma interfaz.
Por ejemplo, si en el escenario que hemos propuesto ponemos:
for(var i:uint = 0; i < numChildren; i++){
if (getChildAt(i) is DisplayObject) {
getChildAt(i).alpha = .1
}}Obtenemos:
Como vemos, "parpadean" círculos y cuadrados, ya que todos son instancias de clases que heredan de DisplayObject. Sin embargo, si ponemos:
for(var i:uint = 0; i < numChildren; i++){
if (getChildAt(i) is Cuadrado) {
getChildAt(i).alpha = .1
}}
vemos que solamente parpadean los cuadrados, ya que los circulos no pertenecen a la misma clase ni heredan de "Cuadrado".
El operador as
También permite comprobar si un elemento es miembro de un tipo de datos. Sin embargo, en lugar de devolver true o false, devuelve el valor de la expresión en lugar de true, y null en lugar de false. Por ejemplo:
trace(miCirculo as Circulo) //Devuelve: [object Circulo]
trace(miCirculo as Sprite) //Devuelve: [object Circulo]
trace(miCirculo as Cuadrado) //Devuelve: null

Etiquetas: Plane DisplayObject3D Viewport3D BasicRenderEngine
Existen dos maneras de crear una plano con dos caras en Papervision3D:
-Crear un cubo con una profundidad de 1pixel, y utilizar las caras delantera y trasera como caras del plano.
-Crear un contenedor DisplayObject3D, y meter dentro dos planos. El plano "b" debe tener una profundidad de 1 y una rotatión de -180º.
El segundo método es el que me parece más cómodo, ya que gestionar los materiales con un cubo es más engorroso que con un plano. Un ejemplo de plano con dos caras podrías ser:
contenedor = new DisplayObject3D();
var planoA = new Plane(new MovieAssetMaterial("CaraA"), 400, 400, 4, 4);
var planoB = new Plane(new MovieAssetMaterial("CaraB"), 400, 400, 4, 4);
planoB.z = 1;
planoB.rotationY = -180;
contenedor.addChild(planoA);
contenedor.addChild(planoB);
escena.addChild(contenedor);

Etiquetas: Bend ModifierStack Phase LibraryPv3d viewport3D BasicRenderEngine Plane
AS3Dmod es una libreria de modificadores para objetos 3D. Actualmente AS3Dmod dispone de 7 modificadores (doblar, deformar...) que funcionan con Papervision3D, Away3D, Sandy3D y Alternativa3D. Aunque hay muy poca documentación (sobre todo en castellano), es bastante fácil de utilizar. Los pasos para poder utilizarla son los siguientes:
-Descargar AS3Dmod:
-Saber utilizar alguno de los 4 motores 3D compatibles. Puedes ver tutoriales de Papervision3D y Away3D en esta misma página.
-Una vez tenemos nuestra escena 3D en alguno de los motores, creamos una instancia de ModifierStack. El "modifier stack" es un link entre el objeto que queremos modificar y los modificadores:
mstack = new ModifierStack(new LibraryPv3d(), plano);
Podemos ver como se pasan como parámetro un objeto indicando la librería que vamos a utilizar (en este caso Papervision), y el objeto que vamos a modificar (un plano).
-Ahora necesitamos crear un modificador, y añadirlo a mstack. Para el ejemplo he utilizado "Bend", que recibe como parámetros la fuerza y el lugar donde se aplica:
bend = new Bend(0, 1);
mstack.addModifier(bend);
-Por último, cada vez que se haga un cambio en el modificardor, debemos aplicarlo (algo asi como ordenar que se renderice):
mstack.apply();
Para este ejemplo he utilizado una clase de AS3Dmod que se llama Phase. Esta clase sirve para crear una animación tipo seno. Es decir, nosotros incrementamos su valor, y ella controla de que siempre esté entre -1 y 1. Es decir, si incrementamos su valor en 0.5 en cada fotograma, cuando llegue a 1 volverá sobre sus pasos hasta valer -1, y viceversa.
Este es el código completo comentado:

Etiquetas: Viewport3D BasicRenderEngine interactive animated MovieAssetMaterial
En Papervision greatWhite podemos añadir eventos a los elementos 3D .
Otra opción es crear los elementos 3D a partir de MovieClips interactivos que tienen asociados eventos. Por ejemplo, tenemos un MovieClip con tres botones dentro, y creamos una esfera con ese MovieClip como material. Para que se respeten los eventos de ese clip al convertirlo en material3D, debemos configurar los siguientes parámetros:
-al crear la instancia de Viewport3D debemos especificar que es interactivo:
//los parametros son: (ancho,alto,autoEscalar,interactivo) viewport = new Viewport3D(400,400,false,true);
-al crear el material debemos especificar que es interactivo y animado:
//los parametros son: (ID de linkage,transparente,animado)var material:MovieAssetMaterial = new MovieAssetMaterial("MenuPPV",true,true);
material.interactive = true;
Tras el salto, el código completo y la demo.

Etiquetas: DAE load Viewport3D BasicRenderEngine Camera3D
Google Sketchup es uno de los programas mas sencillos de modelado 3D. Además la versión gratuita es bastante completa, y más que suficiente para hacer modelos sencillos.
Una vez hemos descargado Google Sketchup y hecho el primer modelo, tenemos que seguir los siguientes pasos:
-Exportar el modelo como Google Earth 4. Esto creará un archivo .kmz
-Renombrar el archivo .kmz a .zip.
-Descomprimir el archivo y buscar dentro el .dae y las texturas (si las hay).
Tras el salto, el 3D en movimiento y el código para cargar el modelo.

Etiquetas: InteractiveScene3DEvent BasicRenderEngine Viewport3D displayObject3D

Etiquetas: Lines3D addNewLine Line3D BasicRenderEngine Viewport3D

Etiquetas: class import extends MovieClip TextField
Ha pasado año y medio desde que salió Flash CS3 con el "nuevo" Actionscript 3.0, el 1 de Noviembre sale CS4 con algunas nuevas clases del lenguaje, y todavía muchos diseñadores (y algunos desarrolladores) se muestran reacios a dar el salto a AS3.
Personalmente creo que ese "miedo" al AS3 se perdería con un par de charlas sobre el lenguaje, y dando pistas sobre como se hacen los "basicos" (programar un botón, una carga externa, etc). Luego ya es cuestión de trastear y ver como un poco de organización en los desarrollos (que antes era "optativa", pero ahora está casi impuesta) puede ahorrarnos horas de correcciones y muchos quebraderos de cabeza.
Este tutorial va a ser el primero de una serie en la que intentaré explicar como se hacen los "básicos" en AS3.
En Actionscript 3.0 no podemos programar "encima de los objetos" como hacíamos en Actionscript 2.0. Es decir, que ya no existe eso de crear un botón y poner encima:
on(release){
trace("Me has pulsado");
}Ahora tenemos que crear el botón, ponerle un nombre en el panel de propiedades, y añadirle los eventos desde la linea de tiempo o desde un fichero .as externo.
La opción recomendada es trabajar con clases, asi que en este tutorial muestro como asociar un documento .fla con una clase principal.
Lo primero es crear un archivo Flash (Actionscript 3.0). Ahora tenemos que asociar el documento a la clase que haremos luego. En este caso la he llamado "Main". Este nombre tenemos que ponerlo en el campo "Clase de documento" del panel de propiedades:

Después creamos un campo de texto en el escenario y le ponemos el nombre "Texto_txt". Es este ejemplo vamos a hacer que desde la clase Main se ponga un texto en ese campo. Una vez que tenemos el fla preparado, lo guardamos en una carpeta.
Ahora vamos a crear la clase Main. Creamos un Archivo de Actionscript, y lo guardamos con el nombre "Main.as" en la misma carpeta que el fla. Es importante saber que le nombre del archivo tiene que ser el mismo que el nombre de la clase. En el fichero tenemos que escribir este código:
package {import flash.display.MovieClip;
public class Main extends MovieClip {
import flash.text.TextField;
public function Main():void {
Texto_txt.text = "Texto con clase";
} }}La palabra package es la que abre siempre los documentos de clase. Puede ir seguido de la ruta hasta el archivo, pero eso ya lo veremos otro día. En la segunda linea vemos un import de la clase MovieClip. La clase asociada al stage, hereda las propiedades de la clase MovieClip, por lo que tenemos que importar esta clase antes de usarla en la tercera linea:
public class Main extends MovieClip {
En esta linea estamos diciendo que vamos a crear la clase Main (que es el nombre que hemos puesto al archivo y en el panel de propiedades) , y que para esta clase vamos a utilizar como base la clase MovieClip. La siguiente linea:
import flash.text.TextField;
importa la clase TextField. En este ejemplo vamos a utilizar un campo de texto, por lo que antes de usarlo debemos "explicarle" a flash qué es un campo de texto importando la clase correspondiente (que es lo mismo que hacemos en la segunda linea con el MovieClip).
La siguiente linea
public function Main():void {
es la que crea la llamada función constructora de la clase. Esta función tiene que existir siempre, y tener el mismo nombre que la clase. La función constructora se ejecuta siempre que creamos un nuevo objeto de esa clase. Puede recibir parámetros, pero eso ya lo veremos más adelante. La última linea no tiene misterio, le decimos que ponga un texto en el campo que habíamos creado.
En resumen, hemos creado una clase asociada al escenario, que tiene que extender la clase MovieClip. Además la clase, la función constructora, y el archivo .as tienen que llamarse igual.
Ahora sólo falta publicar el fla para ver el campo con el texto.
Para cualquier duda podéis utilizar el formulario de contacto.

Etiquetas: asciify TextFormat

Etiquetas: Scene3D FreeCamera3D MovieAssetMaterial animated oneSide renderCamera

Etiquetas: PNGEncoder Base64 BitmapData Rectangle encodeByteArray

Etiquetas: Viewport3D BasicRenderEngine PointLight3D ViewPort3D GouraudMaterial

Etiquetas: Viewport3D BasicRenderEngine Scene3D Camera3D MovieMaterial MaterialList DisplayObject Viewport3D Vertex3D

Etiquetas: BitmapData Bitmap draw cachaAsBitmap createGradientBox beginGradientFill

Etiquetas: Foam useMouseDragger solverIterations addGlobalForceGenerator RigidBody addElement INFINITE_MASS createRectangle

Etiquetas: MovieScene3D Cube MaterialsList WireframeMaterial MovieMaterial MovieAssetMaterial BitmapAssetMaterial ColorMaterial BitmapFileMaterial renderCamera