Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Raúl

#1
General (Antiguo) / Duda con los Co-Rutinas
Julio 04, 2018, 01:00:15 PM
ya le puse un mail, a ver que me dice
#2
General (Antiguo) / Duda con los Co-Rutinas
Julio 04, 2018, 08:06:51 AM
Cita de: hammer date=1530623804Mmmhh con un plugin thirdParty por medio la cosa se oscurece ya que no sabes bien bien que esta haciendo y hay cosas que no sepueden hacer fuera del main thread.
   
   
      Pero me extrañaria que la api del plugin no trajera un metodo para hacer una carga Async,como lo que ha puesto Igor de unity para assets pero propia de la api para los modelos.
   
   
      Lo normal seria que la api tenga algun metodo LoadAsync/ImportAsync y algun callback onLoaded,onFinish,onFailed que te lance un metodo subscrito cuando acabe.
   
   
      Mira en la doc de la api si hay algo parecido, o dejanos el link de la doc haber si lo vemos.
   
   
      :)
   


Haberla la hay el problema es que no funciona en HoloLens, en el editor de unity va perfecto pero cuando lo  meto en el dispositivo no funciona  :/
 
dejo enlace de la doc por si alguno ve algo que yo me he pasado https://ricardoreis.net/trilib/manual/html/index.html
#3
General (Antiguo) / Duda con los Co-Rutinas
Julio 03, 2018, 01:33:41 PM
Lo primero, gracias a los dos por las respuestas
 
Lo que cargo en la escena son objetos3d (.fbx) que descargo y posteriormente cargo en la escena en tiempo de ejecución, utilizo una librería de la assetStore llamada Trilib para ayudarme con este proceso ya que solo no conseguí hacerlo ( Trabajo con HoloLens esto hace que la mayoria de metodos "tradicionales" no me funcionen).
 
Al hacerlo en tiempo de ejecución no conseguí que el Resources.Load me funcionara.. asi que no se que mas probar..
 
He probado a crear un thread para la ejecucion
 

Thread saveThread = new Thread(o =>
        {
//Aquí puse la llamada a la libreria que se encarga de cargar los objetos
        });
        saveThread.Start();

 
Sin embargo me dice que esa llamada debe estar en el Thread principal.
#4
General (Antiguo) / Duda con los Co-Rutinas
Julio 03, 2018, 12:03:12 PM
Buenos días!
 
Estoy desarrollando una aplicación que descarga de un servidor modelos 3D para luego cargarlos en la escena. Para la parte de la descarga he conseguido hacerlo de manera "asincrona".
 
Sin embargo, a la hora de cargar los objetos pese a meter toda la ejecución de la carga de objetos dentro de una co-rutina tanto en el editor como en el dispositivo, la ejecución del programa se "detiene" 3 o 4 segundos hasta que la carga finaliza. Hay alguna forma de evitar esos 3,4 segundos?
 

private void addModel(string path, StepContent model)
    {
            StartCoroutine(LoadObjets(path, model));
}
IEnumerator LoadObjets(string path, StepContent model)
    {
   // Aqui va todo el codigo de la carga.
        yield return null;
    }

 
 
 
Un saludo y Gracias!
#5
General (Antiguo) / Girar un objeto via Script
Abril 25, 2018, 12:19:02 PM
Cita de: lightbug date=1524577613exactamente eso suele pasar, aunque me sorprendió el resultado con los 100's, pensé que ibas a tener problemas con los > 180's , también puede ser que sea por la forma en la que guardas esos ángulos, por ej si usas Vector3.Angle esto no determina el signo y es posible aparecer del otro lado (sin diferencia entre +82 y -80),
   
   
      como es que guardas esos xx , yy , zz ? (pregunto ahora porque creo que no lo hacés como al comienzo del hilo). Si estás en un punto donde ya no sabés bien que pasa subí algunas imágenes, más código, todo el código que puedas, no se cualquier cosa que ayude a encontrar el inconveniente.
   
   
      En mi caso uso el "Rotate" pero no para setear una rotacion (Ej cargar una rotación al cargar el juego) sino para realizar pequeñas rotaciones (Ej mirar con la cámara al mover el mouse). Supongo que el problema que estás teniendo es el que no te cierra por qué los valores esos dan lo que dan, pero si directamente guardas rotation de un obj1 (quaternionGuardado = obj1.rotation) y en cualquier momento se la aplicás a un obj2 (obj2.rotation = quaternionGuardado) no deberías tener ningun problema.
   
   
      saludos
   


Al final he conseguido arreglarlo el encargado de hacer el back-end de la aplicacion puede mandarme la rotacion en quaternions en vez de en grados con lo cual yo solo he tenido que crear el quaternion con esos valores que recojo y listo jajaj
#6
General (Antiguo) / Girar un objeto via Script
Abril 24, 2018, 09:44:55 AM
Cita de: lightbug date=1524487379lo que te dijeron arriba, es ilegal hacer eso que estás haciendo quaternion "gira" (cuac) alrededor de orientaciones, no existen multiples quaternions para una misma orientación, en cambion vas a poder lograr infinitos eulerAngles (seguramente lo que estás tratando de lograr) para el mismo resultado (ej : + 45°, -315°, 405°, etc ).
   
   
      Si vas a rotar usá las funciones de los quaternions en vez de asignar rotaciones, el caballito de batalla es transform.Rotate como te dice @Igor , si querés hacer cosas específicas tenés alguna que otra mas.
   
   
      y sino tirá directamente los eulerAngles, no soy un fan de estos pero bueno...
   
   
      y eso seguramente pase porque estás igualando un quaternion (4 componentes, involucra senos y cosenos que nadie entiende) a unos eulerAngles (tres componentes),  xx , yy y zz deberían ser ángulos para que funcione, es decir que deberías almacenar en tu array no rotation sino eulerANgles.
   
   
      saludos
   


Gracias por la respuesta, he seguido haciendo pruebas..
 
utilizando el transfor.Rotate
 

gameObjectActual.transform.Rotate(xx, yy, zz);

 
en la escena tengo 3 objetos: objeto 1 cuyos angulos son (30,10,20) utilizando la linea de código de arriba funciona bien y se gira correctamente
 
el objeto 2 tiene de angulos (-30,-10,-20) al igual que el primero se gira correctamente
 
sin embargo el objeto 3 que tiene de angulos( -120,-110,-100) no gira bien de los valores que tenia en origen me pasa a (-60,70,80)
 
no entiendo por que.. esta claro que algo me esta pasando con los angulos que pasan de 90º pero nose el que :(
 
Gracias a todos por la ayuda
#7
General (Antiguo) / Girar un objeto via Script
Abril 23, 2018, 01:58:01 PM
Cita de: francoe1 date=1524479541El problema es que no estas entendiendo como funcionan las rotaciones.
   
   
      https://docs.unity3d.com/es/current/Manual/QuaternionAndEulerRotationsInUnity.html
   
   
      https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation
   


a esa conclusion ya había llegado, gracias
#8
General (Antiguo) / Girar un objeto via Script
Abril 23, 2018, 12:24:07 PM
Cita de: Igor date=1524477904la rotacion en Quaternion no es los clasicos angulos en X, Y, y Z....
   
   
      para girarlo con respecto a los "angulos de toda la vida" deverias usar:
   
   

transform.eulerAngles = new Vector3 (xx, yy, zz);
 
o sino
transform.rotation = new Quaternion();
transaform.Rotate(xx, yy, zz);

   
      para transform.rotate() igual devereias "resetear" la rotacion antes de girarlo.... porque es acumulativo, es decir, gira desde el angulo en que se encuentre....  
   
   
      transform.Rotate(0, 20, 0) girara el objeto 20 grados a la derecha partiendo del angulo en que se encuentre....
   
   
      eulerAngles serian los angulos en que se encuentra...  
   
   
      transform.eulerAngles = new Vector3(0, 20, 0)  esto colocara el objeto en el angulo indicado, es decir, se colocara el eje X a cero grados, el Y a 20, y el Z a cero....
   
   
      espero que te haya servido...
   


he probado las 2 opciones  que me has dicho y en ambas me pasa igual, me modifica los valores pero a unos que no son los que yo le paso
 
he probado a hacerlo "por partes" primero añado xx e yy quedando el vector (xx,yy,0) y si que se meten los valores bien pero en cuanto añado la z (xx,yy,zz) se estropean todos los valores :S
#9
General (Antiguo) / Girar un objeto via Script
Abril 23, 2018, 11:49:58 AM
Buenos dias,
 
estoy trabajando en una aplicación en la que descargo los componentes transform de un gameObject  e intento aplicarselos durante la ejecución, para aplicar la posición no he tenido ningun problema pero para aplicar la rotacion no he sido capaz, el objeto gira pero no con los valores que yo le paso he probado varias formas y ninguna funciona, adjunto la parte del codigo donde lo intento hacer
 

Quaternion rota = new Quaternion(); // defino un quaternion
 xx = siho.rotationX; // los valores los tengo almacenados en un array por eso hago esa asignación
 rota.x = xx;
 yy = siho.rotationY;
 rota.y = yy;
 zz = siho.rotationZ;
 rota.z = zz;
gameObjectActual.transform.rotation= rota;

 
He comprobado los valores de las variables xx,yy,zz y si que contienen los valores que yo busco pero a la hora de girar el objeto aparecen otros valores :(
 
Un saludo y gracias de antemano!
#10
Cita de: Braltor date=1521493321estas tratando de guardarlo en la carpeta de streaming assets pero solo en el editor tienes permiso, en los players esta carpeta es solo de lectura, asi q debes guardarlo en otra carpeta como la de persistent data path: https://docs.unity3d.com/ScriptReference/Application-persistentDataPath.html
   


bien, estoy probando a guardar en el persistentDataPath, el problema ahora me viene con vuforia ya que por defecto solo leee las bases de datos que se hayan guardado en el path de streamming assets, he mirado en la documentacion DocVuforia 
 
y hay otro metodo para guardar donde puedes definir el path sin embargo no me esta funcionando de momento, esta es la linea que estoy colocando
 

if (dataSet.Load(Application.persistentDataPath+"/150", VuforiaUnity.StorageType.STORAGE_ABSOLUTE)){
....
}

 
Gracias!
 
 
 
EDITO: ya esta, ya consegui que funcionara habia que añadir.XML al nombre
 
Muchas gracias Braltor!!
#11
Cita de: Braltor date=1521209047parece q no estas esperando q los archivos se descarguen y guarden, en vez de eso tienes un tiempo fijo de espera de 5 segundos... tienes q hacer la llamada al metodo de vuforia cuando ya estan listos, como son dos archivos puedes combinar las cargas en una sola corutina o usar una logica para determinar cuando ambos fueron descargados
   


He probado utilizando el www.isDone de esta manera
 

IEnumerator GetDAT()
    {
        WWW www = new WWW(url);
        while (i == 0)
        {
            if (www.isDone)
            {
               
                yield return www;
                System.IO.File.WriteAllBytes(Application.streamingAssetsPath + "/Vuforia/150.dat", www.bytes);
                lod.DatListo();//esto lo utilizo para avisar a la otra script de que ya esta descargada esta parte.
                i = 1;
                pelo.aVerde(); // y para yo poder ver en las gafas que se ha completado la descargar cambio el color de una pelota que puse a verde
               
            }
        }
       
    }

 
Teoricamente en la escena ahora mismo hay 2 pelotas y 1 cubo, cuando las pelotas se ponen verdes quiere decir que ya esta descargada la base de datos y entonces mediante un click(en el cubo) , inicio los metodos de vuforia. El problema que me estoy encontrando es que nunca se ponen verdes (ejecutando en las gafas, en el editor de unity si funciona)
 
Gracias por al respuesta!!
 
He utilizado el debugger de visual studio para ver que error me daba durante la ejecución y he visto que es problema de acceso a la ruta donde esta guardada la base de datos (adjunto imagen) lo que nose es como otorgar los permisos para poder acceder
 
#12
Buenos días a todos!
 
Os pongo en situación, estoy haciendo una aplicación para HoloLens en la que uso el reconocimiento de imagenes que proporciona Vuforia y la verdad esque funciona bastante bien(siempre y cuando añada la base de datos en unity). Ahora quiero ir un paso mas y poder descargar la base de datos durante la ejecución en las gafas.
 
Una base de datos de Vuforia consiste un dos archivos un tipo dat y un xml que deben colocarse en la ruta /../StreamingAssets/Vuforia/.
 
He creado un empty GameObject en la escene y la he agregado las siguientes scripts
 
LoadXML.cs en la que descargo y guardo la parte del XML
 

public class LoadXML : MonoBehaviour {
 
    public string url = @"AQUI PONGO LA URL DE MI SERVIDOR";
    public string XML;
    public LoaderDataSet lod;
 
    // Use this for initialization
    void Start () {
        StartCoroutine(GetXML());
    }
 
    // Update is called once per frame
    void Update () {
   
}
    IEnumerator GetXML()
    {
        WWW www = new WWW(url);
        yield return www;
        //  var XML = www.text;
        System.IO.File.WriteAllBytes(Application.streamingAssetsPath + "/Vuforia/150.xml", www.bytes);
       
    }
}

 
LoadDat.cs en la que descargo y guardo el DAT
 

public class LoadDat : MonoBehaviour {
 
    public string url = @"AQUI VA LA URl";
    public string dat;
    // Use this for initialization
    void Start () {
        StartCoroutine(GetDAT());
    }

// Update is called once per frame
void Update () {
   
}
    void Awake()
    {
       
    }
    IEnumerator GetDAT()
    {
        WWW www = new WWW(url);
        yield return www;
        System.IO.File.WriteAllBytes(Application.streamingAssetsPath + "/Vuforia/150.dat", www.bytes);
    }
}

 
y finalmente la tercera script LoaderDataSet.cs en la que creo el objecto donde va a ir el reconocimiento le añado todos los componentes necesarios
 

public class LoaderDataSet : MonoBehaviour {
 
    public GameObject augmentationObject = null;  // you can use teapot or other object
    public string dataSetName = "";
    ObjectTracker objectTracker;
    DataSet dataSet;
    int cont = 0;
    public GameObject cosa;
    // Use this for initialization
    void Start () {
        StartCoroutine(ExecuteAfterTime(5));
}

// Update is called once per frame
void Update () {
       
   
}
    public void empezar()
    {
        VuforiaARController.Instance.RegisterVuforiaStartedCallback(LoadDataSet);  
    }
    IEnumerator ExecuteAfterTime(float time)
    {
        yield return new WaitForSeconds(time);
        // Code to execute after the delay
        empezar();
    }
    void LoadDataSet()
    {
        objectTracker = TrackerManager.Instance.GetTracker<ObjectTracker>();
        dataSet = objectTracker.CreateDataSet();
       
//AQUI ES donde creo que falla
        if (dataSet.Load(dataSetName))
        {
            objectTracker.Stop();  // stop tracker so that we can add new dataset
            if (!objectTracker.ActivateDataSet(dataSet))
            {
                // Note: ImageTracker cannot have more than 100 total targets activated
                Debug.Log("<color=yellow>Failed to Activate DataSet: " + dataSetName + "</color>");
            }
            if (!objectTracker.Start())
            {
                Debug.Log("<color=yellow>Tracker Failed to Start.</color>");
            }
            int counter = 0;
            IEnumerable<TrackableBehaviour> tbs = TrackerManager.Instance.GetStateManager().GetTrackableBehaviours();
            foreach (TrackableBehaviour tb in tbs)
            {
                print("1");
                if (tb.name == "New Game Object")
                {
                    // change generic name to include trackable name
                    tb.gameObject.name = ++counter + ":DynamicImageTarget-" + tb.TrackableName;
                    // add additional script components for trackable
                    tb.gameObject.AddComponent<DefaultTrackableEventHandler>();
                    tb.gameObject.AddComponent<TurnOffBehaviour>();
                    if (augmentationObject != null)
                    {
                        // instantiate augmentation object and parent to trackable
                        GameObject augmentation = (GameObject)GameObject.Instantiate(augmentationObject);
                        augmentation.transform.parent = tb.gameObject.transform;
                        augmentation.transform.localPosition = new Vector3(0f, 0f, 0f);
                        augmentation.transform.localRotation = Quaternion.identity;
                        augmentation.transform.localScale = new Vector3(1f, 1f, 1f);
                        augmentation.gameObject.SetActive(true);
                    }
                    else
                    {
                        Debug.Log("<color=yellow>Warning: No augmentation object specified for: " + tb.TrackableName + "</color>");
                    }
                }
            }
        }
        else
        {
            Debug.LogError("<color=yellow>Failed to load dataset: '" + dataSetName + "'</color>");
        }
    }
}

 
En el editor de unity todo funciona correctamente pero en las gafas no, por lo que he podido entender las carpetas que tengo antes de compilar y que tengo despues son diferentes entonces no se de que manera guardar los archivos.
 
Alguna idea?
 
Muchas gracias de antemano!
#13
Solucionado, tenia en una carpeta perdida por ahi una Script de nombre photo capture y por eso no me estaba cogiendo la definicion de la libreria jajja
#14
Buenos días,
 
Estoy desarrollando una aplicación para HoloLens y una de las funcionalidades que debe ofrecer es la de poder sacar una foto y mostrarla en un gameObject, para ello he visto que en la doc de Unity hay un ejemplo de como se hace(https://docs.unity3d.com/2017.2/Documentation/ScriptReference/XR.WSA.WebCam.PhotoCapture.html) me he dispuesto a probarlo para ver como funcionaba y tal.
 
Me he encontrado con el siguiente error en varias partes del codigo PhotoCapture no contiene una definición para ... (falla en varios sitios, CreateAsync, SupportedResolution, etc.)
 
Llevo un par de horas buscando una solucion y no veo a nadie que le haya pasado lo mismo, alguna idea?
 
Un saludo y gracias!!
 
 
 
PD: estoy usando la version de unity 2017.2.0f3
#15
General (Antiguo) / Problema girando un objeto
Diciembre 15, 2017, 11:50:17 AM
Gracias tio ya esta, llevaba 3 hrs atascado en eso pff...