Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

¿Como puedo obtener el tamaño exacto de una esfera o cubo?

Iniciado por ftejada, Noviembre 05, 2018, 06:36:54 PM

Tema anterior - Siguiente tema
Cita de: ftejada date=1542005369 
   
   
      ¿Existe alguna manera de poder modificar el mesh.bounds.size de una malla para que cambie su tamaño en vez de andar tocando la escala de su transform?
   
   
       
   


si, tal como has puesto:
 

mesh.bounds = new Bounds(vector3 center, vector3 half_Extend);
le das el centro y la distancia a cada lado (la mitad del ancho, alto y largo.... como si fuese radio.... pero de un cubo...)

 
 

Cita de: Igor date=1542021346si, tal como has puesto:
   
   

mesh.bounds = new Bounds(vector3 center, vector3 half_Extend);
le das el centro y la distancia a cada lado (la mitad del ancho, alto y largo.... como si fuese radio.... pero de un cubo...)

   
       
   


@Igor He probado a hacer lo que dices pero la malla no cambia de tamaño, al menos visiblemente en la pantalla:
 

   Vector3 size = meshTarget.bounds.size;      
Vector3 nSize;
        nSize.x = Target.transform.lossyScale.x * size.x;
        nSize.y = Target.transform.lossyScale.y * size.y;
        nSize.z = Target.transform.lossyScale.z * size.z;
        mesh.bounds = new Bounds(mesh.bounds.center, nSize / 2);

 
Supongo que no estaré utilizandolo bien... 
 
 
 
Saludos

los Bounds son una caja (cubo) imaginaria que envuelve el objeto... aumentar su tamaño no afectara al mesh....
 
para cambiar el tamaño del mesh usa:
 

transform.localScale = new Vector3(sizeX, sizeY, sizeZ);

 
 o tambien puedes alterar el mesh... con un bucle "for" que recorra los vertices...
 

void Start() {
  float scale = 1.5f;//por ejemplo
  Mesh mesh = GetComponent<MeshFilter>().mesh;
  Vector3[vert] = mesh.vertices;
  for (int i=0; i<mesh.vert.Length; i++){
     vert[i] *= scale;
  }
  mesh.vertices = vert;
  GetComponent<MeshFilter>().mesh = mesh;
}

 
 
 
pero lo que pasa es que no comprendo que quieres hacer exactamente....
 
...voy a volver a releer el post a ver si me he perdido algo...

Noviembre 12, 2018, 11:24:48 PM #18 Ultima modificación: Noviembre 12, 2018, 11:30:42 PM por J Montes
Cita de: ftejada date=1542005369También lo he estado probando con esferas y parece ir perfecto también aunque la esferaTarget tenga escalas diferentes en cada eje X, Y, Z... Es cierto que he notado que la escala no es totalmente exacta, pero es más que suficiente para lo que necesito, ya que la perdida de precisión es como de 0.000001 o algo asi... supongo que es a esto a lo que te referias con si no dimelo pq con las prubas que he hecho parece bastante preciso y no representaría un problema para mi:
   


No he entendido bien en qué casos tienes esferas modeladas con diferentes escalas X, Y y Z, pero si te funciona... vale :).  
 
Cita de: ftejada date=1542005369

Vector3 sizeBoundsTarget = targetMeshBound.bounds.size;
Vector3 nSize;
nSize.x = Target.transform.lossyScale.x * size.x;
nSize.y = Target.transform.lossyScale.y * size.y;
nSize.z = Target.transform.lossyScale.z * size.z;

   
       
   


Una nota: multiplicar un vector(x, y, z) por otro (a, b ,c) para obtener (x * a, y * b, z * c) es una operación común entre vectores (y siempre hay que pensar que en el tema vectores y matrices está todo inventado). Vector3.scale multiplica dos Vector3 componente a componente. Ese fragmento queda más compacto y legible así:
 

Vector3 nSize = Vector3.scale(targetMeshBound.bounds.size, size);




   
      ¿Existe alguna manera de poder modificar el mesh.bounds.size de una malla para que cambie su tamaño en vez de andar tocando la escala de su transform?
   

[/quote]
 
Si lo que quieres es que cambie de tamaño, no puedes usar los bounds. Los bounds como te dice @Igor son la caja imaginaria, siempre alineada con los ejes, que comprende al objeto. Se usan para acelerar los cálculos de colisiones, para ordenar la cola del renderer para que las cosas más lejanas se dibujen antes, para  clipping (no dibujar objetos que están fuera de cámara), etc. 
 
En general no deberías modificar los bounds a mano, Unity los recalcula cuando es necesario en función del Mesh que contienen.
 
 

Ok... Pensaba que al cambiar el tamaño de los bounds cambiaba el tamaño de la malla. @J Montes Gracias por la apreciación... con Vector3.scale el codigo está mas limpio...
 
Cita de: J Montes date=1542061488No he entendido bien en qué casos tienes esferas modeladas con diferentes escalas X, Y y Z, pero si te funciona... vale :).  
   


@J Montes Me refería a cuando una esfera no es totalmente redonda... por ejemplo  y alguno de sus ejes de (localScale) es de tamaño distinto
 
 
 
 
 
Cita de: Igor date=1542035704o tambien puedes alterar el mesh... con un bucle "for" que recorra los vertices...
   
   

void Start() {
  float scale = 1.5f;//por ejemplo
  Mesh mesh = GetComponent<MeshFilter>().mesh;
  Vector3[vert] = mesh.vertices;
  for (int i=0; i<mesh.vert.Length; i++){
     vert[i] *= scale;
  }
  mesh.vertices = vert;
  GetComponent<MeshFilter>().mesh = mesh;
}



Es posible que esto me pueda servir, aunque en principio solo para figuras donde el tamaño deba aumentar o disminuir por igual en todos sus lados... gracias @Igor
 
 
 
 
 
Saludos


Cita de: francoe1 date=1542468824@ftejada  ¿Estás buscando algo como Scale Factor de las propiedades de importación?
   
   
      https://docs.unity3d.com/Manual/FBXImporter-Model.html
   


No. Esto lo estuve tanteando pero no sirve para lo que necesito. Esto lo reescalaria a nivel general y hay veces que necesito reescalar solo el tamaño de alguno de los ejes... Por no mencionar el hecho de que no sabría cuanto reescalarlo respecto a otra malla cuando vienen con distintos tamaños reales de otros programas 3d..
 
Por ejemp, si tengo un cubo con todos sus lados iguales y debo adaptarlo a otro cubo que tiene dos lados iguales (x, y) pero uno más grande (z) formando un rectangulo más que un cubo, no podría hacerlo. Aparte usar Scale Factor creo que me plantearia otros problemas...
 
Gracias por el aporte @francoe1

Etiquetas: