Jump to content
UnitySpain
ftejada

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

Recommended Posts

4 hours ago, ftejada said:

 

¿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...)

 

Share this post


Link to post
Share on other sites
39 minutes ago, Igor said:

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...)

 

@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

Share this post


Link to post
Share on other sites

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...

Share this post


Link to post
Share on other sites
15 hours ago, ftejada said:

Tambié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 :).  

15 hours ago, ftejada said:

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);

Quote

¿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 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.

 

Edited by J Montes
Missing response to question.

Share this post


Link to post
Share on other sites

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...

On 11/12/2018 at 11:24 PM, J Montes said:

No 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

 

 

On 11/12/2018 at 4:15 PM, Igor said:

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;
}

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

Share this post


Link to post
Share on other sites
On 11/17/2018 at 4:33 PM, francoe1 said:

@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

Share this post


Link to post
Share on other sites

×
×
  • Create New...