Apesar dos diferentes recursos e exemplos, não consegui entender como traduzir uma posição mundial para uma posição de tela.
Eu tenho uma cena simples com um cubo colocado (0, 0, 0) e uma câmera em perspectiva colocada em (0, 0, 10)olhando em direção ao cubo.
É assim que traduzo a posição do cubo:
const cubePos = this.dice.place;
const screenPos = this.Camera3D.worldToScreen(cubePos);
console.log("Dice display place X is " + screenPos.x);
Agora, quando coloco o cubo no canto esquerdo da tela, o valor X sendo registrado em 0, o que suponho que faça sentido porque a função usa uma âncora no canto inferior esquerdo.
Mas se eu colocar o cubo no lado direito da tela, o valor passa a ser algo próximo de 280. Por que 280? Estou jogando em 1080×1920.
Alguém pode me dar algumas dicas de como isso deve funcionar?
Observe que worldToScreen possui dois parâmetros que você deve inserir.
O resultado é o mesmo, independentemente do que eu faça:
Esse:
const screenPos = this.Camera3D.worldToScreen(cubePos);
Esse:
let pos = new Vec3();
this.Camera3D.worldToScreen(cubePos, pos);
Ou mesmo isto:
let pos = new Vec3();
this.Camera3D.digicam.worldToScreen(pos, cubePos);
dê o mesmo resultado.
O que não entendo é como o worldToScreen é calculado e a que se refere esse “280”.
Okay, finalmente entendi. A função worldToScreen() calcula a posição de acordo com o tamanho REAL da janela. Estou testando o jogo na prévia do editor. Isso significa que se eu aumentar/diminuir o zoom na visualização do jogo, a posição calculada da tela também mudará.
Portanto, tenho que compensar com uma proporção entre o tamanho da visualização visível e o tamanho da tela:
let pos = new Vec3();
this.Camera3D.worldToScreen(new Vec3(cubePos.x, cubePos.y, cubePos.z), pos);
console.log(pos.x * (view.getVisibleSize().x / display.windowSize.x)); // This logs a worth between 0 and my precise view measurement, 1080 in my case.
Esse comportamento é realmente intencional?