Repositorio para arquitecturas armhf con python3.6 y opencv3.2.0

Ahora que estoy en trabajando en un grupo de investigación de la Universidad de Murcia he creado un repositorio debian y con algunos paquetes como libopencv (3.2.0) y python (3.6) para usar en arquitecturas armhf, como por ejemplo raspberry pi.

Para poder usar este repositorio primero es necesario descargarse mi firma pública:

wget -qO - http://angelluispg.es/debianrepos.angelluispg.key  | sudo apt-key add -

a continuación debemos añadir en /etc/apt/sources.list la siguiente línea

deb http://debianrepos.angelluispg.es/debian jessie main

Ahora procedemos a actualizar mediante

apt-get update

Y ya podemos instalar los paquetes de mi repositorios que básicamente son libopencv (en la versión 3.2.0) y python3.6 ambos para arquitecturas armhf (como raspberry pi).

Además he modificado las fuentes de python3.6 para que haga referencia a la Universidad de Murcia.

rasp

Por cierto, después de instalar python hay que instalar easy_install mediante el siguiente comand:

wget https://bootstrap.pypa.io/ez_setup.py -O -| sudo python3.6

Si queremos instalar cualquier módulo de python podremos hacerlo mediante

easy_install [modulo]

Nueva actualización de AL3D

Ya está disponible la documentación de AL3D en: http://angelluispg.es/AL3D/doc/ y el código se puede consultar en: https://github.com/RdlP/AL3D

AL3D is a library to render 3D scenes in the Web. It uses WebGL as low end technology. AL3D include a 3D library called AL3D, but also include a complete Math library called ALMath and a physics library called ALPhysics.

How to build AL3D

AL3D uses a custom build system to build the full and minify library, and also to generate the documentation.

The source is in the src folder, divided into ALMath and AL3D. In the root threre is a build.py. To build the library you need to run this script

python build.py

or

chmod +x build.py
./build.py

If you run the script without argument the build system will build the full and minify library in the dist folder. If you want to copy the sources outside dist folder you can run the script as follow:

python build.py --move_source_to=..

If you want to generate the doc you can use:

python build.py --generate_doc

The doc is generated in a doc directory in the script folder. If you can generate the documentation in a folder named dir you can use:

python build.py --generate_doc --output_doc_dir=dir

Basics Classes

AL3D has a basics classes that are needed in order to render a simple scene. These classes are:

  • Renderer
  • Camera
  • Scene

These classes are mandatory in order to render a scene. You can delcare it as follow

var renderer = new AL3D.Renderer(window.innerWidth,window.innerHeight);
var camera = new AL3D.PerspectiveCamera(40, window.innerWidth/window.innerHeight);
var scene = new AL3D.Scene();

Renderer

The Renderer class is the responsable for render the scene, you need to pass it the width and height of the viewport, if you want a render that fill the browser you can pass window.innerWidth and window.innerHeight for width and height respectively. To render the scene you need to tell it to the render as follow: renderer.render(scene, camera);

In order to see the render in the webpage you need to retrieve the dom element from Renderer class and insert it in the html page. You can use the following code

document.getElementById("canvas").appendChild(renderer.getDomElement());

Camera

The camera is the object that you use to see the 3D world. It is your eyes. The Camera class is an abstract class. You need instantiate a PerspectiveCamera or OrthographicCamera

The constructor for PerspectiveCamera is:

AL3D.PerspectiveCamera = function(fov, aspect, near, far)

Where fov is the angle of the frustum, aspect is the aspect ratio and near and far are the near and far plane for the frustum.

The default values for the parameters are:

  • fov = 40
  • aspect = 1
  • near = 0.1
  • far = 1000

On the other hand the constructor for OrthographicCamera is:

AL3D.OrthographicCamera = function(left, right, top, bottom, near, far)

Where left, right, top, bottom, near and far are the planes for the frustum and has no default values.

Scene

The Scene object is the responsible for store all objects that must be rendered. You can add AL3D.Object3D to the scene. AL3D.Object3D is an abstract class from which all renderable object inherit. The following classes are classes that inherit from AL3D.Object3D and are instantiables.

  • PointLight
  • DirectionaLight
  • SpotLight
  • AmbientLight
  • Mesh
  • OrthographicCamera
  • PerspectiveCamera

And here are other abstracts classes that also inherit from AL3D.Object3D.

  • Camera
  • Light

You can easily add objects to the scene with the add scene function.

scene.add(mesh);

Other important classes

Apart from the previous classes, AL3D has other importants classes

  • Mesh class allows you to render meshes.
  • Material classes allows to add properties surfaces to the meshes
  • Light classe allows you to add lights to the scene.

Mesh

Mesh class allows you to render meshes. You can use the mesh constructor to create a mesh. When you use the constructor you need pass the vertices, indices of the mesh and other important parameters such as normals, uv, and material.

var mesh = new AL3D.Mesh({vertices : [], indices : [], uv : [], normals : [], material : material});

and then you can add it to the scene.

scene.add(mesh);

In most cases you will not use this method.

You can create a basics primitives with static mesh method.

var sphere = AL3D.Mesh.createSphere({radius : 1, material : material});
var cylinder = AL3D.Mesh.createCylinder({radius : 1, height: 2 material : material});
var cone = AL3D.Mesh.createCone({radius : 1, height : 2, material : material});
var circle = AL3D.Mesh.createCircle({radius : 1, resolution : 20, material : material});
var cube = AL3D.Mesh.createCube({size : 1, material : material});
var plane = AL3D.Mesh.createPlane({size : 1, material : material});

Also, you can load a model from a json model. To export models from blender you need a plugin that transform blender model to json model.

AL3D.Utils.loadModel({model : "suzanne.json"}, function(mesh){
mesh.setMaterial(new AL3D.BlinnMaterial({shininess : 128, diffuse : 0xFFAAAAAA, specular : 0xffffffff, shading : AL3D.PhongInterpolation}));
mesh.position = new ALMath.Vector3(-0.9,-0.3,-2);
mesh.orientation.x = -20;
mesh.scale = new ALMath.Vector3(0.28,0.28,0.28);
scene.add(mesh);
renderer.needUpdate = true;
})

Material

Materials classes give surface properties to meshes, for example, a material can determine the amount of light that mesh absorbs, the color of the mesh, if the mesh is afected by the light etc.

AL3D has many differents materials classes. AL3D.Material is an abstract class from which inherit the following classes

  • BasicMaterial. With this material the mesh is not affected by the light
  • LambertMaterial. With this material the mesh gets diffuse component
  • BlinnMaterial With this material the mesh gets diffuse and specular components
  • PhongMaterial. With this material the mesh gets diffuse and specular components.
  • TonnMaterial. With this material the mesh gets a toon aspect.

The abstract class material constructor is

AL3D.Material = function(p);

Where p is and object that can contains the following properties

  • texture to specify a color map
  • video to use video as a texture
  • specularMap to specify a specular map
  • normalMap to specify a normal map

Please refer to the API documentation to the other material parameters.

For example, to create a BlinnMaterial you can do the following

var material = new AL3D.BlinnMaterial({shininess : 128, diffuse : 0xFFAAAAAA, specular : 0xffffffff, shading : AL3D.PhongInterpolation});
mesh.setMaterial(material);

Lights

Lights are nedeed to give a realistic result. The lights will interact with the materials added to the meshes, but remember that BasicMaterial is not affected by lights.

AL3D has a couple of lights. Light is a abstract class from which inherit the following classes:

  • PointLight
  • DirectionalLight
  • AmbientLight
  • SpotLight

Please, refer to the API documentation to learn how to use ligths.

Lights inherit from Object3D so, you can add it to the scene

scene.add(light);

Basic example

In this example we are going to create a rotating cube in the center of screen with a color map.

This is the javascript code

var renderer, scene, camera;
var cube;

var main = function(){
var init = function(){
renderer = new AL3D.Renderer(window.innerWidth,window.innerHeight);
camera = new AL3D.PerspectiveCamera(40, window.innerWidth/window.innerHeight);
scene = new AL3D.Scene();

var cubeMaterial = cubeMaterial = new AL3D.BlinnMaterial({shininess : 128, diffuse : 0xFFAAAAAA, specular : 0xffffffff, shading : AL3D.PhongInterpolation,  texture: 'earth-tex.jpg'});
cube = new AL3D.Mesh.createCube({size: 2, material : cubeMaterial});
cube.position = new ALMath.Vector3(0,0,-3);
var pointLight = new AL3D.PointLight({color : 0xFFFFFFFF, intensity : 1, position :  new ALMath.Vector3(0,0,0)});
var directionalLight = new AL3D.DirectionalLight({color : 0xFFFFFFFF, intensity : 2, position :  new ALMath.Vector3(0,1,0)});

scene.add(cube);
scene.add(directionalLight);
scene.add(pointLight);

document.getElementById("canvas").appendChild(renderer.getDomElement());
};

var animate = function(){
cube.orientation.x = (cube.orientation.x+0.005)%360;
cube.orientation.y = (cube.orientation.y+0.005)%360;
renderer.render(scene, camera);
window.requestAnimationFrame(animate);
};

init();
animate();
}

And this is the html code

<!DOCTYPE html>
<html>
<head>
<title>AL3D Demo - Basic Example</title>
<meta charset='utf-8'/>
<script type="text/javascript" src="AL3D.js"></script>
<script type="text/javascript" src="app.js"></script>
</head>
<body onload="main()">
<div id="canvas"></div>
</body>
</html>

The result is

alt text

 

Sistema de codificación de la Primera Generación de Pokemon

En un artículo anterior he mencionado que Pokemon usa una codificación diferente a la ascii estándar para las cadenas de texto, esta codificación es una codificación propietaria. Cada carácter ocupa 1 byte y la codificación depende de la región del juego, por ejemplo, no es lo mismo el juego de caracteres que posee la versión japonesa que el juego de caracteres que posee la versión europea.

Por encontrarnos en Europa, voy a detallar el juego de caracteres de la versión europea.

  • El byte 0x00 es el carácter nulo
  • Del byte 0x01 al 0x47, ambos inclusive. son datos no usados en la versión europea.
  • Del byte 0x48 al 0x5F, ambos inclusive, son usados como caracteres de control.
  • Del byte 0x60 al 0x7E, ambos inclusive, son datos no usados en la versión europea.
  • Del byte 0x80 al 0xBF, ambos inclusibe, son caracteres imprimibles y que se detallaran a continuación.
  • Del byte 0xC0 al 0xDF, ambos inclusive, son datos no usados en la versión europea.
  • Del byte 0xE0 al al 0xFF, ambos inclusive, son caracteres especiales y números imprimibles (a excepción 0xE9, 0xEA y 0xEB).

 

n14

Veamos un ejemplo, el nombre de nuestro usuario se guarda en RAM en la dirección 0xD158 como se muestra a continuación

c001

Como se puede ver en la dirección de memoria mencionada podemos ver 0x80 0x80 0x87 0x50 que si miramos en la tabla superior damos cuenta que corresponde a ASH y que 0x50 es un carácter de control, generalmente para delimitar cadenas.