Estou usando PerspectiveCamera e um modelo incluindo alguns pontos usando um PointsMaterial. Estou usando uma versão personalizada do OrbitControls.js para permitir a visualização de um modelo grande e complexo. Uma das mudanças é que a função de zoom altera o FOV da câmera em vez de movê-lo para mais perto. A câmera se move para mostrar uma parte específica dos modelos. Percebi que a atenuação do PointsMaterial muda de tamanho quando a câmera se aproxima do modelo, mas não quando o FOV é alterado.
Presumo que o algoritmo de tamanho use a distância até a câmera, mas não o FOV. Eu nunca postei neste repositório antes, então me desculpe se eu perder algo. Tentei testar com o IE, mas não consigo carregar a página no momento. Da mesma forma, não tenho certeza de qual versão do Three é, mas no ano passado.
Código que cria o PointsMaterial:
var texFlame = new THREE.TextureLoader().load("textures/flame.png");
mtlFlame = new THREE.PointsMaterial ({size: 2, sizeAttenuation: true, color: 0xffffff, transparent: true, blending: THREE.AdditiveBlending, depthWrite: false, map: texFlame});
O código que altera o FOV é igualmente desinteressante:
this.camera.fov = fov;
this.camera.updateProjectionMatrix ();
Não sei se isso é específico do hardware, mas parece improvável. Estou usando a GeForce GTX950 no Windows 10.
PointsMaterial.size
tem unidades de pixels - não unidades mundiais. Você mesmo terá que ajustar o tamanho.
Esta postagem relacionada pode ser informativa: https://github.com/mrdoob/three.js/issues/10385#issuecomment -267789138.
Esteja ciente de que gl_PointSize
pode ser limitado, portanto, o tamanho que você solicitar pode não ser o tamanho que você obtém.
@WestLangley. Portanto, preciso alterar a propriedade de tamanho do PointsMaterial quando alterar o FOV?
Eu encontrei essa postagem antes de perguntar, mas não entendi bem por que funciona assim. Eu entendo que o tamanho está em pixels, mas a atenuação já faz com que não se relacione com os pixels dos dispositivos e esse processo certamente deve estar relacionado à perspectiva que deve estar relacionada ao FOV em algum sentido?
No entanto, isso apenas explica minha própria falta de compreensão. Estou perfeitamente feliz com a solução que você deu. Obrigado.
Espero que PointsMaterial.size
permaneça em unidades de pixels, portanto, para referência, postarei esta solução alternativa aqui.
Com base nesta resposta stackoverflow , você pode escalar seus pontos usando o seguinte padrão, que deve funcionar para valores razoáveis de camera.fov
.
var defaultSize = 10;
points.material.size = defaultSize / Math.tan( ( Math.PI / 180 ) * camera.fov / 2 );