Terapkan pengubah subdivisi three.js tanpa mengubah geometri luar?

Saya mencoba mengambil geometri three.js dan membagi wajah yang ada menjadi wajah yang lebih kecil. Hal ini pada dasarnya akan memberikan geometri "resolusi" yang lebih tinggi. Ada alat pengubah subdivisi dalam contoh three.js yang berfungsi baik untuk apa yang saya coba lakukan, tetapi akhirnya mengubah dan mengubah bentuk asli geometri. Saya ingin mempertahankan bentuk aslinya.

Lihat Contoh Pengubah Subdivisi


Contoh perilaku pengubah subdivisi saat ini:

masukkan deskripsi gambar di sini

Contoh kasar tentang bagaimana saya ingin perilakunya:

masukkan deskripsi gambar di sini


Pengubah subdivisi diterapkan seperti ini:

let originalGeometry = new THREE.BoxGeometry(1, 1, 1);
let subdivisionModifier = new THREE.SubdivisionModifier(3);
let subdividedGeometry = originalGeometry.clone();
subdivisionModifier.modify(subdividedGeometry);

Saya mencoba menggali sumber pengubah subdivisi, tapi saya tidak yakin bagaimana cara memodifikasinya untuk mendapatkan hasil yang diinginkan.

Catatan: Pembagian ini harus dapat diterapkan pada geometri apa pun. Contoh saya tentang hasil yang diinginkan mungkin membuat PlaneGeometry three.js dengan segmen yang diperbesar tampak berfungsi, namun saya perlu ini diterapkan pada berbagai geometri.


person jackrugile    schedule 05.06.2017    source sumber
comment
Dalam kode SubdivisionModifier, ia menggunakan bobot simpul dan tepi untuk memposisikan simpul subdivisi baru. Saya tidak punya waktu untuk mendalami perhitungan matematika tentang apa yang terjadi, tetapi jika Anda dapat memodifikasi/mengganti logika pemosisian untuk menempatkan titik sudut baru di sepanjang tepi aslinya, maka geometri Anda akan mempertahankan bentuknya sambil tetap dibagi lagi menjadi lebih banyak sisi. .   -  person TheJim01    schedule 05.06.2017
comment
@ TheJim01 Terima kasih, saya telah sedikit mengutak-atik nilai-nilai itu dan saya rasa saya hampir menemukan solusinya. Akan memposting jawaban jika saya menemukan solusi yang solid.   -  person jackrugile    schedule 05.06.2017


Jawaban (2)


Berdasarkan saran dalam komentar oleh TheJim01, saya dapat menggali sumber asli dan memodifikasi bobot titik, bobot tepi, dan nilai beta untuk mempertahankan bentuk aslinya. Modifikasi saya harus menghilangkan rata-rata apa pun, dan menempatkan semua bobot ke bentuk sumber.

Ada tiga bagian yang harus dimodifikasi, jadi saya melanjutkan dan menjadikannya opsi yang dapat diteruskan ke konstruktor bernama retainShape, yang defaultnya adalah false.

Saya membuat intisari dengan kode yang dimodifikasi untuk SubdivisionGeometry.js.

Lihat Inti SubdivisionGeometry.js yang dimodifikasi


Di bawah ini adalah contoh kubus yang dibagi lagi dengan opsi dimatikan, dan dihidupkan.

Kiri: new THREE.SubdivisionModifier(2, false);

Benar: new THREE.SubdivisionModifier(2, true);

masukkan deskripsi gambar di sini

Jika ada yang mengalami masalah dengan ini atau memiliki pertanyaan, beri tahu saya!

person jackrugile    schedule 05.06.2017
comment
Ini sangat keren. Anda harus mengirimkan perubahan Anda sebagai penyempurnaan ke THREE.SubdivisionModifier! :) github.com/mrdoob/three.js - person TheJim01; 06.06.2017
comment
Luar biasa! Akan mencoba mengirimkannya segera, untuk THREE.BufferSubdivisionModifier juga. - person jackrugile; 06.06.2017
comment
Jika ada penggunaan semantik, di Blender ada opsi untuk menggunakan pengubah subdivisi dalam mode sederhana yang menghindari perubahan bentuk, mungkin Anda dapat memberi nama properti Anda dengan sederhana karena mungkin ada alasan mengapa disebut demikian - person Neil; 08.06.2017

Versi three.js saat ini memiliki parameter opsional untuk PlaneGeometry yang menentukan jumlah segmen untuk lebar dan tinggi; keduanya default ke 1. Pada contoh di bawah ini saya menetapkan widthSegments dan heightSegments ke 128. Ini memiliki efek yang sama seperti menggunakan SubdivisionModifier. Faktanya, SubdivisionModifier mendistorsi bentuk, tetapi menentukan segmen tidak mengubah bentuk dan berfungsi lebih baik bagi saya.

var widthSegments = 128;
var heightSegments = 128;
var geometry = new THREE.PlaneGeometry(10, 10, widthSegments, heightSegments);
//    var geometry = new THREE.PlaneGeoemtry(10,10); // segments default to 1
//    var modifier = new THREE.SubdivisionModifier( 7 );
//    geometry = modifier.modify(geometry);

https://threejs.org/docs/#api/en/geometries/PlaneGeometry

person Don Smith    schedule 15.03.2020
comment
Ini benar, tapi lihat catatan di akhir pertanyaan saya. - person jackrugile; 17.03.2020