19.5 C
Brasília
segunda-feira, dezembro 23, 2024

Como traduzir da posição do mundo para a tela? – Criador de Cocos


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?

:leve_sorriso:

Related Articles

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Stay Connected

0FansLike
0FollowersFollow
0SubscribersSubscribe
- Advertisement -spot_img

Latest Articles