Three.js: L'atténuation de la taille des points ne semble pas tenir compte du FOV

Créé le 7 sept. 2017  ·  3Commentaires  ·  Source: mrdoob/three.js

J'utilise PerspectiveCamera et un modèle comprenant des Points utilisant un PointsMaterial. J'utilise une version personnalisée d'OrbitControls.js pour permettre la visualisation d'un modèle volumineux et complexe. L'un des changements est que la fonction de zoom modifie le champ de vision de la caméra au lieu de la rapprocher. La caméra se déplace pour montrer une partie spécifique des modèles. J'ai remarqué que l'atténuation PointsMaterial change de taille lorsque la caméra se rapproche du modèle mais pas lorsque le FOV est modifié.

Je suppose que l'algorithme de taille utilise la distance par rapport à la caméra mais pas le champ de vision ? Je n'ai jamais posté sur ce dépôt auparavant, alors excusez-moi si j'ai raté quelque chose. J'ai essayé de tester avec IE mais je ne parviens pas à le faire charger la page pour le moment. De même, je ne sais pas exactement de quelle version de Three il s'agit, mais au cours de la dernière année.

Code qui crée le 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});

Le code qui modifie le FOV n'est pas non plus passionnant :

this.camera.fov = fov;
this.camera.updateProjectionMatrix ();
Version trois.js
  • [ ] Dév
  • [ ] r87
  • [X] ...
Le navigateur
  • [ ] Tous
  • [x] Chrome
  • [x] Firefox
  • [ ] Internet Explorer
Système d'exploitation
  • [ ] Tous
  • [x] Fenêtres
  • [ ] macOS
  • [ ] Linux
  • [ ] Android
  • [ ] iOS
Configuration matérielle requise (carte graphique, périphérique VR, ...)

Je ne sais pas si cela est spécifique au matériel, mais cela semble peu probable. J'utilise GeForce GTX950 sous Windows 10.

Question

Tous les 3 commentaires

PointsMaterial.size a des unités de pixels -- pas des unités mondiales. Vous devrez ajuster la taille vous-même.

Ce message connexe peut être informatif : https://github.com/mrdoob/three.js/issues/10385#issuecomment -267789138.

Attention, gl_PointSize peut être limité, donc la taille que vous demandez peut ne pas être la taille que vous obtenez.

@WestLangley. Je dois donc modifier la propriété de taille du PointsMaterial lorsque je modifie le FOV ?

J'ai trouvé ce post avant de demander, mais je ne comprends pas très bien pourquoi cela fonctionne de cette façon. Je comprends que la taille est en pixels, mais l'atténuation fait déjà qu'elle n'est pas liée aux pixels des appareils et ce processus doit sûrement être lié à la perspective qui doit être liée au champ de vision dans un certain sens ?

Cependant, cela explique juste mon propre manque de compréhension. Je suis parfaitement satisfait de la solution que vous donnez. Merci.

Je m'attends PointsMaterial.size ce que

Sur la base de cette réponse stackoverflow , vous pouvez mettre vos points à l'échelle en utilisant le modèle suivant, qui devrait fonctionner pour des valeurs raisonnables de camera.fov .

var defaultSize = 10;
points.material.size = defaultSize / Math.tan( ( Math.PI / 180 ) * camera.fov / 2 );
Cette page vous a été utile?
0 / 5 - 0 notes