Air Terrain default Roblox sangat mendasar untuk berenang, namun tidak memiliki hidrodinamika yang dibutuhkan untuk perahu motor cepat atau pertempuran laut realistis.
Dengan merancang sistem daya apung multi-titik di setiap sudut lambung kapal serta menghitung gelombang Gerstner di Luau, perahu bergerak stabil melintasi ombak samudera dinamis.
1. Keterbatasan Air Terrain Bawaan untuk Kendaraan Air
Mengapa air bawaan Roblox gagal pada simulasi kapal kompleks:
- Daya apung kotak pembatas seragam: Menerapkan akselerasi seragam tanpa membedakan pitch dan roll.
- Permukaan air datar: Tidak memiliki ombak 3D yang dinamis.
- Peluncuran fisik kecepatan tinggi: Tabrakan diskrit yang melempar perahu ke udara.
- Kurangnya peredam roll: Risiko terbalik terus-menerus saat bermanuver tajam.
2. Daya Apung Archimedes Multi-Titik & Sampling Gelombang Gerstner
Menghitung gaya angkat hidrostatis pada titik-titik terpisah di lambung kapal:
- Sampling empat sudut lambung: Attachment di haluan dan buritan mengukur kedalaman air secara independen.
- Rumus analitis gelombang Gerstner: Menghitung ketinggian air di koordinat `(X, Z)` mana pun tanpa komputasi mesh berat.
- Kalkulasi gaya apung: `F = (Kedalaman * Volume * Gravitasi * Kepadatan) - (Kecepatan * Redaman)`.
- Torsi pemulihan alami: Kemiringan kapal secara otomatis dikoreksi oleh gaya apung yang lebih besar pada sisi yang tenggelam.
--!strict
local RunService = game:GetService("RunService")
local Workspace = game:GetService("Workspace")
local BoatPhysics = {}
local WAVES = {
{Dir = Vector2.new(1, 0).Unit, Steepness = 0.4, Length = 60, Speed = 12},
{Dir = Vector2.new(0.7, 0.7).Unit, Steepness = 0.25, Length = 35, Speed = 9}
}
local GRAVITY = Workspace.Gravity
local WATER_DENSITY = 1.025
local POINT_SUBMERGED_VOLUME = 850
local DAMPING = 280
function BoatPhysics.GetWaveHeight(worldX: number, worldZ: number, timeVal: number): number
local elevation = 0
for _, wave in ipairs(WAVES) do
local k = (2 * math.pi) / wave.Length
local c = wave.Speed
local dot = wave.Dir.X * worldX + wave.Dir.Y * worldZ
local phase = k * (dot - c * timeVal)
elevation += math.sin(phase) * (wave.Steepness / k)
end
return elevation
end
function BoatPhysics.UpdateBuoyancy(hullRoot: BasePart, sampleAttachments: {Attachment}, vectorForces: {VectorForce})
local t = Workspace:GetServerTimeNow()
for i, attach in ipairs(sampleAttachments) do
local pos = attach.WorldPosition
local waterY = BoatPhysics.GetWaveHeight(pos.X, pos.Z, t)
local depth = waterY - pos.Y
local vf = vectorForces[i]
if depth > 0 then
local vel = hullRoot:GetVelocityAtPosition(pos)
local upwardForce = math.clamp((depth * POINT_SUBMERGED_VOLUME * GRAVITY * WATER_DENSITY) - (vel.Y * DAMPING), 0, 80000)
local lateralDrag = -Vector3.new(vel.X, 0, vel.Z) * 45
vf.Force = Vector3.new(lateralDrag.X, upwardForce, lateralDrag.Z)
else
vf.Force = Vector3.zero
end
end
end
return BoatPhysics
3. Tensor Hambatan Fluida & Hidrodinamika Lambung
Pemodelan matematis resistensi air terhadap kapal:
- Hambatan kuadratik anisotropik: Hambatan rendah ke depan (~0.05) dan hambatan samping sangat tinggi (~1.2) agar perahu tidak meluncur liar.
- Transisi mode planing: Kapal terangkat di atas air pada kecepatan tinggi.
- Peredaman kecepatan sudut: Mencegah osilasi goyangan yang berlebihan.
- Vektor dorong buritan: Belokan realistis dengan kemiringan ke arah dalam tikungan.
4. Kepemilikan Jaringan & Replikasi Bebas Jitter
Sinkronisasi tanpa jeda untuk pengemudi dan penumpang:
- Network Ownership pengemudi diberikan langsung ke klien pengemudi untuk latensi nol.
- Gelombang deterministik dihitung otomatis oleh semua pemain berdasarkan waktu server.
- Penguncian penumpang dengan Seat Attachment agar tidak terlempar ke laut.
- Mode hemat daya untuk kapal kosong guna menghemat CPU server.
5. Checklist Produksi Kapal
Pedoman penting merilis perahu stabil di Roblox Studio:
- Pusat massa kapal berada di bawah garis air untuk mencegah terbalik.
- Geometri tabrakan disederhanakan tanpa gesekan agar tidak tersangkut.
- Efek suara dan partikel cipratan air disesuaikan dengan kecepatan.
- Deformasi visual permukaan air dicocokkan dengan rumus matematis gelombang.
Frequently Asked Questions
Mengapa menggunakan gelombang Gerstner dibanding Terrain air biasa?
Air Terrain bersifat datar; gelombang Gerstner memungkinkan ombak laut 3D tanpa perlu mengirim data geometri lewat jaringan.
Berapa banyak titik daya apung yang ideal?
4 titik di sudut lambung ideal untuk perahu cepat; kapal besar membutuhkan 6 hingga 8 titik.
Bagaimana mencegah perahu terlempar ke angkasa saat menabrak ombak?
Batasi gaya angkat maksimum per frame dan terapkan hambatan udara ke bawah.