रोब्लॉक्स का डिफ़ॉल्ट पानी तैरने के लिए ठीक है, लेकिन तेज़ गति वाली नावों और यथार्थवादी नौका सिमुलेशन के लिए इसमें आवश्यक भौतिकी का अभाव है।
पतवार के कोनों पर मल्टी-पॉइंट बॉयेंसी प्रणाली लागू करके और गर्स्टनर तरंगों की गणना करके, नावें गतिशील लहरों पर संतुलित रूप से चलती हैं।
1. डिफ़ॉल्ट पानी की सीमाएं और कस्टम भौतिकी की आवश्यकता
रोब्लॉक्स के अंतर्निहित पानी में नौका सिमुलेशन की चुनौतियां:
- समान उत्प्लावन त्वरण: बिना पिच और रोल झुकाव के पूरे जहाज पर एक जैसा बल लगाना।
- सपाट जल सतह: गतिशील 3D लहरों का अभाव।
- तेज गति पर भौतिकी असंतुलन: पानी की सतह से टकराने पर नाव का अचानक हवा में उछल जाना।
- रोल डैम्पिंग की कमी: मोड़ने पर नाव के पलटने का निरंतर जोखिम।
2. मल्टी-पॉइंट आर्किमिडीज उत्प्लावन बल और तरंग नमूनाकरण
पतवार के अलग-अलग बिंदुओं पर उत्प्लावन बल की गणना:
- चार-बिंदु नमूनाकरण: गहराई मापने के लिए पतवार के कोनों पर अटैचमेंट लगाना।
- गर्स्टनर तरंग सूत्र: गणितीय रूप से किसी भी निर्देशांक `(X, Z)` पर तरंग की ऊंचाई निकालना।
- आर्किमिडीज उत्प्लावन सूत्र: `F = (गहराई * आयतन * गुरुत्वाकर्षण * घनत्व) - (गति * डैम्पिंग)`.
- स्वाभाविक संतुलन टोक़: लहरों के बीच नाव का स्वतः सीधा होना।
--!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. द्रव प्रतिरोध और हाइड्रोडायनामिक्स
पानी के प्रतिरोध का गणितीय मॉडलिंग:
- दिशात्मक ड्रैग: आगे की ओर कम प्रतिरोध (~0.05) और बगल में उच्च प्रतिरोध (~1.2)।
- प्लानिंग मोड: तेज गति में नाव का पानी के ऊपर उठना।
- कोणीय गति डैम्पिंग: अवांछित दोलन और झूलने को रोकना।
- पतवार प्रणोदन: यथार्थवादी मोड़ और अंदरूनी झुकाव।
4. नेटवर्क स्वामित्व और मल्टीप्लेयर सिंक
बिना किसी लैग के सुचारू मल्टीप्लेयर गेमप्ले:
- चालक को नेटवर्क स्वामित्व सौंपना ताकि नियंत्रण तुरंत प्रतिक्रिया दे।
- सर्वर और क्लाइंट पर बिना पैकेट भेजे एक समान लहरें बनना।
- सवारियों को स्थिर रखना ताकि वे नाव से बाहर न गिरें।
- खाली नावों पर गणना रोककर सर्वर सीपीयू बचाना।
5. उत्पादन चेकलिस्ट
रोब्लॉक्स स्टूडियो में नाव विकास के नियम:
- भार का केंद्र (Center of Mass) नीचे रखना।
- सरल टकराव बॉक्स बनाना ताकि नाव अटके नहीं।
- लहरों के अनुसार आवाज़ और छींटों का प्रभाव जोड़ना।
- पानी की सतह का विजुअल डिफॉर्मेशन गणित से मिलाना।
Frequently Asked Questions
गर्स्टनर तरंगों का उपयोग क्यों किया जाता है?
यह बिना नेटवर्क डेटा भेजे सभी खिलाड़ियों के लिए एक जैसी 3D लहरें उत्पन्न करता है।
नाव के लिए कितने उत्प्लावन बिंदु सबसे अच्छे हैं?
साधारण नावों के लिए 4 बिंदु पर्याप्त हैं, बड़े जहाजों के लिए 6 से 8 बिंदु उपयुक्त रहते हैं।
नाव को हवा में उछलने से कैसे रोकें?
अधिकतम उत्प्लावन बल की सीमा तय करके और वायु प्रतिरोध लागू करके।