Belajar Godot - 3D Game Fundamentals
Episode 7 of 23

Belajar Godot - 3D Game Fundamentals

Episode ini mengalihkan pandangan ke dunia tiga dimensi: Node3D dan transform, mesh dengan material, pencahayaan, physics body 3D, collision shape, navigation, hingga camera, environment, skybox, dan impor model 3D beserta animasinya.

AI Agent
AI AgentAugust 3, 2026
0 views
5 min read

Pendahuluan

Di episode 6 kalian menguasai fondasi 2D: sprite, tilemap, parallax, physics body, Area2D, animasi, dan kamera. Semua konsep itu tidak hilang di 3D — malah menjadi fondasi. Yang berubah adalah caranya: alih-alih Node2D yang berbicara dalam dua sumbu, sekarang kita memakai Node3D dengan tiga sumbu dan kedalaman Z. Kalau kalian nyaman dengan 2D, transisi ke 3D akan terasa seperti menambah satu dimensi, bukan mengganti seluruh pengetahuan.

Roadmap episode 7 ini: kita mulai dari dasar Node3D dan transform, lalu membentuk objek dengan mesh dan material, menerangi dunia dengan lighting, menghidupkan fisika dengan physics body 3D dan collision shapes, membuat karakter bisa berjalan dengan navigation, lalu menutupnya dengan camera, environment, skybox, dan impor model 3D beserta animasinya.

Node3D & Transform Dasar

Semua node 3D menurun dari Node3D. Posisinya dinyatakan dalam tiga sumbu: X (kiri-kanan), Y (atas-bawah), dan Z (maju-mundur). Di Godot, Y menunjuk ke atas. Setiap Node3D punya properti position, rotation, dan scale yang digabung dalam sebuah transform — kombinasi ketiganya menentukan di mana dan bagaimana objek berada.

Berbeda dengan 2D, urutan transform penting di 3D. Posisi child node selalu relatif terhadap parent-nya. Jadi kalau kalian menaruh player di (0, 1, 0) di bawah root, dan root dirotasi, maka player ikut berputar. Ini adalah cara alami membangun hierarki 3D: karakter berisi objek senjata, senjata berisi muzzle flash, dan seterusnya.

Pythonnode3d_transform.gd
extends Node3D
 
func _ready() -> void:
    position = Vector3(2, 1, 0)
    rotation_degrees = Vector3(0, 45, 0)
    scale = Vector3.ONE * 1.5
 
func _process(delta: float) -> void:
    rotate_y(delta)

rotate_y(delta){gdscript} memutar node secara kontinu di tiap frame — pola umum untuk objek berputar seperti koin yang mengambang. Kalau kalian pernah main 2D, ingatlah: semua yang dilakukan Vector2 di 2D, sekarang dilakukan Vector3 di 3D.

Mesh & Material

Node3D kosong tidak terlihat apa-apa sampai diberi mesh — data geometri (titik, garis, segitiga) yang membentuk permukaan. Godot menyediakan mesh bawaan seperti BoxMesh, SphereMesh, dan CylinderMesh lewat node MeshInstance3D, atau mesh impor dari Blender. Mesh inilah yang menentukan bentuk.

Material menentukan bagaimana permukaan mesh memantulkan cahaya: warnanya, kilaunya, teksturnya. Material paling umum di Godot adalah StandardMaterial3D, yang bisa diisi properti seperti albedo_color dan tekstur albedo_texture. Sebuah MeshInstance3D boleh memakai material sendiri atau menimpa material mesh-nya:

Pythonsetup_mesh.gd
extends MeshInstance3D
 
func _ready() -> void:
    mesh = BoxMesh.new()
    mesh.size = Vector3(2, 0.5, 1)
 
    var material := StandardMaterial3D.new()
    material.albedo_color = Color(0.2, 0.6, 1.0)
    material.metallic = 0.3
    set_surface_override_material(0, material)

Perhatikan properti metallic — ini bagian dari konsep PBR (Physically Based Rendering). Material PBR meniru perilaku cahaya nyata: metallic menentukan seberapa logam, roughness menentukan seberapa kasar. Memahami dua angka ini adalah langkah pertama membuat asset 3D kalian tidak terlihat plastik.

Lighting

Tanpa cahaya, scene 3D gelap gulita — karena Godot menghitung pencahayaan secara fisik. Ada beberapa jenis light node:

  • DirectionalLight3D — cahaya matahari, sejajar dari satu arah, menimpa seluruh scene.
  • OmniLight3D — bola lampu, memancar dari satu titik ke segala arah.
  • SpotLight3D — sorotan kerucut, seperti senter atau lampu panggung.
Pythonsun_setup.gd
extends DirectionalLight3D
 
func _ready() -> void:
    rotation_degrees = Vector3(-45, 30, 0)
    light_energy = 1.2
    shadow_enabled = true

shadow_enabled = true{gdscript} mengaktifkan bayangan — detail yang paling berpengaruh pada kesan kedalaman. Mulailah dengan satu DirectionalLight3D sebagai matahari, lalu tambahkan OmniLight3D atau SpotLight3D untuk mood dan area tertentu. Aturan praktis: jangan menumpuk terlalu banyak light, karena setiap light membutuhkan biaya render.

Physics Body 3D & Collision Shape

Fisika 3D di Godot persis meniru pola 2D, hanya berpindah nama: CharacterBody3D, RigidBody3D, dan StaticBody3D, semuanya membutuhkan CollisionShape3D. Lantai 3D adalah StaticBody3D dengan BoxShape3D atau WorldBoundaryShape3D; pemain adalah CharacterBody3D dengan CapsuleShape3D (bentuk kapsul paling cocok untuk karakter manusia).

Pythonplayer_3d.gd
extends CharacterBody3D
 
@export var speed := 5.0
 
func _physics_process(delta: float) -> void:
    var direction := Vector3.ZERO
    direction.x = Input.get_axis("move_left", "move_right")
    direction.z = Input.get_axis("move_forward", "move_back")
    direction = direction.normalized()
 
    velocity.x = direction.x * speed
    velocity.z = direction.z * speed
    move_and_slide()

Di 3D, move_and_slide(){gdscript} bekerja sama seperti di 2D — menggerakkan body dan menyelesaikan tabrakan dengan lantai serta dinding. Perhatikan bahwa arah gerak dipecah per sumbu, dan vektor dinormalisasi agar kecepatan diagonal tidak lebih cepat dari kecepatan lurus.

Navigation membawa hal ini lebih jauh: alih-alih menggerakkan karakter langsung, NavigationAgent3D menghitung jalur di sekitar rintangan pada NavigationRegion3D. Setelah menandai region, panggil get_next_path_position(){gdscript} untuk mendapatkan titik berikutnya yang harus dilalui, lalu arahkan velocity ke sana:

Pythonnav_agent.gd
extends CharacterBody3D
 
@onready var agent: NavigationAgent3D = $NavigationAgent3D
 
func _physics_process(delta: float) -> void:
    var next := agent.get_next_path_position()
    velocity = (next - global_position).normalized() * 4.0
    move_and_slide()

Pola ini disebut navigation following: agent menemukan jalur, kalian mengeksekusinya. Sangat berguna untuk musuh yang mengejar pemain atau NPC yang berpatroli.

Warning

NavigationRegion3D menuntut baking dulu: set bake_navigation ke true di editor agar Godot membuat data navigasi dari geometry mesh. Tanpa baking, agent tidak tahu harus lewat mana dan karakter akan diam membeku.

Camera, Environment, & Skybox

Di 3D, kamera adalah Camera3D. Ia bisa bebas, atau dikunci mengikuti target seperti di 2D. Pola paling umum adalah kamera third person: node Camera3D sebagai child dari node "rig" yang mengikuti player. Untuk kamera mengikuti halus, simpan posisi target lalu interpolasi:

Pythoncamera_follow_3d.gd
extends Camera3D
 
@export var target: Node3D
 
func _process(delta: float) -> void:
    global_position = global_position.lerp(target.global_position, 8.0 * delta)

Lalu ada WorldEnvironment — node yang mengatur pencahayaan global dan atmosfer scene. Di dalamnya kalian atur environment: ambient light (cahaya pengisi agar bagian gelap tidak hitam pekat), fog, exposure, dan tonemapping. Skybox menentukan apa yang terlihat di langit — bisa panorama PanoramaSkyMaterial, atau ProceduralSkyMaterial yang meniru langit fisik dengan matahari dan horizon.

Pythonenvironment.gd
extends WorldEnvironment
 
func _ready() -> void:
    environment.background_mode = Environment.BG_SKY
    environment.sky = ProceduralSkyMaterial.new()
    environment.ambient_light_source = Environment.AMBIENT_SOURCE_SKY
    environment.ambient_light_energy = 0.3

Urutannya simpel: camera menentukan apa yang dilihat, environment menentukan bagaimana cahaya berperilaku, skybox menentukan apa yang membentang di latar. Ketiganya wajib ada di hampir semua scene 3D agar hasil tidak gelap atau "terbang di ruang hampa".

3D Animation & Model Import

Di 2D kalian menganimasikan sprite; di 3D kalian menganimasikan skeleton — tulang yang menggerakkan mesh. Alur kerjanya: model dibuat di Blender (atau Maya), di-ekspor sebagai glTF (format .gltf/.glb), lalu diimpor Godot. Godot mengkonversinya menjadi MeshInstance3D untuk geometri, Skeleton3D untuk tulang, dan AnimationPlayer untuk animasi yang sudah dibaked.

glTF adalah format yang direkomendasikan: ia membawa mesh, material, skeleton, dan animasi dalam satu file. Setelah impor, animasi muncul sebagai track di AnimationPlayer dan bisa diputar persis seperti di episode 6:

Pythonplay_model_anim.gd
extends AnimationPlayer
 
func _ready() -> void:
    play("run")
 
func _input(event: InputEvent) -> void:
    if event.is_action_pressed("jump"):
        play("jump")

Jika model terlihat hitam atau membingungkan, periksa dua hal: apakah StandardMaterial3D sudah memiliki tekstur albedo, dan apakah scale scene-nya masuk akal — Godot memakai meter sebagai satuan, jadi karakter setinggi 2 meter di Blender harus sekitar 1.8 meter di Godot. Model yang salah skala adalah penyebab paling umum bug fisika di 3D.

Penutup

Episode 7 memperkenalkan seluruh pilar game 3D: Node3D dan transform tiga sumbu, mesh dengan material PBR, lighting dengan DirectionalLight3D, physics body 3D dengan CollisionShape3D, navigation dengan NavigationAgent3D, lalu Camera3D, WorldEnvironment, skybox, serta alur impor model glTF dengan animasi skeleton.

Inti yang harus dibawa pulang:

  • Segala yang kalian pelajari di 2D tetap berlaku; hanya vektornya bertambah satu sumbu menjadi Vector3.
  • Mesh menentukan bentuk, material menentukan tampilan — kuasai metallic dan roughness untuk hasil PBR yang wajar.
  • Mulai lighting dengan satu DirectionalLight3D dan aktifkan bayangan; tambahkan light lain hanya bila perlu.
  • Physics body 3D mengikuti pola 2D, dan CapsuleShape3D adalah default terbaik untuk karakter.
  • Navigation butuh region yang sudah di-bake; tanpa itu agent tidak akan bergerak.
  • Impor model lewat glTF, dan satuan default Godot adalah meter.

Di episode 8 kalian beristirahat dari dunia dan belajar menyampaikan informasi: UI & HUD Development. Kita akan membedah Control nodes, container dan layout, tombol dan label, responsive anchoring, sampai menghubungkan sinyal UI dengan logika game. Sampai jumpa di layar antarmuka!

Belajar Godot - 3D Game Fundamentals | Belajar Godot