Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: Gonzalo Marchese en Mayo 10, 2017, 06:38:38 PM

Título: Generar reporte en PDF
Publicado por: Gonzalo Marchese en Mayo 10, 2017, 06:38:38 PM
Estimados,
 
Primero buenos días! No se si este es el foro indicado para publicar esto, pero aun no me habilitan el resto.
 
Mi problema es el siguiente, estamos desarrollando un juego de disparos, en Unity3d, en el cual se pueden generar reportes en Pdf de los tiros que hemos hecho.
 
Mediante el siguiente código saco las medidas y posición de la Diana de tiro en pantalla:
 

public float[] getPositionObject(GameObject gameObject, Camera camera)
{
   float depth = gameObject.transform.lossyScale.z;
   float width = gameObject.transform.lossyScale.x;
   float height = gameObject.transform.lossyScale.y;
   Vector3 gpSize = gameObject.GetComponent<Renderer> ().bounds.size;
   float[] posiciones = new float[4];
   Vector3 lowerLeftPoint = camera.WorldToScreenPoint( new Vector3( gameObject.transform.position.x - (gpSize.x / 2), gameObject.transform.position.y - (gpSize.y / 2), gameObject.transform.position.z - (gpSize.z / 2)) );
   Vector3 upperRightPoint = camera.WorldToScreenPoint( new Vector3( gameObject.transform.position.x + (gpSize.x / 2), gameObject.transform.position.y + (gpSize.y / 2), gameObject.transform.position.z - (gpSize.z / 2) ) );
   Vector3 upperLeftPoint = camera.WorldToScreenPoint( new Vector3( gameObject.transform.position.x - (gpSize.x / 2), gameObject.transform.position.y + (gpSize.y / 2), gameObject.transform.position.z - (gpSize.z / 2) ) );
   Vector3 lowerRightPoint = camera.WorldToScreenPoint( new Vector3( gameObject.transform.position.x + (gpSize.x / 2), gameObject.transform.position.y - (gpSize.y / 2), gameObject.transform.position.z - (gpSize.z / 2) ) );
   float xPixelDistance = Mathf.Abs( lowerLeftPoint.x - upperRightPoint.x );
   float yPixelDistance = Mathf.Abs ( lowerLeftPoint.y - upperRightPoint.y );
   posiciones [] = xPixelDistance;
   posiciones [1] = yPixelDistance;
   posiciones [2] = lowerLeftPoint.x;
   posiciones [3] = lowerLeftPoint.y;
 
   Debug.Log( "This is the X pixel distance: " + xPixelDistance + " This is the Y pixel distance: " + yPixelDistance );
   Debug.Log("This is the lower left pixel point: " + lowerLeftPoint);
   Debug.Log(" This is the upper left point: " + upperLeftPoint );
   Debug.Log("This is the lower right pixel point: " + lowerRightPoint);
   Debug.Log(" This is the upper right pixel point: " + upperRightPoint);
   return posiciones;
}

 
Luego esta información mas la ubicación del disparo las envió a una DLL para hacer la hacer el PDF con ItextSharp, acá escalo la imagen y dibujo los disparos sobre ella:
 
 
 

int cantDisparos = ;
                for (int z = ; z < player.shoots.Count; z++)
                {
                        g.DrawImage(mrkImg, (
                            diaparo.x - posiciones[2]) * (500 / posiciones[]),
                            (Constants.UNITY_SCREEN - disparo.y - posiciones[3]) * (500 / posiciones[1]));
                }

 
En donde disparo es la posición en en x,y del mismo, posiciones es el array cargado con los datos de la Diana, UNITY_SCREEN es una constante con valor en 1080.
 
player.shoots[z].x - posiciones[2]) * (500 / posiciones[0]):  acá escalo el disparo dentro de una imagen de 500px
 
(Constants.UNITY_SCREEN - player.shoots[z].y - posiciones[3]) * (500 / posiciones[1])): En el eje Y ademas de escalar la imagen a 500px, debo cambiar el (0,0), en unity es abajo a la izquierda y en Win es arriba a la izquierda.
 
 
 
Todo esto funciona perfectamente, salvo por un desfasaje  en los puntos. Están desplazados sobre el eje y un poco hacia abajo. Entiendo que el problema puede venir desde Unity cuando calculo la ubicacion del Objeto, ya que el mismo esta en 3D, nose como juega el eje Z en este caso. 
 
Les adjunto una imagen de como salen ahora los disparos y donde deberían salir. (los círculos rojos son donde debería estar el disparo)
 
(http://i64.tinypic.com/2wcjtps.jpg)
 
Espero se entienda y puedan ayudarme. 
 
Desde ya muchas gracias!!!
Título: Generar reporte en PDF
Publicado por: TheBullet en Mayo 11, 2017, 08:34:27 AM
Uff, ni idea. Solo se me ocurre que la imagen de la diana tenga algún tipo de margen o algo así... Lo que yo haría para no liarme mucho, es sumarle la diferencia manualmente cuando calculas la posición del disparo.
Título: Generar reporte en PDF
Publicado por: Gonzalo Marchese en Mayo 12, 2017, 02:20:16 PM
Estimados,
 
Al final lo pude solucionar quitando el elemento z del objeto Cubo, es decir lo deje con un z prácticamente a cero. Ademas también tuve que correr el impacto de la bala poniendo el (0,0) en el centro de la bala, ya que desde la librería de itexsharp toma el (0,0) en el borde superior derecho.
 
Habiendo realizado esos cambios el reporte quedo perfecto!
 
Saludos!!
Título: Generar reporte en PDF
Publicado por: pioj en Mayo 12, 2017, 03:08:13 PM
¿Fue una solución sólo a tu problema, o es algo que creas que puede ser extrapolado a otras situaciones? Si es así, agradeceríamos que lo compartieras con la Comunidad.
Título: Generar reporte en PDF
Publicado por: Gonzalo Marchese en Mayo 12, 2017, 03:44:40 PM
Hola pioj,
 
Le puede servir a alguien que quiera generar reportes en PDF pasando un objeto 3D a una imagen 2D. Deberán tener en cuenta la componente z. MI solución fue anular esa componente llevándola prácticamente a cero. Pero debería haber otra solución haciendo cálculos entre los vectores que intervienen entre el objeto Diana y el disparo, pero esto ya es mas complejo, por suerte lo solucione de la otra forma.
 
Saludos!!