Saya menggunakan PerspectiveCamera dan model termasuk beberapa Poin menggunakan PointsMaterial. Saya menggunakan versi OrbitControls.js yang disesuaikan untuk memungkinkan tampilan model yang besar dan kompleks. Salah satu perubahannya adalah fungsi zoom mengubah FOV kamera alih-alih memindahkannya lebih dekat. Kamera bergerak untuk menunjukkan bagian tertentu dari model. Saya perhatikan bahwa atenuasi PointsMaterial berubah ukuran ketika kamera bergerak lebih dekat ke model tetapi tidak ketika FOV diubah.
Saya berasumsi algoritma ukuran menggunakan jarak ke kamera tetapi tidak FOV? Saya belum pernah memposting ke repo ini sebelumnya jadi maafkan saya jika saya melewatkan sesuatu. Saya mencoba menguji dengan IE tetapi tidak dapat memuat halaman saat ini. Sama, tidak yakin persis versi Tiga itu tetapi dalam satu tahun terakhir.
Kode yang membuat 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});
Kode yang mengubah FOV juga tidak menarik:
this.camera.fov = fov;
this.camera.updateProjectionMatrix ();
Tidak tahu apakah ini khusus perangkat keras tetapi sepertinya tidak mungkin. Saya menggunakan GeForce GTX950 di Windows 10.
PointsMaterial.size
memiliki satuan piksel -- bukan satuan dunia. Anda harus menyesuaikan ukurannya sendiri.
Posting terkait ini mungkin informatif: https://github.com/mrdoob/three.js/issues/10385#issuecomment -267789138.
Hati-hati bahwa gl_PointSize
mungkin terbatas, sehingga ukuran yang Anda minta mungkin tidak sesuai dengan ukuran yang Anda dapatkan.
@WestLangley. Jadi saya perlu mengubah properti ukuran dari PointsMaterial ketika saya mengubah FOV?
Saya memang menemukan posting itu sebelum bertanya tetapi saya tidak cukup mengikuti mengapa itu bekerja seperti itu. Saya mengerti bahwa ukuran dalam piksel tetapi redaman sudah membuatnya tidak berhubungan dengan piksel perangkat dan proses itu pasti harus berhubungan dengan perspektif yang harus berhubungan dengan FOV dalam beberapa hal?
Namun, itu hanya menjelaskan kurangnya pemahaman saya sendiri. Saya sangat senang dengan solusi yang Anda berikan. Terima kasih.
Saya berharap PointsMaterial.size
akan tetap dalam satuan piksel, jadi untuk referensi, saya akan memposting solusi ini di sini.
Berdasarkan jawaban stackoverflow ini , Anda dapat menskalakan poin Anda menggunakan pola berikut, yang seharusnya berfungsi untuk nilai wajar camera.fov
.
var defaultSize = 10;
points.material.size = defaultSize / Math.tan( ( Math.PI / 180 ) * camera.fov / 2 );