Advertisement
  1. Web Design
  2. JavaScript

Panduan Pemula untuk Menggambar Grafik 2D Dengan Two.js

Scroll to top
Read Time: 10 min

() 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, webglcanvas, 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 orangered, atau blue. Demikian pula, Anda dapat mengatur nilai untuk semua properti lainnya seperti linewidth, opacitymiter, 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 scalerotation, 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 familysize, danalignment.. Anda juga dapat menentukan nilai properti seperti fillstrokeopacityrotationscale, 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!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Web Design tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.