← Back to Portal Hub

Roblox Su Fiziği ve Tekne Kaldırma Kuvveti: Gerstner Dalgaları, Akışkan Direnci ve Araç Simülasyonu

By DopaBrain Studio Engineering Team • 2026-09-30 • Technical Guide

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:

2. Çok Noktalı Arşimet Kaldırma Kuvveti & Gerstner Dalgaları

Gövde üzerinde bağımsız noktalarda kaldırma kuvveti hesabı:

Luau Çok Noktalı Gerstner Dalgası Kaldırma Kuvveti Kontrolcüsü
--!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:

4. Ağ Sahipliği ve Gecikmesiz Çok Oyunculu Senkronizasyon

Kusursuz çok oyunculu araç deneyimi:

5. Üretim Kontrol Listesi

Roblox Studio'da sorunsuz gemi geliştirme kuralları:

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.

Explore More Interactive Tests & Guides

Discover personalized cognitive assessments, stress evaluations, and game psychology tools on DopaBrain.

Go to Portal Hub