A água padrão de terreno do Roblox serve para natação simples, mas não oferece a hidrodinâmica necessária para lanchas velozes ou simulações navais realistas.
Ao estruturar um sistema de flutuabilidade multiponto nas extremidades do casco acoplado às ondas de Gerstner em Luau, barcos navegam por ondas oceânicas com estabilidade absoluta.
1. Limitações da Água Padrão do Roblox para Embarcações
Por que o terreno aquático nativo falha em veículos náuticos avançados:
- Aceleração uniforme de flutuabilidade sem cálculo de inclinação de proa e popa.
- Superfície estática sem ondulações oceânicas 3D dinâmicas.
- Lançamentos violentos no ar devido a erros de colisão em alta velocidade.
- Ausência de torque de restauração contra capotamentos em curvas fechadas.
2. Flutuabilidade Multiponto de Arquimedes & Ondas de Gerstner
Cálculo hidrostático distribuído nos cantos do casco:
- Amostragem em 4 cantos do casco: Attachments na proa e popa calculando a profundidade individualmente.
- Fórmula analítica de Gerstner: Determinação da altura da água em qualquer coordenada `(X, Z)` sem meshes pesados.
- Empuxo de Arquimedes amortecido: `F = (Profundidade * Volume * Gravidade * Densidade) - (Velocidade * Amortecimento)`.
- Torque de restauração natural: Aumento de empuxo no lado submerso para estabilização automática.
--!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. Tensores de Arrasto Fluido & Hidrodinâmica
Resistência direcional à movimentação na água:
- Arrasto anisotrópico: Baixa resistência para frente (~0.05) e resistência lateral extrema (~1.2) para impedir derrapagens.
- Planeio vs. Deslocamento: Elevação do casco em alta velocidade reduzindo atrito.
- Amortecimento angular: Estabilização de rolagem e balanço excessivo.
- Vetor de propulsão na popa: Curvas naturais com inclinação para o interior.
4. Propriedade de Rede & Sincronização Multijogador
Desempenho fluido sem atrasos na rede:
- Propriedade de rede direta ao piloto para eliminar atrasos de controle.
- Ondas idênticas calculadas pelo relógio do servidor sem tráfego de rede.
- Fixação de passageiros nos assentos contra ejeções involuntárias.
- Desativação de cálculos em barcos vazios para economia de CPU.
5. Checklist de Produção
Princípios fundamentais no Roblox Studio:
- Centro de massa baixo para evitar capotamentos.
- Colisores invisíveis simplificados com atrito zero.
- Partículas de esteira e áudio marinho calibrados pela velocidade.
- Sincronização visual da malha de água com as equações matemáticas.
Frequently Asked Questions
Por que usar ondas de Gerstner em vez de água nativa?
A água nativa é estática; as ondas de Gerstner oferecem ondulação 3D dinâmica sem exigir envio de pacotes.
Quantos pontos de flutuabilidade utilizar?
4 pontos nas extremidades são ideais para lanchas; navios grandes usam de 6 a 8 pontos.
Como evitar que barcos decolem ao bater em ondas?
Limitando o empuxo ascendente máximo e aplicando arrasto aerodinâmico.