XSIforum.com

Importar Point Cloud

0 Usuarios y 1 Visitante están viendo este tema.

Unaided

  • ***
  • 3293
Importar Point Cloud
« en: 06 Noviembre 2013, 14:21:36 »
No encuentro la manera, o formato mejor dicho, de importar una nube de puntos en XSI.

Es un laserscan el cual puedo exportar a .pts, .xyz, .dxf y .wrl. Con el Deep Exploration puedo abrir tanto el .pts como el .dxf. Exportando a .obj y .dae, desde el propio deep visualiza el contenido de solo vertices, pero los importadores de Softimage de sendos formatos ¿no soportan vertices aislados?

Alguien conoces alguna manera, plugin, conversor,... para poder importar una nube de puntos en Softimage?

Por la via ICE y a través de un Read Cache he probado también, escogiendo la opción "custom" pero me faltaría un plugin que lea .xyz

Re:Importar Point Cloud
« Respuesta #1 en: 06 Noviembre 2013, 15:47:42 »
Hace no mucho alguien preguntó algo similar en si-community :)
http://www.si-community.com/community/viewtopic.php?p=37177#p37177

Unaided

  • ***
  • 3293
Re:Importar Point Cloud
« Respuesta #2 en: 06 Noviembre 2013, 17:11:17 »
Gracias por responder César. 

El código del ejemplo que pones en ese hilo me devuelve un error en el 'import icecache'.

Por otro lado, siguiendo esta discusión, ( https://groups.google.com/forum/m/#!topic/xsi_list/00UpQLeb5Ho ) he probado el importador de .xyz escrito por Dan Yargici, pero me devuelve un "no valid xyz points", como a otro reply de esa mail.list
                             
También he probado con su importador, de .ply, pero este no importa nada y ni arroja ningún error.
                                     
El .ply lo he convertido desde el .xyz en Meshlab y el importador .ply para Max de guruware si que ha importado la nube de puntos.

Me queda por probar el recurso que menciona otro de renombrar el .xyz a .asc y según dice Meshlab lo abre como polys separados, lo exporta en obj y dentro de xsi genera un pointcloud con en el que coge las posiciones de puntos de esos polys.


« Última modificación: 06 Noviembre 2013, 17:19:28 por Unaided »

Re:Importar Point Cloud
« Respuesta #3 en: 06 Noviembre 2013, 23:05:10 »
Probablemente ya lo tengas solucionado, pero si aún lo necesitas prueba descomprimir el contenido del zip (ambos en el mismo directorio) y arrastra el fichero .xyz sobre xyz2icecache.py (asumiendo que usas windows y tienes python instalado)... o bien escribe en una consola: python xyz2icecache.py ruta_a_fichero.xyz
Si todo sale bien el el script debería generar un fichero .icecache que puedes utilizar/leer sobre una pointcloud de softimage.


La 'magia' se encuentra en el módulo icecache.py de Bradley Gabe que permite generar ficheros .icecache sin tener que lidiar con bytes/chunks y/o conceptos 'de bajo nivel', todo el crédito es para él :D
Un saludo

Unaided

  • ***
  • 3293
Re:Importar Point Cloud
« Respuesta #4 en: 07 Noviembre 2013, 10:22:16 »
No lo he solucionado aun, no.
He encontrado un posible camino con el script para importar .xyz de Dan Yargici. Ayer estaba saturado y no vi que el formato de mi .xyz no coincide con el que él especifica en su script.

Su código busca los valores de X, Y, Z separados por una coma y espacio
Código: [Seleccionar]
647680.01, 508967.136, 185.622
647680.099, 508967.133, 185.609
647680.124, 508953.779, 184.757

Mis .xyz tienen este formato;
Con coordenadas globales, los valores XYZ de los puntos y valores RGB, separados por espacios sin comas:
Código: [Seleccionar]
2100 678 -14.84960000 5.43150000 65.64170000 114 114 114
2101 677 -14.85700000 5.43010000 65.63480000 147 147 147
2101 678 -14.85000000 5.43000000 65.63480000 135 135 135

Con coordenadas locales, los valores XYZ de los puntos y valores RGB, separados por espacios sin comas:
Código: [Seleccionar]
-14.84960000 5.43150000 65.64170000 114 114 114
-14.85700000 5.43010000 65.63480000 147 147 147
-14.85000000 5.43000000 65.63480000 135 135 135

Estoy mirandome su script, creo que es esta la sentencia que busca los valores de puntos
Código: [Seleccionar]
# Massive regular expression retrieves all vaid point data from the file
pointsList = re.findall(r"(-*\d+\.\d+|-*\d+\.\d+[Ee]-\d+)\,\s+(-*\d+\.\d+|-*\d+\.\d+[Ee]-\d+)\,\s+(-*\d+\.\d+|-*\d+\.\d+[Ee]-\d+)", dataStr)

Estoy intenando añadir a esa expresión para que busque también las 3 últimas columnas de enteros correspondientes al RGB, y que no busque comas.

Otra opción sería hacer un replace a todos los .xyz que tendré para que elimine comas y las tres últimas columnas.

Unaided

  • ***
  • 3293
Re:Importar Point Cloud
« Respuesta #5 en: 07 Noviembre 2013, 11:26:21 »
Ya he conseguido adaptar esa sentencia al formato de mis .xyz.
Código: [Seleccionar]
# Massive regular expression retrieves all vaid point data from the file
pointsList = re.findall(r"(-*\d+\.\d+|-*\d+\.\d+[Ee]-\d+)\s+(-*\d+\.\d+|-*\d+\.\d+[Ee]-\d+)\s+(-*\d+\.\d+|-*\d+\.\d+[Ee]-\d+)\s+(\d+\d+\d)\s+(\d+\d+\d)\s+(\d+\d+\d)", dataStr)

Justo he seguido leyendo el hilo y veo que había otra actualización de su script para abrir .xyz con color, pero me devuelve un error en un valor :(
Código: [Seleccionar]
# ValueError: invalid literal for float(): -0.28970000 0.59270000 0.47560000 114 114 114

Veo en ese nuevo script que ahora en lugar de buscar por una regex, busca con un dataStr.splitlines().

Re:Importar Point Cloud
« Respuesta #6 en: 07 Noviembre 2013, 14:39:23 »
Hey Unaided,

Pues ni idea del script de Dan pero para la estructura que mencionas podrías extraer los valores asi, a ver si te vale :)
Código: [Seleccionar]
import re


def extract(data):
    pos, col = list(), list()
    expr = r"(-?[\d\.]+)\s+(-?[\d\.]+)\s+(-?[\d\.]+)\s+(\d+)\s+(\d+)\s+(\d+)\n?"
    for val in re.findall(expr, data):
        pos.append([float(x) for x in val[:3]])
        col.append([int(x) for x in val[3:]])
    return pos, col


sample = """
-14.84960000 5.43150000 65.64170000 114 114 114
-14.85700000 5.43010000 65.63480000 147 147 147
-14.85000000 5.43000000 65.63480000 135 135 135
"""
positions, colors = extract(sample)
print positions
# [[-14.8496, 5.4315, 65.6417], [-14.857, 5.4301, 65.6348], [-14.85, 5.43, 65.6348]]
print colors
# [[114, 114, 114], [147, 147, 147], [135, 135, 135]]