PerspectiveCameraと、PointsMaterialを使用していくつかのPointsを含むモデルを使用しています。 カスタマイズされたバージョンのOrbitControls.jsを使用して、大きくて複雑なモデルを表示できるようにしています。 変更点の1つは、ズーム機能がカメラを近づけるのではなく、カメラのFOVを変更することです。 カメラが動き、モデルの特定の部分が表示されます。 カメラがモデルに近づくとPointsMaterialの減衰のサイズが変わるが、FOVが変わるとサイズが変わることに気づきました。
サイズアルゴリズムはカメラまでの距離を使用しますが、FOVは使用しないと思いますか? 私はこれまでこのリポジトリに投稿したことがないので、何かが足りない場合はすみません。 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 ();
これがハードウェア固有であるかどうかはわかりませんが、可能性は低いようです。 Windows10でGeForceGTX950を使用しています。
PointsMaterial.size
は、世界の単位ではなく、ピクセルの単位があります。 サイズは自分で調整する必要があります。
この関連する投稿は参考になるかもしれません: https ://github.com/mrdoob/three.js/issues/10385#issuecomment-267789138。
gl_PointSize
は制限されている可能性があるため、リクエストしたサイズが実際のサイズと異なる場合があることに注意してください。
@WestLangley。 したがって、FOVを変更するときに、PointsMaterialのsizeプロパティを変更する必要がありますか?
私は尋ねる前にその投稿を見つけましたが、なぜそれがそのように機能するのかについてはよくわかりません。 サイズはピクセル単位であると理解していますが、減衰によってデバイスのピクセルとは関係がなくなり、そのプロセスは確かに、ある意味でFOVに関係する必要がある遠近法に関係する必要がありますか?
しかし、それは私自身の理解の欠如を説明しているだけです。 私はあなたが与える解決策に完全に満足しています。 ありがとう。
PointsMaterial.size
はピクセル単位のままになると思いますので、参考までに、この回避策をここに投稿します。
このstackoverflowの回答に基づいて、次のパターンを使用してポイントをスケーリングできます。これは、 camera.fov
妥当な値で機能するはずです。
var defaultSize = 10;
points.material.size = defaultSize / Math.tan( ( Math.PI / 180 ) * camera.fov / 2 );