Тема: Стародавні артефакти забутих цивілізацій при повороті пікселів
Є картинка, і ще одна картинка, розміри котрої можуть змінюватись, але то не головне.
Головне те, що друга картинка повинна накладатись на першу, піксель на піксель.
Коли перша картинка повернута на 0, 90, 180 або 360 градусів, то все окей, тому що піксельні решітки накладаються одна на одну гарненько, піксель на піксель.
Але якщо повернути якусь з картинок на, наприклад, 45 градусів, то вже виникають дефекти.
ось такі от
Тут я змінюю пікселі першої картинки за допомогою матриці повороту. І робиться щось не те, чого б хотілось.
Єдиний плюс, це те, що різне значення повороту видає різний візерунок
То хто зна, що там відбувається, і як то пофіксити?
Озьдо код
public static void Process2(ref Texture2D texture, Texture2D boomTexture, Vector2 textureOrigin, Vector2 pointOfImpact, float angle, float radius, bool test=false)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
pointOfImpact = WorldToPixel(texture.width, texture.height, pointOfImpact, textureOrigin, angle);
Vector4[] boundingBox = CalculateBoundingBox(pointOfImpact, radius, texture.width, texture.height, boomTexture.width, boomTexture.height);
float stepX = (boundingBox[1].y - boundingBox[1].x) / (boundingBox[0].y - boundingBox[0].x);
float stepY = (boundingBox[1].w - boundingBox[1].z) / (boundingBox[0].w - boundingBox[0].z);
Debug.Log("step x: " + stepX + " step y: " + stepY);
Debug.Log("main tex box: "+boundingBox[0]+" helping tex box: "+boundingBox[1]);
float x0 = boundingBox[1].x, y0=0;
float centerX = (boundingBox[0].y - boundingBox[0].x) / 2f + boundingBox[0].x;
float centerY = (boundingBox[0].w - boundingBox[0].z) / 2f + boundingBox[0].z;
Debug.Log("center x: "+centerX+" center y: "+centerY);
for (int x = (int)boundingBox[0].x; x < boundingBox[0].y; x++)
{
y0 = boundingBox[1].z;
for (int y = (int)boundingBox[0].z; y < (int)boundingBox[0].w; y++)
{
float tempX = x - centerX;
float tempY = y - centerY;
int newX = (int)(tempX * Mathf.Cos(angle * Mathf.Deg2Rad) - tempY * Mathf.Sin(angle * Mathf.Deg2Rad) + centerX);
int newY = (int)(tempX * Mathf.Sin(angle * Mathf.Deg2Rad) + tempY * Mathf.Cos(angle * Mathf.Deg2Rad) + centerY);
if(test)
Debug.Log("old x: "+x+" old y: "+y+" new x: "+newX+" new y: "+newY);
if(newX<0 || newX > texture.width || newY<0 || newY > texture.height)
continue;
Color color = texture.GetPixel(newX, newY);
color.g = 1;
texture.SetPixel(newX, newY, color);
y0 += stepY;
continue;
texture.SetPixel(newX, newY, color);
if (color.a == 0)
continue;
color.g = 1;
color.a = 1-boomTexture.GetPixel(Mathf.FloorToInt(x0), Mathf.FloorToInt(y0)).a;
texture.SetPixel(newX, newY, color);
}
x0 += stepX;
}
var res = stopwatch.ElapsedTicks;
stopwatch.Stop();
Debug.Log("it took " + res + " ticks, x0: "+x0+" y0: "+y0);
}