我正在使用 PerspectiveCamera 和一个模型,包括使用 PointsMaterial 的一些点。 我正在使用 OrbitControls.js 的定制版本来允许查看大型复杂模型。 其中一项更改是缩放功能会更改相机的 FOV,而不是将其移近。 相机移动以显示模型的特定部分。 我注意到 PointsMaterial 衰减在相机靠近模型时会改变大小,但在 FOV 改变时不会。
我假设尺寸算法使用到相机的距离而不是 FOV? 我以前从未发布过这个 repo,所以如果我错过了什么,请原谅。 我尝试使用 IE 进行测试,但目前无法加载页面。 同样,不确定它是哪个版本的 Three,但在去年。
创建 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});
改变 FOV 的代码同样乏味:
this.camera.fov = fov;
this.camera.updateProjectionMatrix ();
不知道这是否是特定于硬件的,但似乎不太可能。 我在 Windows 10 中使用 GeForce GTX950。
PointsMaterial.size
有像素单位——不是世界单位。 您必须自己调整大小。
此相关帖子可能提供信息: https :
请注意, gl_PointSize
可能是有限的,因此您要求的尺寸可能不是您得到的尺寸。
@WestLangley。 那么当我改变 FOV 时,我需要改变 PointsMaterial 的 size 属性吗?
我确实在问之前找到了那个帖子,但我不太明白它为什么会这样。 我知道尺寸以像素为单位,但衰减已经使它与设备像素无关,并且该过程肯定必须与透视有关,而透视在某种意义上必须与 FOV 相关?
然而,这只是解释我自己缺乏了解。 我对您提供的解决方案非常满意。 谢谢。
我希望PointsMaterial.size
仍以像素为单位,因此作为参考,我将在此处发布此解决方法。
基于此 stackoverflow answer ,您可以使用以下模式缩放您的点,这应该适用于camera.fov
合理值。
var defaultSize = 10;
points.material.size = defaultSize / Math.tan( ( Math.PI / 180 ) * camera.fov / 2 );