Posição local do pixel de um quad
2 participantes
Página 1 de 1
Posição local do pixel de um quad
Olá, tenho um quad com uma imagem qualquer, por exemplo:
Eu preciso pegar a posições dos pixels pintados relativos ao quad (de preferência). Tentei usar o GetPixels(), acontece que ele retorna um array de Color, o que significa que não tenho como pegar as posições desta forma. Já tentei pesquisar por aí e não encontrei uma forma de fazer o que eu preciso. Abri threads no fórum da Unity e no Stack Overflow e nada. Começo a suspeitar de que o único jeito é criar uma solução customizada usando algum shader, assunto do qual não tenho praticamente nenhum conhecimento. Posso fornecer mais contexto se necessário, mas quis ser o mais sucinto possível. Enfim, se alguém tiver alguma sugestão, sou todo ouvidos.
Eu preciso pegar a posições dos pixels pintados relativos ao quad (de preferência). Tentei usar o GetPixels(), acontece que ele retorna um array de Color, o que significa que não tenho como pegar as posições desta forma. Já tentei pesquisar por aí e não encontrei uma forma de fazer o que eu preciso. Abri threads no fórum da Unity e no Stack Overflow e nada. Começo a suspeitar de que o único jeito é criar uma solução customizada usando algum shader, assunto do qual não tenho praticamente nenhum conhecimento. Posso fornecer mais contexto se necessário, mas quis ser o mais sucinto possível. Enfim, se alguém tiver alguma sugestão, sou todo ouvidos.
Re: Posição local do pixel de um quad
Usando o GetPixels() funciona, você só precisa converter o índice do array numa matriz.
> dividindo o índice do pixel opaco pela largura da imagem você obtém o valor de Y desse pixel;
> realizando o modulo(%) entre o índice do pixel opaco com a largura em pixels, você obtém o valor de X do pixel.
Tendo os dois valores absolutos de X e Y aí fica mole pra calcular posições em qualquer coordenada, local, world, normalizado, etc.
Package com cena de exemplo.
> dividindo o índice do pixel opaco pela largura da imagem você obtém o valor de Y desse pixel;
> realizando o modulo(%) entre o índice do pixel opaco com a largura em pixels, você obtém o valor de X do pixel.
Tendo os dois valores absolutos de X e Y aí fica mole pra calcular posições em qualquer coordenada, local, world, normalizado, etc.
Package com cena de exemplo.
- Código:
using System.Collections.Generic;
using UnityEngine;
public class Pixel : MonoBehaviour
{
[SerializeField] private Texture2D tex;
[SerializeField] private Transform quad;
[SerializeField] private Vector2 quadSize;
Vector2 temp = Vector2.zero;
Vector2Int tempixel = Vector2Int.zero;
Vector3 tempWorld = Vector3.zero;
//Debug
public Transform debugPoint;
private void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
GetPixelData();
}
}
private void GetPixelData()
{
Color[] data = tex.GetPixels();
List<int> opaquePixels = new List<int>();
for (int i = 0; i < data.Length; i++)
{
if (data[i].a > 0)
{
opaquePixels.Add(i);
}
}
print("Total texture pixels = " + data.Length);
print("Opaque pixels = " + opaquePixels.Count);
Vector2[] normalizedPositions = new Vector2[opaquePixels.Count];
Vector2Int[] pixelPositions = new Vector2Int[opaquePixels.Count];
Vector3[] worldPositions = new Vector3[opaquePixels.Count];
for (int i = 0; i < opaquePixels.Count; i++)
{
tempixel.x = opaquePixels[i] % tex.width;
tempixel.y = opaquePixels[i] / tex.width;
temp.x = (float)tempixel.x / (float)tex.width;
temp.y = (float)tempixel.y / (float)tex.height;
tempWorld = quad.position;
//Do centro pra borda
tempWorld -= (quad.right * (quadSize.x / 2.0f));
tempWorld -= (quad.up * (quadSize.y / 2.0f));
//Da borda pro pixel
tempWorld += (quad.right * (temp.x * quadSize.x));
tempWorld += (quad.up * (temp.y * quadSize.y));
pixelPositions[i] = tempixel;
normalizedPositions[i] = temp;
worldPositions[i] = tempWorld;
}
print("First opaque pixel coord > x=" + pixelPositions[0].x + "/y=" + pixelPositions[0].y);
print("First opaque pixel normalized > x=" + normalizedPositions[0].x + "/y=" + normalizedPositions[0].y);
print("World space pixel coord");
debugPoint.transform.position = worldPositions[0];
}
}
SteveRogers- Instrutor
- PONTOS : 2673
REPUTAÇÃO : 156
Respeito as regras :
Re: Posição local do pixel de um quad
SteveRogers escreveu:Usando o GetPixels() funciona, você só precisa converter o índice do array numa matriz.
> dividindo o índice do pixel opaco pela largura da imagem você obtém o valor de Y desse pixel;
> realizando o modulo(%) entre o índice do pixel opaco com a largura em pixels, você obtém o valor de X do pixel.
Tendo os dois valores absolutos de X e Y aí fica mole pra calcular posições em qualquer coordenada, local, world, normalizado, etc.
.....
Valeu cara, eu não sabia dessas operações que tu recomendou aí. É aquela coisa, já estou nessa vida a uns 2 anos e ainda sinto que não sei quase nada hahah
Eu ainda não vou testar porque a utilização dessa função vai implicar em mudanças um pouco profundas no meu projeto e eu preciso liberar um novo alpha nos próximos dias. Mesmo assim eu gostaria de já ir vendo como se faz para ir planejando os próximos passos.
Eu andei falando contigo algumas vezes no whats nos últimos meses mas não obtive resposta, tu trocou de número ou algo assim? Se este for o caso e tu não te importar, me passa o teu contato novo via mensagem privada...
Obrigado novamente por tudo, tu parece uma das únicas pessoas na internet que alia conhecimento e disposição para ajudar com essas dúvidas menos óbvias (para mim ao menos).
Tópicos semelhantes
» Como transformo a posição de um objeto em outra posição?
» Como ver dos 2 lados de um plane ou quad?
» Configurar canvas com novas resoluções quad e 4k
» Pixel art
» Pixel snap
» Como ver dos 2 lados de um plane ou quad?
» Configurar canvas com novas resoluções quad e 4k
» Pixel art
» Pixel snap
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos