← Back to Portal Hub

Physique Nautique & Flottabilité sur Roblox : Vagues de Gerstner, Traînée Fluide et Simulation de Bateaux

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

L'eau de terrain par défaut de Roblox est adaptée à la nage, mais ne permet pas de simuler des embarcations réalistes à haute vitesse sans oscillation ni désynchronisation.

En concevant un contrôleur de flottabilité multipoint basé sur le principe d'Archimède et les vagues de Gerstner en Luau, les développeurs obtiennent des navires naviguant naturellement sur les vagues avec un contrôle total.

1. Limites de l'Eau de Terrain Native pour les Embarcations

Pourquoi l'eau native de Roblox échoue sur les véhicules marins complexes :

2. Flottabilité Multipoint d'Archimède & Vagues de Gerstner

Calcul des forces de poussée sur des points distribués de la coque :

Contrôleur Luau de Flottabilité Multipoint et Vagues de Gerstner
--!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. Traînée Anisotrope & Hydrodynamique de Coque

Modélisation des frottements et de la résistance de l'eau sur le bateau :

4. Propriété Réseau & Synchronisation Sans Saccade

Architecture réseau pour des bateaux multijoueurs fluides :

5. Bonnes Pratiques de Production

Checklist pour un système maritime sans bugs dans Roblox Studio :

Frequently Asked Questions

Pourquoi privilégier les vagues de Gerstner au terrain Roblox ?

Le terrain est fixe ; les vagues de Gerstner permettent des houles animées réalistes sans échange réseau de géométrie.

Combien de points de flottabilité utiliser ?

4 points aux extrémités de la coque suffisent pour les vedettes rapides ; 6 à 8 points pour les gros navires.

Comment empêcher le bateau de s'envoler lors des sauts ?

En plafonnant la force de poussée maximale et en appliquant une traînée aérodynamique.

Explore More Interactive Tests & Guides

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

Go to Portal Hub