Hola a todos! Hace varios meses me enrolé en un proyecto, hemos ido avanzando pero por el camino he tenido problemas que decidí dejar de lado para poder seguir con algo nuevo, este es uno de esos problemas, resulta que tenía que modificar una textura para hacer que una parte sea transparente con un fade; de 100%-0% de manera lineal, hasta aquí todo OK, pero luego me pidió que se pudiera rotar esta textura y este fade, me tiré toda una mañana para conseguir que rotara el fade y solo conseguí que rotara 90º en fin, más adelante se me ocurrió rotar el array entero pero me parece una solución muy mala, por eso acudo a vosotros a ver si alguno se le ocurre una forma de pasarle "120" grados y esté correctamente rotada, porque en este momento parece que estuviera "30" grados (creo, hace mucho le hice cambios y no recuerdo el resultado exacto).
public static Texture2D ObtenerGradiente (Texture2D textura, int _angulo)
{
int desfase, angulo;
desfase = (_angulo < 90) ? 0 : (_angulo < 180) ? 1 : (_angulo < 270) ? 2 : 3;
angulo = _angulo - desfase * 90;
Gradient gradiente = new Gradient ();
GradientColorKey[] keyColores = new GradientColorKey[] {
new GradientColorKey (Color.white, 0),
new GradientColorKey (Color.white, 0)
};
GradientAlphaKey[] keyAlfas = new GradientAlphaKey[] {
new GradientAlphaKey (1, 0),
new GradientAlphaKey (0, 1)
};
gradiente.SetKeys (keyColores, keyAlfas);
Color[] colores = textura.GetPixels ();
int numero = 0;
Color c;
Debug.Log (textura.width + " x " + textura.height);
for (int x = 0; x < textura.width; x++) {
for (int y = 0; y < textura.height; y++) {
xdim = Mathf.Sin (angulo * Mathf.Deg2Rad) * ((float)x / (float)textura.width);
ydim = Mathf.Cos (angulo * Mathf.Deg2Rad) * ((float)y / (float)textura.height);
c = colores [x * textura.width + y];
c.a = gradiente.Evaluate (xdim + ydim).a;
colores [x * textura.width + y] = c;
}
}
Debug.Log ("Bucle finalizado");
Texture2D resultado = new Texture2D (textura.width, textura.height);
resultado.SetPixels (colores);
resultado.Apply ();
return resultado;
}
Interesante problema, esto está lejos de ser una solución, pero jugueteando un rato logré que si le cambias el punto de referencia de donde le asignas la amplitud a esos senos y cosenos podés lograr un barrido, pero este va de 0% de gradiente a 50% gradient, o por ahí. Este código probé, como el tuyo pero saque lo de los desfasajes y el gradient de código para poner uno public y modificarlo desde inspector en un OnGUI. (Fijate que las x e y dim las cambie de nombre, era para entenderlo más pero bueno, me olvidé de reacomodarlas). Lo unico que hice fue cambiar el "centro" a la hora de normalizar con la línea:
(x -
(float)textura.width/2) / textura.width;
(y -
(float)textura.height/2) / textura.height;
public Texture2D ObtenerGradiente (Texture2D textura )
{
float angulo = m_angulo;
Color[] colores = textura.GetPixels ();
Color c;
Debug.Log (textura.width + " x " + textura.height);
for (int x = ; x < textura.width; x++) {
for (int y = ; y < textura.height; y++) {
float xCursor = (x - (float)textura.width/2) / textura.width;
float yCursor = (y - (float)textura.height/2) / textura.height;
xCursor = Mathf.Sin (m_angulo * Mathf.Deg2Rad) * xCursor;
yCursor = Mathf.Cos (m_angulo * Mathf.Deg2Rad) * yCursor;
c = colores [x * textura.width + y];
c.a = m_gradiente.Evaluate ( (xCursor + yCursor)).a;
colores [x * textura.width + y] = c;
}
}
Debug.Log ("Bucle finalizado");
Texture2D resultado = new Texture2D (textura.width, textura.height);
resultado.SetPixels (