Roblox'un varsayılan Terrain suyu basit yüzme için uygundur ancak sürat tekneleri veya deniz savaşları için gereken hidrodinamik derinliğe sahip değildir.
Gövdenin dört köşesinde Arşimet kaldırma kuvvetini hesaplayıp Luau Gerstner dalgaları ile birleştirerek teknelerin fırtınalı denizlerde kusursuz dengede kalmasını sağlayabilirsiniz.
1. Varsayılan Terrain Suyunun Yetersizlikleri
Standart suyun gelişmiş deniz araçlarında başarısız olma nedenleri:
- Tekdüze kaldırma kuvveti: Baş ve kıç eğimini hesaba katmayan homojen ivmelenme.
- Düz su yüzeyi: 3D dinamik okyanus dalgalarının bulunmaması.
- Yüksek hızda havaya fırlama hataları: Ayrık çarpışma çözücü hataları.
- Yatış sönümlemesi eksikliği: Keskin dönüşlerde alabora olma riski.
2. Çok Noktalı Arşimet Kaldırma Kuvveti & Gerstner Dalgaları
Gövde üzerinde bağımsız noktalarda kaldırma kuvveti hesabı:
- Dört köşe örnekleme: Baş ve kıç bağlantı noktaları ile bağımsız su derinliği ölçümü.
- Analitik Gerstner dalga formülü: Ağ yükü olmadan matematiksel `(X, Z)` dalga yüksekliği hesabı.
- Batma hacmine göre Arşimet kuvveti: `F = (Derinlik * Hacim * Yerçekimi * Yoğunluk) - (Hız * Sönümleme)`.
- Doğal doğrulma torku: Yatan tarafın otomatik olarak daha fazla kaldırma kuvveti üretmesi.
--!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. Akışkan Sürtünme Tensörleri & Hidrodinamik
Su direncinin matematiksel modellenmesi:
- Anizotropik sürtünme: İleriye düşük direnç (~0.05), yanlara yüksek direnç (~1.2).
- Kayma (Planing) modu: Yüksek hızda gövdenin sudan yükselmesi.
- Açısal hız sönümlemesi: Titreşimlerin engellenmesi.
- Kıç itki vektörü: Dönüşlerde içeriye doğru doğal yatış açısı.
4. Ağ Sahipliği ve Gecikmesiz Çok Oyunculu Senkronizasyon
Kusursuz çok oyunculu araç deneyimi:
- Sürücüye Network Ownership verilmesiyle sıfır kontrol gecikmesi.
- Sunucu saatiyle tüm istemcilerde tamamen aynı dalga hesaplaması.
- Yolcuların koltuk kilitleriyle dalgalarda fırlamasının önlenmesi.
- Boş teknelerde fizik hesabının uyutulması.
5. Üretim Kontrol Listesi
Roblox Studio'da sorunsuz gemi geliştirme kuralları:
- Ağırlık merkezini su hattının altında tutarak devrilmeyi önleyin.
- Sürtünmesiz basit çarpışma kutuları kullanın.
- Hıza bağlı köpük partikülleri ve dalga sesleri ekleyin.
- Görsel su yüzeyini matematiksel formüllerle tam eşleştirin.
Frequently Asked Questions
Neden standart su yerine Gerstner dalgaları kullanılmalı?
Standart su düzdür; Gerstner dalgaları ağ trafiği yaratmadan 3D dinamik okyanus dalgaları üretir.
Kaç kaldırma noktası kullanılmalıdır?
Standart tekneler için 4 köşe noktası idealdir; büyük gemiler 6 ila 8 nokta kullanır.
Dalgalarda teknenin gökyüzüne uçması nasıl engellenir?
Kare başına maksimum kaldırma kuvvetini sınırlandırarak ve hava direnci uygulayarak.