Panduan Pemula untuk Menggambar Grafik 2D Dengan Two.js
() translation by (you can also view the original English article)
Two.js sebuah API yang membuatnya mudah untuk membuat bentuk 2D dengan kode. Ikuti bersama dan Anda akan belajar cara membuat dan menganimasikan bentuk dari JavaScript.
Two.js adalah penyaji agnostik, sehingga Anda dapat mengandalkan API yang sama untuk menggambar dengan Canvas, SVG, atau WebGL. Perpustakaan memiliki banyak metode yang dapat digunakan untuk mengontrol bagaimana bentuk yang berbeda muncul di layar atau bagaimana mereka animasi.
Installation
Versi pustaka yang tidak dikompresi memiliki ukuran sekitar 128 KB, sedangkan versi terkompresi adalah 50 KB. Jika Anda menggunakan versi terbaru, Anda dapat mengurangi ukuran pustaka menggunakan bentukan khusus.
Anda dapat mengunduh minified version of the library dari GitHub atau Anda dapat menautkan langsung ke CDN hosted version. Setelah Anda menambahkan pustaka ke halaman web Anda, Anda dapat mulai menggambar dan menjiwai berbagai bentuk atau objek.
Membuat Bentuk Dasar
Pertama, Anda perlu memberi tahu Two.js tentang elemen yang ingin Anda gambar dan animasikan bentuk Anda. Anda dapat melewati beberapa parameter ke Two
konstruktor untuk mengatur segalanya.
Setel jenis perender menggunakan type
property. Anda dapat menentukan nilai seperti svg
, webgl
, canvas
, dll. The type
diatur ke svg
secara default. Lebar dan tinggi ruang gambar dapat ditentukan menggunakan parameter width
dan height
. Anda juga dapat mengatur ruang gambar ke layar penuh yang tersedia menggunakan fullscreen
parameter. Ketika fullscreen
disetel ke true, nilai width
dan height
akan diabaikan.
Terakhir, Anda dapat memberi tahu Two.js untuk memulai animasi secara otomatis dengan bantuan parameter autostart
Boolean.
Setelah melewati semua parameter yang diinginkan ke konstruktor, Anda dapat mulai menggambar garis, persegi panjang, lingkaran, dan elips.
Anda dapat menggambar garis menggunakan two.makeLine (x1, y1, x2, y2).
Di sini, (x1, y1)
adalah koordinat titik akhir pertama, dan (x2, y2)
adalah koordinat titik akhir kedua. Fungsi ini akan mengembalikan objek Two.Line
, yang dapat disimpan dalam variabel untuk manipulasi lebih lanjut di kemudian hari.
Dengan cara yang sama, Anda dapat menggambar persegi panjang normal dan bulat menggunakan two.makeRectangle (x, y, width, height)
dan two.makeRoundedRectangle (x, y, width, height, radius)
masing-masing. Ingat bahwa x
dan y
menentukan pusat dari persegi panjang, sebagai ganti dari koordinat kiri atas seperti banyak pustaka lainnya. Parameter width
dan height
akan menentukan ukuran persegi panjang. Parameter radius
digunakan untuk menentukan nilai jari-jari untuk sudut bulat.
Anda juga dapat membuat lingkaran dan elips pada halaman web menggunakan two.makeCircle (x, y, radius)
dan two.makeEllipse (x, y, width, height)
masing-masing. Sama seperti persegi panjang, parameter x
dan y
menentukan pusat lingkaran atau elips. Mengatur width
dan height
ke nilai yang sama dalam kasus elips akan membuatnya seperti lingkaran.
Salah satu metode yang berguna di Two.js yang akan sering Anda gunakan adalah two.makeGroup (objects)
. Anda dapat melewatkan daftar objek yang berbeda atau mengirimkan larik objek, jalur, atau grup sebagai parameter ke metode ini. Ini juga akan mengembalikan objek Two.Group
.
Memanipulasi Objek dalam Grup
Setelah Anda membuat grup, Anda dapat memanipulasi semua anaknya sekaligus menggunakan properti yang disediakan grup untuk Anda.
Properti stroke
dan fill
dapat digunakan untuk mengatur stroke dan fill color untuk semua anak dalam grup. Mereka akan menerima semua formulir yang valid di mana Anda dapat mewakili warna dalam CSS. Ini berarti Anda bebas menggunakan RGB, HSL, atau notasi hex. Anda juga dapat menggunakan nama warna, seperti orange
, red
, atau blue
. Demikian pula, Anda dapat mengatur nilai untuk semua properti lainnya seperti linewidth
, opacity
, miter
, dan cap
. Anda dapat menghapus isi dan goresan dari semua anak dalam group menggunakan metode noFill ()
dan noStroke ()
.
Anda juga dapat menerapkan transformasi fisik lainnya seperti scale
, rotation
, and translation
.. Transformasi ini akan diterapkan pada objek individu. Menambahkan objek baru ke grup dan menghapusnya dengan mudah dengan metode seperti add ()
dan remove ().
Menentukan Gradien dan Menulis Teks
Anda dapat menentukan linear dan radial gradien dalam Two.js. Mendefinisikan gradien tidak berarti bahwa itu akan ditampilkan secara otomatis di layar, tetapi itu akan tersedia untuk Anda gunakan ketika mengatur nilai fill
atau stroke
berbagai objek.
Anda dapat menentukan gradien linier menggunakan two.makeLinearGradient (x1, y1, x2, y2, stops)
. Nilai-nilai x1
dan y1
menentukan koordinat awal gradien. Demikian pula, nilai-nilai x2
dan y2
menentukan koordinat akhir gradien. Parameter stops
adalah array instance Two.Stop
. Ini menentukan warna setiap bagian dari array dan di mana setiap transisi warna ke yang berikutnya. Mereka dapat didefinisikan menggunakan new Two.Stop(offset, color, opacity)
, di mana offset
menentukan titik pada gradien di mana warna tertentu harus sepenuhnya diberikan. Parameter color
menentukan warna gradien pada titik tertentu. Anda dapat menggunakan representasi warna CSS yang valid sebagai nilainya. Akhirnya, parameter opacity
menentukan opasitas warna. Opasitas bersifat opsional, dan dapat memiliki nilai antara 0 dan 1.
Anda dapat menentukan gradien radial dengan cara yang sama menggunakan two.makeRadialGradient (x, y, radius, stops, fx, fy).
Dalam kasus ini, nilai-nilai x
dan y
yang menentukan pusat gradien. Parameter radius
menentukan seberapa jauh gradien harus diperluas. Anda juga dapat melewati array berhenti untuk metode ini untuk menetapkan komposisi warna gradien. Parameter fx
dan fy
adalah opsional, dan mereka dapat digunakan untuk menentukan posisi fokus untuk gradien.
Lihat beberapa jenis gradien dan kode mereka di CodePen di bawah ini.
Ingat bahwa x
dan y
posisi gradien yang berkaitan dengan asal-usul mereka mencoba untuk mengisi bentuk. Misalnya, gradien radial yang seharusnya mengisi bentuk dari pusat akan selalu memiliki x
dan y
diatur ke nol.
Two.js juga memungkinkan Anda menulis teks pada area gambar dan memperbaruinya nanti sesuai dengan kebutuhan Anda. Ini membutuhkan penggunaan metode two.makeText (message, x, y, styles).
Mungkin terlihat dari nama parameter bahwa message
adalah teks yang sebenarnya yang ingin Anda tulis. Parameter x
dan y
adalah koordinat titik yang akan bertindak sebagai pusat untuk menulis teks. Parameter styles
adalah sebuah objek yang dapat digunakan untuk mengatur nilai dari sekumpulan besar properti.
Anda dapat menggunakan gaya untuk menetapkan nilai properti seperti font family
, size
, danalignment
.. Anda juga dapat menentukan nilai properti seperti fill
, stroke
, opacity
, rotation
, scale
, dan translation
Membuat Proyek Two.js.
Setelah mempelajari semua metode dan properti ini, sekarang saatnya untuk menerapkannya ke proyek. Dalam tutorial ini, saya akan menunjukkan kepada Anda bagaimana kita dapat menggunakan Two.js untuk membuat sepuluh elemen pertama dari tabel periodik dengan elektron berputar di sekitar nukleus. Nukleus juga memiliki sedikit gerakan untuk meningkatkan daya tarik visual representasi kita.
Kami mulai dengan mendefinisikan beberapa variabel dan fungsi yang akan digunakan nanti.
1 |
var centerX = window.innerWidth / 2; |
2 |
var centerY = window.innerHeight / 2; |
3 |
|
4 |
var elem = document.getElementById("atoms"); |
5 |
|
6 |
var elementNames = [ |
7 |
"", |
8 |
"Hydrogen", |
9 |
"Helium", |
10 |
"Lithium", |
11 |
"Beryllium", |
12 |
"Boron", |
13 |
"Carbon", |
14 |
"Nitrogen", |
15 |
"Oxygen", |
16 |
"Fluorine", |
17 |
"Neon" |
18 |
];
|
19 |
|
20 |
var styles = { |
21 |
alignment: "center", |
22 |
size: 36, |
23 |
family: "Lato" |
24 |
};
|
25 |
|
26 |
var nucleusCount = 10; |
27 |
var nucleusArray = Array(); |
28 |
|
29 |
var electronCount = 10; |
30 |
var electronArray = Array(); |
31 |
|
32 |
function intRange(min, max) { |
33 |
return Math.random() * (max - min) + min; |
34 |
}
|
Kode di atas menyimpan koordinat pusat window kita di variabel centerX
dan centerY
. Ini akan digunakan kemudian untuk menempatkan atom kita di tengah. Array elemenNames
berisi nama-nama dari sepuluh elemen pertama dari tabel periodik. Indeks setiap nama sesuai dengan jumlah elektron dan proton dari elemen itu, dan ini dimulai dengan string kosong. Objek styles
berisi properti untuk menata objek teks.
Kita juga mendefinisikan fungsi intRange ()
untuk mendapatkan nilai integer acak dalam ekstrem yang diberikan.
1 |
var two = new Two({ fullscreen: true }).appendTo(elem); |
2 |
|
3 |
var protonColor = two.makeRadialGradient( |
4 |
0, |
5 |
0, |
6 |
15, |
7 |
new Two.Stop(0, "red", 1), |
8 |
new Two.Stop(1, "black", 1) |
9 |
);
|
10 |
|
11 |
var neutronColor = two.makeRadialGradient( |
12 |
0, |
13 |
0, |
14 |
15, |
15 |
new Two.Stop(0, "blue", 1), |
16 |
new Two.Stop(1, "black", 1) |
17 |
);
|
18 |
|
19 |
for (i = 0; i < nucleusCount; i++) { |
20 |
nucleusArray.push(two.makeCircle(intRange(-10, 10), intRange(-10, 10), 8)); |
21 |
}
|
22 |
|
23 |
nucleusArray.forEach(function(nucleus, index) { |
24 |
if (index % 2 == 0) { |
25 |
nucleus.fill = protonColor; |
26 |
}
|
27 |
if (index % 2 == 1) { |
28 |
nucleus.fill = neutronColor; |
29 |
}
|
30 |
nucleus.noStroke(); |
31 |
});
|
Ini menciptakan sebuah instance dari Dua dan mendefinisikan dua gradien radial. Gradien radial merah / hitam akan mewakili proton, dan gradien biru / hitam akan mewakili neutron.
Kita telah menggunakan fungsi intRange ()
untuk menempatkan semua neutron dan proton ini dalam 20 piksel satu sama lain. Metode makeCircle ()
juga menetapkan radius proton dan neutron ini hingga 10 piksel. Setelah itu, kita iterate atas nucleusArray
dan isi setiap lingkaran dengan gradien yang berbeda secara bergantian.
1 |
for (var i = 0; i < 10; i++) { |
2 |
if (i < 2) { |
3 |
var shellRadius = 50; |
4 |
var angle = i * Math.PI; |
5 |
electronArray.push( |
6 |
two.makeCircle( |
7 |
Math.cos(angle) * shellRadius, |
8 |
Math.sin(angle) * shellRadius, |
9 |
5
|
10 |
)
|
11 |
);
|
12 |
}
|
13 |
if (i >= 2 && i < 10) { |
14 |
var shellRadius = 80; |
15 |
var angle = (i - 2) * Math.PI / 4; |
16 |
electronArray.push( |
17 |
two.makeCircle( |
18 |
Math.cos(angle) * shellRadius, |
19 |
Math.sin(angle) * shellRadius, |
20 |
5
|
21 |
)
|
22 |
);
|
23 |
}
|
24 |
}
|
Menempatkan neutron dan proton di dalam nukleus itu mudah. Namun, menempatkan elektron secara tepat pada jarak yang seragam akan membutuhkan sedikit matematika. Kita menggunakan variabel shellRadius
untuk menentukan jarak cangkang elektron yang berbeda dari nukleus. Seluruh lingkaran mencakup sudut yang sama dengan 2 radian PI. Kita dapat menempatkan elektron yang berbeda secara seragam dengan mendistribusikan radian 2 PI di antara mereka secara merata.
Fungsi Math.cos ()
dan Math.sin ()
digunakan untuk memisahkan komponen vertikal dan horizontal dari vektor posisi elektron yang berbeda berdasarkan sudutnya.
1 |
var orbitA = two.makeCircle(centerX, centerY, 50); |
2 |
orbitA.fill = "transparent"; |
3 |
orbitA.linewidth = 2; |
4 |
orbitA.stroke = "rgba(0, 0, 0, 0.1)"; |
5 |
|
6 |
var orbitB = two.makeCircle(centerX, centerY, 80); |
7 |
orbitB.fill = "transparent"; |
8 |
orbitB.linewidth = 2; |
9 |
orbitB.stroke = "rgba(0, 0, 0, 0.1)"; |
10 |
|
11 |
var groupElectronA = two.makeGroup(electronArray.slice(0, 2)); |
12 |
groupElectronA.translation.set(centerX, centerY); |
13 |
groupElectronA.fill = "orange"; |
14 |
groupElectronA.linewidth = 1; |
15 |
|
16 |
var groupElectronB = two.makeGroup(electronArray.slice(2, 10)); |
17 |
groupElectronB.translation.set(centerX, centerY); |
18 |
groupElectronB.fill = "yellow"; |
19 |
groupElectronB.linewidth = 1; |
20 |
|
21 |
var groupNucleus = two.makeGroup(nucleusArray); |
22 |
groupNucleus.translation.set(centerX, centerY); |
Bagian kode ini menempatkan elektron dari cangkang yang berbeda serta neutron dan proton dalam kelompok mereka sendiri yang terpisah. Ini juga mengatur warna isian untuk semua elektron dalam orbit tertentu sekaligus.
1 |
two
|
2 |
.bind("update", function(frameCount) { |
3 |
groupElectronA.rotation += 0.025 * Math.PI; |
4 |
groupElectronB.rotation += 0.005 * Math.PI; |
5 |
groupNucleus.rotation -= 0.05; |
6 |
})
|
7 |
.play(); |
8 |
|
9 |
var text = two.makeText("", centerX, 100, styles); |
10 |
|
11 |
nucleusArray.forEach(function(nucleus, index) { |
12 |
nucleus.opacity = 0; |
13 |
});
|
14 |
|
15 |
electronArray.forEach(function(electron, index) { |
16 |
electron.opacity = 0; |
17 |
});
|
Bagian kode ini mengatur opasitas elektron dan proton individu ke nol. Ia juga memberitahu Two.js untuk memutar elektron dan proton pada kecepatan tertentu.
1 |
visible = 0; |
2 |
|
3 |
document.addEventListener("click", function(event) { |
4 |
if (visible < nucleusArray.length) { |
5 |
nucleusArray[visible].opacity = 1; |
6 |
electronArray[visible].opacity = 1; |
7 |
visible++; |
8 |
text.value = elementNames[visible]; |
9 |
}
|
10 |
else { |
11 |
nucleusArray.forEach(el => el.opacity=0); |
12 |
electronArray.forEach(el => el.opacity=0); |
13 |
visible = 0; |
14 |
text.value = elementNames[0]; |
15 |
}
|
16 |
});
|
17 |
Bagian terakhir dari kode memungkinkan kita melakukan iterasi melalui elemen dengan mengklik mouse atau mengetuk. Untuk memuat elemen selanjutnya, kita membuat satu lagi elektron dan satu lagi proton atau neutron yang terlihat dan memperbarui nama elemen. Setelah mengklik elemen terakhir, semua partikel disembunyikan lagi sehingga kita dapat memulai kembali. Variabel
terlihat melacak jumlah partikel atom yang saat ini terlihat sehingga kita dapat menampilkan atau menyembunyikannya..
Coba klik atau ketuk dalam CodePen demo berikut untuk melihat sepuluh elemen pertama dari tabel periodik.
Pikiran Akhir
Kita memulai tutorial ini dengan pengantar singkat ke perpustakaan Two.js dan bagaimana ini dapat digunakan untuk menggambar bentuk seperti persegi panjang, lingkaran, dan elips. Setelah itu, kita membahas bagaimana kita dapat mengelompokkan objek yang berbeda bersama-sama untuk memanipulasi mereka sekaligus. Kami menggunakan kemampuan ini untuk kelompok elemen untuk menerjemahkan dan memutarnya di sinkronisasi. Semua alat ini bergabung dalam animasi atom-atom dari sepuluh elemen pertama dalam tabel periodik.
Seperti yang Anda lihat, membuat grafik 2D animasi sangat mudah menggunakan Two.js. Fokus dari posting ini adalah untuk membantu Anda memulai dengan cepat, jadi kita hanya membahas dasar-dasarnya. Namun, Anda harus membaca official documentation untuk mempelajari lebih lanjut tentang library!