Wednesday, September 19, 2018

API's de SAP Leonardo Machine Learning en el Go


Trabajar en el d-shop, primero en el Silicon Valley y ahora en Toronto, me permite usar mi creatividad y jugar con cualquier nuevo gadget que llega al mercado.

Esta vez, fué el turno del Oculus Go 😉 y qué es el Oculus Go? Bueno, es un headset de VR independiente, lo cual significa basicamente…no hay cables que se puedan enredar 😉

Para este proyecto tenía la oportunidad de trabajar ya sea con UnityUnreal Engine…Ya había utilizado Unity muchas veces para desarrollar aplicaciones para el Oculus Rift y Microsoft HoloLens…así que pensé que Unreal Engine sería una mejor opción esta vez…aunque nunca lo había utilizado antes para un proyecto grande…especialmente porque nada le gana a Unreal cuando se trata de gráficos…

Con Unreal selecionado…tenía que tomar otra decisión…C++ o Blueprints…bueno…aunque he utilizado C++ en el pasado para un par de aplicaciones en Cinder…Blueprints se veía mejor puesto que quería desarrollar más rápidamente y sin demasiadas complicaciones…y bueno…esa es solo la mitad de la verdad…algunas veces los Blueprints pueden convertirse en algo muy confuso 😊

Solo para que lo sepan, utilicé Unreal Engine 4.20.2 y cree una aplicación Blueprints.



Desde el inicio sabía que quería utilizar las API´s de Machine Learning de SAP Leonardo…puesto que ya las había utilizado antes para mi blog “Cozmo, leeme”  donde utilicé al robot Cozmo, OpenCV y el API de OCR de SAP Leonardo para leer una pizarra con un mensaje escrito a mano y hacer que Cozmo le leyera en voz alta.

La idea

Esta vez, quería demostrar el uso de más de una API…así que tenía que escoger cuales…afortunadamente eso no fué muy dificil…la mayoría de las APIs son más orientadas al uso “Empresarial”…Así que eso me dejaba con “Image Classification, OCR y Language Translation” …

Con todo decidido…aún debía pensar como utilizar las API’s…es decir…el Oculus Go es Realidad Virtual…así que no había la posibilidad de mirar a algo, tomarle una foto y enviarla al API…

Así que, pensé…por qué no utilizo Blender (que es una herramienta Open Source para el desarollo de gráficos generados por computadora) y hacer algunos models…luego podría hacer un render de los models…tomar una foto y enviarlas al API…y tener los model significa…que podía convertirlos a archivos “.fbx” y cargarlos a Unreal para una mejor experiencia…

Con las API's de OCR…era diferente…puesto que necesitaba images con texto…así que decidí utilizar InkScape (que es un software Open Source para editar imágenes vectoriales).

La implementación

Cuando comencé a trabajar en este proyecto…sabía que tenía que ir paso a paso…así que primero hice una version Windows de la aplicación…luego la convertí a Android (Lo cual fué muy sencillo dicho sea de paso) y finalmente una aplicación para el Oculus Go (Lo cual fué un poco doloroso…)

Así qué, lástimosamente no voy a poder poner nada de código fuente en este blog…simplemente porque utilicé Blueprints…y no estoy muy seguro que si quieran reproducirlos a mano ☹ Se darán cuenta de lo que hablo más adelante en el blog…

En fín…continuemos 😊

Cuando pensé en este proyecto, lo primero que me vino a la mente fué…quiero tener un espacio de d-shop…con algunos escritorios…un letrero para cada API…algunas luces no estarían nada mal…



Entonces, no se vé nada mal, no?

Luego, quería trabajar en el API de “Image Classification”…así que quería que fuera bastante parecido…pero con solo un escritorio en el medio…que luego se convirtío en un pedestal…con los objectos 3D rotándo encima…también debería haber un espacio listo para mostrar el resultado de llamar a la API…también…flechas para permitir al usuario cambiar el modelo 3D…y el ícono de una casa para permitir al usario regresar al “Showfloor”…




Se darán cuenta de dos cosas muy rápidamente…primero…qué se supone que esa esfera? Bueno…es solo un contenedor que será reemplazado con los objectos 3D 😊 También…pueden ver un poster negro que dice “SAP Leonardo Output”…eso está escondido y solo se vuelve visible cuando lanzamos la aplicación…

Para las escenas de “Optical Character Recognition” y “Language Translation”…es practicamente lo mismo aunque el último no tiene flechas 😊





Los Problemas

Así que asi es basicamente como las escenas están conectadas…pero por supuesto…me encontré con el primer problema muy rápidamente…como llamar a las API’s utilizándo Blueprints? Busqué online y la mayoría de los plugins son pagados…pero afortunadamente encontré uno gratuito que realmente me sorprendió…UnrealJSONQuery funciona perfectamente y no es tan complicado de utilizar…pero por supuesto…tuve que cambiar algunas cosas en el código fuente (como agregar la cabecera para la llave y cambiar los parámetros para poder subir las imágenes). Luego simplemente recompilé y voila! Tenía JSON en mi aplicación 😉

Pero quieren saber que es lo que cambié, no? Claro 😊Simplemente descomprimí el archivoy me fuí a JSONQuery --> Source --> JSONQuery --> Private y abrí JsonFieldData.cpp

Aquí agregué una nueva cabecera con (“APIKey”, “MySAPLeonardoAPIKey”) y luego busqué el PostRequestWithFile y cambié el parámetro “file” a “files”…

Para compilar el código fuente, simplemente creé una aplicación C++, luego cree una carpeta “plugins” en la carpeta de mi proyecto y puse todos los archivos del zip que descargué…abrí el proyecto…lo dejé compilar y luego recreé todo lo del proyecto anterior…una vez que hice eso…todo comenzó a funcionar perfectamente…

Entonces, veamos parte del Blueprint que utilicé para llamar al API…




Basicamente, necesitamos crear el JSON, llamar al API y después leer el resultado y extraer la información.

Todo estaba yendo de las mil maravillas…hasta que me di cuenta de que necesitaba empaquetar las images 3D generadas por Blender…y no tenía idea de como hacerlo…así que afortunadamente…el Victory Plugin vino al rescate 😉 Victory tiene algunos nodos que nos permiten leer muchos de los directorios que se encuentran dentro de una aplicación compilada…así que finalmente estaba todo listo 😊

Así es como se vé el Victory plugin cuando lo llamamos en un Blueprint…




Los Modelos

Para los models 3D como ya lo dije…utilicé Blender…los modelé utilizándo el “Cycles Render”, hice un bake a los materiales y luego hice el render de las imágenes utilizándo el “Blender Render” para poder generar los archivos .fbx…





Si las manzanas se ven como si fueran de metal o de cera…culpen a mis pobres habilidades para definir la iluminación ☹

Cuando se carga en Unreal…los modelos se ven realmente muy bien…


Ahora…estoy seguro que quieren ver como ve una pantalla completa de Blueprint…está es para los modelos 3D en la escena de Image Classification…



Complicado? Bueno...un poco…usualmente los Blueprints son así…pero son realmente muy poderosos…

Aquí hay otro…esta vez para la "Flecha a la Derecha" que nos permite cambiar los modelos…


Se ve extraño y complejo…pero funciona muy bien 😉



Se darán cuenta de que “Image Classification” y “OCR” tienen ambos flechas a la izquierda y derecha…así que tenía que reutilizar algunas variables y estas debían ser compartidas entre Blueprints…así que…para esto creé un “Game Instance” donde simplemente creé unas cuantas variables públicas que podían ser compartidas y actualizadas.

Si se preguntan para que utilicé Inkscape? Bueno…quería tener una especie de anunción en luces de neon y una imagen escrita a mano…



De Android al Oculus Go

Se preguntarán…por qué cambia de Android al Oculus Go? No están ambos basados en Android? Bueno…sí…pero aún así…gracias a mi experiencia personal…ahora se que las cosas cambian mucho…

Primero…en Android…creé las escenas…y todo estaba perfecto…en el Oculus Go…ninguna escena nueva estaba siendo cargada…cuando hacía click en alguna escena…la primera escena se cargaba a si misma… ☹ Por qué? Porque necesitaba agregarlas al array de escenas que debían ser empaquetadas…

Y lo gracioso es que la carpeta por defecto para proyecto de Unreal es“Documentss”…así que cuanod trataba de agregar las escenas, Unreal se quejaba de que la ruta era demasiado larga…así que tuve que clonar el proyecto y moverlo a una carpeta dentro de C:\

También…cuando cambié de Windows a Android…fué algo tan simple como cambiar el “Click” por “Touch”…pero para el Oculus Go…bueno…necesité crear un “Pawn”…donde puse una camara, un motion controller, y un puntero (actuándo como un puntero laser)…aquí cambie el “Touch” por un “Motion Controller Thumbstick”…y desde ahí tuve que controlar todos los aspectos de la navegación…bastante confuso…

Otra cosas que cambió completamente fué el “SAP Leonardo Output”…veamos como se veía en Android…



Aquí pueden ver que utilicé un “HUD”…así que sin importar a donde miremos…el HUD se mueve con nosotros…

En el Oculus Go…esto no funcionaba para nada…primero tuve que utilizar una imagen negra como fondo…

Luego tuve que crear un actor y luego agrgar el HUD dentro…para convertirlo en un HUD 3D…




El producto final

Cuando todo estaba listo…simplemente empaqueté mi aplicación y la cargué en el Oculus Go…y utilizándo Vysor pude grabar una simple sesión para que puedan ver como se vé en la vida real 😉 Por supuesto…el problema (Primero que nada porque…soy muy flojo como para seguir investigándo y segundo porque parece ser mucho trabajo) es que necesitas correr la aplicación desde la sección “Unknown Sources” en el Oculus Go…pero…está ahí y funciona y eso es lo único que importa 😉

Aquí esta el video para que puedan tener una mejor idea de que lo que se trata el proyecto 😊





Espero que les haya gustado 😉

Saludos,

Blag.
SAP Labs Network.




Monday, July 30, 2018

Cozmo, leeme


Conoces a Cozmo? El robot amigable de Anki? Bueno...aquí está...

Cozmo es un robot programable que tiene muchas características...y una de ellas incluye una camera...así que puedes hacer que Cozmo tome una foto de algo...y luego hacer algo con esa foto...

Para programar a Cozmo necesitamos utilizar Python...en realidad...Python 3 -;)

Para este blog, vamos a necesitar un par de cosas...así que vamos a instalarlas...

pip3 install ‘cozmo[camera]’

Esto va a instalar el SDK de Cozmo...y vamos a necesitar también instalar el app de Cozmo app en nuestro teléfono celular también...

Si ya tienen el SDK instalado, quizás deberían actualizarlo porque si no tienen la última versión esto no va a funcionar...

pip3 install --upgrade cozmo

Ahora, necesitamos algunas cosas adicionales...

sudo apt-get install python-pygame
pip3 install pillow
pip3 install numpy

pygame es un framework para juegos
pillow es un wrapper para la librería PIL que se usa para manipular images.
numpy nos permite manejar números complejos en Python.

Esta fué la parte sencilla...puesto que ahora debemos instalar OpenCV...el cual nos permite manipular imágenes y video...

Esta parte es un poco complicada, así que si se quedan atracados...busquen en Google o simplemente escribanme un mensaje...

Primero, debemos asegurárnos de que OpenCV no está instalado...desinstalándolo...a menos que estén seguros de que funciona correctamente...

sudo apt-get uninstall opencv

Luego, debemos instalar los siguientes pre-requisitos...

sudo apt-get install build-essential cmake pkg-config yasm python-numpy

sudo apt-get install libjpeg-dev libjpeg8-dev libtiff5-dev libjasper-dev 
libpng12-dev

sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev 
libv4l-dev libdc1394-22-dev

sudo apt-get install libxvidcore-dev libx264-dev libxine-dev libfaac-dev

sudo apt-get install libgtk-3-dev libtbb-dev libqt4-dev libmp3lame-dev

sudo apt-get install libatlas-base-dev gfortran

sudo apt-get install libopencore-amrnb-dev libopencore-amrwb-dev 
libtheora-dev libxvidcore-dev x264 v4l-utils

Si por alguna razón, algo no está disponible en su sistema, simplemente remuevánlo de la lista e intenten otra vez...a menos que sean como yo y quieran pasar horas tratándo de conseguir todo...

Ahora, debemos descargar el código fuente de OpenCV para que podamos construírlo...desde el código fuente...

wget https://github.com/opencv/opencv/archive/3.4.0.zip
unzip opencv-3.4.0.zip //This should produce the folder opencv-3.4.0

Luego, debemos descargar las contribuciones porque hay cosas que no vienen incluídas con OpenCV por defecto...y quizás quieran utilizarlas en algún otro proyecto...

wget https://github.com/opencv/opencv_contrib/archive/3.4.0.zip
unzip opencv-contrib-3.4.0.zip 
//This should produce the folder opencv_contrib-3.4.0

Como tenemos las dos carpetas, podemos comenzar a compilar...

cd opencv-3.4.0
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE 
-D CMAKE_INSTALL_PREFIX=/usr/local 
-D INSTALL_PYTHON_EXAMPLES=OFF 
-D CMAKE_CXX_COMPILER=/usr/bin/g++ 
-D INSTALL_C_EXAMPLES=OFF 
-D OPENCV_EXTRA_MODULES_PATH=/YourPath/opencv_contrib-3.4.0/modules 
-D PYTHON_EXECUTABLE=/usr/bin/python3.6 
-D WITH_FFMPEG=OFF 
-D BUILD_OPENCV_APPS=OFF 
-D BUILD_OPENCD_TS=OFF 
-D WITH_LIBV4L=OFF 
-D WITH_CUDA=OFF 
-D WITH_V4L=ON 
-D WITH_QT=ON 
-D WITH_LAPACK=OFF 
-D WITH_OPENCV_BIOINSPIRED=OFF 
-D WITH_XFEATURES2D=ON 
-D WITH_OPENCL=OFF 
-D WITH_FACE=ON 
-D ENABLE_PRECOMPILED_HEADERS=ON 
-D WITH_OPENCL=OFF 
-D WITH_OPENCL_SVM=OFF 
-D WITH_OPENCLAMDFFT=OFF 
-D WITH_OPENCLAMDBLAS=OFF 
-D WITH_OPENCV_DNN=OFF 
-D BUILD_OPENCV_APPS=ON 
-D BUILD_EXAMPLES=OFF ..

Tengan mucho cuidado de pasar la ruta correcta para la carpeta opencv_contrib...así que es mejor pasar la ruta completa para evitar cualquier error de compilación...

Y sí...ese es un comándo bastante extenso para un build...y me tomó mucho tiempo hacerlo funcionar...puesto que hay que asegurárse de que todos los parámetros son correctos...

Una vez que hemos terminado, necesitamos compilarlo...puesto que cmake va a preparar la "receta"...

make -j2

Si hay algún error, simplemente hagan esto...y comiencen otra vez...

make clean
make

Luego, podemos finalmente instalar OpenCV con estos comandos...

sudo make install
sudo ldconfig

Para pobrar que está funcionando correctamente...simplemente debemos hacer esto...

python3
>>>import cv2


Si no tienen ningún error...entonces estamos listos para continuar -;)

Eso fué bastante trabajo...en fín...necesitamos una herramienta adicional para asegurárnos de que nuestra images es procesada de la mejor manera...

Debemos descargar textcleaner y ponerlo en la misma carpeta que nuestro script de Python...

Y...en caso de que se estén preguntándo...sí...vamos a hacer que Cozmo tome una foto...vamos a procesar la imagen...usar SAP Leonardo's OCR API y luego hacer que Cozmo nos lea el mensaje...emocionánte, no?
SAP Leonardo's OCR API aún está en la version 2Alpha1...pero fuera de eso...funciona extremadamente bien -;)

Aunque tomen en cuenta que si el resultado no es siempre el más acertado es porque la luz, la posición de la imagen, tu escritura y por el hecho de que el OCR API aún está en Alpha...

Ok...así que primero lo primero...necesitamos una pequeña pizarra...


Y claro...mi escritura a mano no es la mejor del mundo... -:(

Ahora, saltemos al código fuente...


CozmoOCR.py
import cozmo
from cozmo.util import degrees
import PIL
import cv2
import numpy as np
import os
import requests
import json
import re
import time
import pygame
import _thread

def input_thread(L):
    input()
    L.append(None)

def process_image(image_name):
 image = cv2.imread(image_name)
 
 img = cv2.resize(image, (600, 600))
 img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 
 blur = cv2.GaussianBlur(img, (5, 5), 0)
 denoise = cv2.fastNlMeansDenoising(blur)
 thresh = cv2.adaptiveThreshold(denoise, 255, 
                 cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
 blur1 = cv2.GaussianBlur(thresh, (5, 5), 0)
 dst = cv2.GaussianBlur(blur1, (5, 5), 0)
 
 cv2.imwrite('imggray.png', dst)
 
 cmd = './textcleaner -g -e normalize -o 12 -t 5 -u imggray.png out.png'
 
 os.system(cmd) 

def ocr():
 url = "https://sandbox.api.sap.com/ml/ocr/ocr"
 
 img_path = "out.png"
 
 files = {'files': open (img_path, 'rb')}
 
 headers = {
     'APIKey': "APIKey",
     'Accept': "application/json",
 }
 
 response = requests.post(url, files=files, headers=headers)
 
 json_response = json.loads(response.text)
 json_text = json_response['predictions'][0]
 json_text = re.sub('\n',' ',json_text)
 json_text = re.sub('3','z',json_text)
 json_text = re.sub('0|O','o',json_text) 
 return json_text

def cozmo_program(robot: cozmo.robot.Robot):
 robot.camera.color_image_enabled = False
 L = []
 _thread.start_new_thread(input_thread, (L,))
 robot.set_head_angle(degrees(20.0)).wait_for_completed()
 while True:
  if L:
   filename = "Message" + ".png"
   pic_filename = filename
   latest_image = robot.world.latest_image.raw_image
   latest_image.convert('L').save(pic_filename)
   robot.say_text("Picture taken!").wait_for_completed()
   process_image(filename)
   message = ocr()
   print(message)
   robot.say_text(message, use_cozmo_voice=True, 
                                       duration_scalar=0.5).wait_for_completed()
   break

pygame.init()
cozmo.run_program(cozmo_program, use_viewer=True, force_viewer_on_top=True)


Analicemos un poco el código fuente...

Vamos a utilizar threads (hilos), puesto que necesitamos tener una ventana donde podamos ver lo que Cozmo está viendo y otra con Pygame donde podamos presionar "Enter" como un comando para hacer que Cozmo tome la foto.

 Basicamente, cuando ejecutamos la aplicación, Cozmo va a mover su cabeza y entrar en modo de imagen...luego, si presionamos "Enter" (En el terminal) va a tomar una foto y enviarla a nuestra función de procesamiento de OpenCV.

Esta función va a simplemente tomar la imagen, cambiar su tamaño, convertirla a escala de grises, hacer un GaussianBlur para distorcionar la imagen y remover el ruido y reducir el detalle. Luego vamos a aplicar denoising para deshacernos del polvo y el brillo...aplicar un threshold para separar los pixels blancos y negros, y aplicar un par más de distorciones...

Finalmente vamos a llamar a textcleaner para remover aún más ruido y hacer que la imagen sea más clara...

Así que, aquí está la foto original tomada por Cozmo...


Esta es la imagen luego de nuestro post-procesamiento en OpenCV...


Y finalmente, esta es nuestra imagen luego de utilizae textcleaner...

Finalmente, una vez que tenemos la imagen tal como la queremos, podemos llamar al OCR API lo cual es bastante secillo y directo...

Para obtener el API Key, simplemente vamos a  https://api.sap.com/api/ocr_api/overview y nos legeamos...

Una que obtenemos una respuesta del API, podemos hacer una pequeña limpieza con Regular Expressions solo para asegurárnos de que no hay ninguna letra que ha sido incorrectamente identificada...

Finalmente, podemos hacer que Cozmo nos lea el mensaje en voz alta -;) Y solo para propósitos de demostración...


Aquí, tuve la suerte de que la luz y todo lo demás estaban perfectos...así que obtuve una respuesta muy limpia...las pruebas sucesivas fueron bastante malas -:( Pero, nuevamente...es importante tener buena iluminación...

Por supuesto...quieren ver un video del proceso en acción, no? Bueno...aunque suene gracioso...mi primer intento fué perfecto! Aún mejor que este...pero no tome el video -:( Las prubeas sucesivas fueron bastante malas hasta que pude conseguir also razonable...y eso es lo que van a ver...el sol entrándo por la ventana no me ayudo mucho...pero de todos es bastante bueno...


Espero que les haya gustado este blog-:)

Saludos,

Blag.
SAP Labs Network.

Monday, May 21, 2018

The Blagchain



Últimamente, he estado aprendiendo sobre Blockchain y Ethereum. Dos temas bastante interesántes y actuales...pero como dicen...la mejor manera de aprender es haciendo...así que me puse a trabajar en el Blagchain.

Entonces, que es Blagchain? Basicamente, es una pequeña aplicación Blockchain que tomas algunas cosas de Blockchain y otras cosas de Ethereum y fué creado como algo educacional...en el Blagchain puedes obtener un usuario, crear o un producto o comprarlo y todo será almacenado en una estructura en cadena...

Antes de ir a las imagenes...vamos a hablar un poco sobre la tecnología que elegí para este proyecto...

Existen muchas tecnologías disponibles...así que escoger la correcta siempre es complicado...a la mitad del proyecto, puedes darte cuenta de que no...esa no fué la decición más acertada...algún otro lenguaje puede ayudarte a hacer las cosas más rápido y mejor...o quizás aquella característica en especial no está disponible y no lo sabías porque nunca antes la habías necesitado...

Cuando comencé a aprender acerca de Blockchain y Ethereum...sabía que quería escribir Blagchain utilizándo una interface web...así que los primeros lenguages que vinieron a mi mente estaban fueran de la discusión...basicamente porque no tienen interface web o porque sería realmente complicado crear una aplicación web utilizándolos...además, también quería un lenguaje con pocas dependencias  y de instalación y extensión sencillas...quería un lenguaje sencillo pero potente y veloz...y fué así...casi de inmediato sabía cual era el lenguaje que tenía que utilizar...

Crystal es similar a Ruby pero más veloz...y elegante -;) Además...tiene a Kemal, un framework web parecido a Sinatra.

Cuando descubrí Crystal estaba impresionado por lo bien que está diseñado...especialmente porque...aún está en Alpha! Como un lenguaje tan joven puede ser tan bueno? No lo entiendo...pero Crystal es realmente impresionante...

En fín...veamos como trabaja Blagchain...

Por supuesto...no es una dapp...pero eso está bien porque solo vamos a usarlo de manera local...utiliza dos aplicaciones web que funcionan en puertos diferentes...uno trabajando como servidor y el otro trabajando como cliente...


Puedes agregar un nuevo producto...


Pueden ver aquí que tenemos un Genesis Block, un nuevo block porque hemos posteado un producto (Y estan conectados via el Previous Hash) y también puede ver que cada transacción cuesta 0.1 Blagcoin...


Ahora, podemos utilizar otro browser para crear un nuevo usuario...


Como este usuario no creo el producto el/ella...puede comprarlo...y agregar una nueva transacción a la cadena...


El dinero (Blagcoin) va de una cuenta a la otra. La cadena crece y todo queda registrado...


Que pasa cuando no tenemos suficiente Blagcoin para comprar algo?


Bueno...si te gustan este tipo de cosas...aquí están la cantidad de líneas que me tomo hacer la aplicación...

Blagchain.cr (Parte Servidor) --> 129 lineas
BlagchainClient.cr (Parte Cliente) --> 125 lineas
index.ecr (HTML, Bootstrap y JQuery) --> 219 lineas

Así que ni siquiera 500 lineas de código para toda la aplicación...impresionante, no? -;)

Y claro...se que aunque sea quieren ver un poco del código fuente, no? Bueno...por qué no? -:)

BlagchainClient.cr
post "/sellArticle" do |env|
  user = env.params.body["user"]
  article = env.params.body["article"]
  description = env.params.body["description"]
  price = env.params.body["price"]
  amount = (env.session.float("amount") - 0.1).round(2)
  env.session.float("amount", amount)
  HTTP::Client.post("http://localhost:3000/addTransaction", form: "user=" + user + 
                    "&article=" + article + "&description=" + description + "&price=" + price)
  env.session.bool("flag", true)
  env.redirect "/Blagchain"
end

Saludos,

Blag.
SAP Labs Network.

Wednesday, January 17, 2018

Wooden Puzzle - Mi primer juego en Amazon Sumerian

Si leyeron mi post anterior blog Amazon Sumerian - Primeras impresiones sabrán que no iba a parar ahí -;)

He podido jugar bastante con Sumerian y lo más importante...aprender mucho...los tutorials son muy buenos así que deberían leerlos así no tengan acceso a Sumerian aún...

Una cosa que simpre quize hacer...era animar mi modelo de Cozmo...que hice en Blender...


Inténte hacerlo en Blender (con rigging y haciendo la animación pero estaba funcionando de manera extraña puesto que funcionaba bien en Blender pero no en Sumerian...y ahora se porque...pero en su momento me frustré bastante) pero fallé...así que pensé hacerlo en Sumerian utilizándo sus herramientas...

Debo admitirlo...al inicio no funcionó...pero luego seguí explorándo y me di cuenta de que el Timeline era mi amigo...después de muchas pruebas e intentos...logré hacerlo funcionar -;)

Así es como se vé...


Así que vayan a Cozmo y hagan click en el robot para comenzar la animación y luego hagan click otra vez para reiniciar la animación...

Simple pero muy alucinante -:)

Luego de eso...comencé a pensar en hacer algo más...algo más interesánte y esta vez utilizándo algo de programación...la cual es en realidad JavaScript y no NodeJS como pensé en un inicio -:(

En fín...intenté hacer eso una vez en Unity y otra en Flare3D pero no tuve mucha suerte...aunque para ser sinceros...en esas épocas no conocía Blender...así que puse a trabajar en esto...


Diseñé un tablero de Wooden Puzzle utilizándo Blender y luego lo importe a Sumerian y le apliqué un Mesh Collision...de esa manera...la pelota puede avanzar por el tablero y caerse si es que hay un hueco...

Así es como se vé...




Para jugar...simplemente utiliza los cursores del teclado para mover el tablero y guiar a la pelota desde "Start" hasta "Finish". Presionando "r" reiniciamos el juego.

Aquí está el enlace para poder jugarlo "Wooden Puzzle"...

Fué difícil de hacer? No realmente -:) Sumerian es impresionante y bastante potente...encima de todo eso...el equipo de Sumerian es muy bueno y siempre están deseosos y dispuestos a ayudar...

Hasta ahora...mi experiencia con Sumerian no ha sido más que pura alegría y satisfacción...así que ya veo haciendo más y más proyectos...

Por supuesto...Ya estoy trabajándo en un par más -;) Especialmente uno que involucra al Oculus Rift...pero eso de hecho me va a tomar más tiempo....puesto que necesito hacer mucho trabajo con Blender..

Ya has probado Sumerian? Aún no? Por qué no vas y solicitas acceso?

Saludos,

Blag.
Development Culture.

Friday, December 22, 2017

Amazon Sumerian - Primer impresiones

Para aquellos que me conocen y para aquellos que no...como trabajo como Developer Evangelist...mi trabajo principal es aprender, explorar y evangelizar nuevas tecnologías y lenguajes de programación...y por supuesto...AR/VR han estado en mi bandeja desde hace un buen tiempo...

He jugado con Unity3D y Unreal Engine...y por supuesto he desarrollado parael Google Glass, Microsoft HoloLens y Oculus Rift...

Cuando los buenos muchachos de Amazon anunciaron el Amazon Sumerian podrán suponer que estaba totalmente emocionado -:D

Así que ayer, finalmente fuí aceptado dentro del Beta Programa, así que como era de esperárse comencé con un par de tutoriales para poder conocer la herramienta -;)

Por favor tomen en cuenta que recién estoy empezándo...así que no he probado o inténtado de todo...quiero ir paso a paso siguiendo los tutoriales y tratándo de entender todo de la forma más positiva posible...

He mencionado ya que Sumerian funciona en el browser? Qué tan loco es eso? No hay que instalar nada...solo lanzar tu browser y empezar a construir experiencias AR/VR...

Cuando lo lanzas por primera vez, vas a ver la siguiente pantalla...



Donde puedes crear una nueva pantalla o simplemente utilizar una plantilla.

Sumerian provee muchos tutoriales, y hasta el momento solo he seguido los primeros 3...


Así que, así es como se ve mi cuarto de TV...


Como pueden ver...Sumerian es un editor completo y complejo que provee todas las herramientas que puedes encontrar en otros editores...además de muchas más que yo pienso que son completamente nuevas y excitantes...

Por supuesto, puedes echar un vistazo para ver como va tu aplicación...


Con el tutorial del cuarto de TV...la idea es que debajo de la pantalla de televisión, hay un Amazon Echo, así que puedes hacerle click para cambiar los vidos que son presentados en la pantalla. Para esto necesitas utilizar un State Machine y también crear un script que va a controlar los diferentes videos. Para la parte de scripting debemos utilizar NodeJS...lo cual es muy bueno puesto que es el lenguage que uso principalmente cuando tengo que desarrollar aplicaciones para Alexa...



Así es como se ve mi cuarto de TV cuando está mostrándo un video en Render Mode -:)


Antes de seguir aprendiendo Sumerian...debo decir que el sistema de navegación no parece ser muy bueno aún...puedes utilizar los botones del mouse, Tab y Shift...pero las direccionales del cursor o AWSD no parecen funcionar como se esperaría en Unity3D o Unreal Engine...les he enviado esta pregunta al equipo de Sumerian Team en Slack...Así que voy a actualizar este post apenas tenga una respuesta -:)

*UPDATE* Siguiendo con el tutorial de "Lights and Camera" descubrí que mientras que la camara por defecto no permite una navegación fina...el FlyCam si lo hace! -:D Todo bien en el vecindario -;)

Hasta la próxima,

Blag.
Development Culture.

Tuesday, May 02, 2017

Blender Arte en Lego para el HoloLens

Este blog fue posteado originalmente en Blender Lego Art for HoloLens.


A quién no le gustan los Legos? Y si han usado Blender antes…a quién no le gusta Blender? -:)

Combinar ambos parecía una excelente idea, así que es fué lo que hice…Utilizándo Blender cree unas simples piezas de Lego que pueden ser utilizadas para construir modelos simples y complejos.


Una piece simple mide 0.25 por 0.25 y esta hecha con un simple vertice. En la imagen, los colores se usan simplemente para demostrar que las piezas son distintas.

El punto principal es simplemente crear un nuevo archivo en Blender, agregar las diferentes piezas y comenzas a construir.

Al inicio es un poco complicado puesto que tienes que tratar con coordenadasX, Y y Z…pero una vez que te acostumbras…se vuelve un poco adictivo -:)


Ahora, el nombre del blog es Arte en Lego, no? Entonces…si en vez de eso buscas en internet Pixel Art, vas a encontrar muchas imágenes interesántes…como esta…


El candidato perfecto para ser construído en Lego! Poniendo las piesas en orden y simplemente asignándoles el material correcto…podemos obtener esto…


Y con un poco más de tiempo y dedicación…podemos hacer esto…



En fín…con una colección de modelos…podemos pensar un poco y utilizárlos en una aplicación para el Microsoft HoloLens -;)

La aplicación en si es bastante sencilla…comienzas viendo a los modelos en una repisa…puedes seleccionar uno, hacerlo más pequeño, grande, girárlo a la derecha o izquiera o simplemente regresar a la vista de la repisa.

Aquí hay un video para que vea más o menos de que se trata.



Saludos,

Blag.
Development Culture.