CADmium โปรแกรม CAD แบบ Local-first สำหรับเบราว์เซอร์
(mattferraro.dev)CADmium: โปรแกรม CAD แบบ Local-first ที่ทำงานในเบราว์เซอร์
21 พฤษภาคม 2024
เรากำลังพัฒนาโปรแกรม CAD โอเพนซอร์สตัวใหม่ ตอนนี้คืบหน้าไปมากแล้ว แต่ยังต้องการความช่วยเหลือจากทุกคน หากอยากเข้าร่วมโปรเจกต์นี้ โปรดเข้าร่วม Discord!
ต้องมีอะไรบ้าง?
สิ่งที่จำเป็นในการสร้างโปรแกรม 3D parametric CAD:
- ตัวแก้ข้อจำกัด 2D
- B-rep kernel
- ตัวติดตามประวัติ
- ส่วนติดต่อผู้ใช้ 3D
- รูปแบบไฟล์
มาคุยกันทีละหัวข้อ!
ตัวแก้ข้อจำกัด 2D
ตัวแก้ข้อจำกัด 2D ทำหน้าที่รักษาให้เส้นยังคงขนานหรือตั้งฉากกัน หรือทำให้วงกลมสองวงมีรัศมีเท่ากัน เป็นต้น
- วิธีทั่วไปคือรวมตัวแปรที่ไม่ทราบค่าทั้งหมดไว้ในเวกเตอร์ขนาดใหญ่
xแล้วเขียนข้อจำกัดทั้งหมดเป็นสมการเชิงเส้น ก่อนประกอบออกมาเป็นสมการเมทริกซ์ขนาดใหญ่Mx = b - ในทางทฤษฎี ถ้าหาเมทริกซ์ผกผันของ
Mได้ก็จบ:x = M^-1 b - ในทางปฏิบัติ ต้องมีการปรับแต่งประสิทธิภาพจำนวนมาก แต่แนวทางนี้มีข้อเสีย
- หาเมทริกซ์ผกผันได้เฉพาะเมื่อ
Mเป็นเมทริกซ์จัตุรัสเท่านั้น - ถ้ามีข้อจำกัดมากเกินไป
Mจะใหญ่เกินจนวิธีนี้ใช้ไม่ได้ - ถ้าข้อจำกัดน้อยเกินไป อาจแก้ด้วยการใส่สมมติฐานเพิ่ม แต่สิ่งนี้อาจไม่ตรงกับความคาดหวังของผู้ทำโมเดล
- เมื่อมีตัวแปรที่ไม่ทราบค่าจำนวนมาก การแก้สมการเมทริกซ์นี้จะช้ามาก
- หาเมทริกซ์ผกผันได้เฉพาะเมื่อ
แนวทางทางเลือก:
- นิยามปัญหาใหม่ให้เป็นตัวจำลองฟิสิกส์ 2D:
- แต่ละจุดมีมวล
mและความเร็วv - ข้อจำกัดแต่ละข้อเป็นสปริงที่ออกแรง
Fกับจุดที่เชื่อมอยู่ - แรงเสียดทานเป็นสัดส่วนกับความเร็ว
- จำลองเวลาเดินหน้าไปทีละ
dtเล็ก ๆ ซ้ำไปเรื่อย ๆ จนกว่าจะลู่เข้า
- แต่ละจุดมีมวล
- แนวทางนี้ทำการเปลี่ยนแปลงเล็ก ๆ จำนวนมากเพื่อทำให้พลังงานศักย์ของสปริงเป็น 0
- เวลาในการรันแต่ละช่วงเวลาเป็นเชิงเส้นตามจำนวนสปริงและจำนวนตัวแปรที่ไม่ทราบค่า
- แนวทางนี้เหมาะกับการทำงานแบบขนาน จึงเร็วมากได้ในทางปฏิบัติ
- ปัญหาข้อจำกัดเกินจะไม่บ่นเรื่องข้อจำกัดเกิน: ระบบที่สอดคล้องกันจะแก้ได้ตามปกติ ส่วนระบบที่ไม่สอดคล้องกัน สปริงจะประนีประนอมกันเอง
- ปัญหาข้อจำกัดไม่พอจะไม่ปลิวหายไปไม่สิ้นสุด แต่จะหาคอนฟิกูเรชันที่ถูกต้องซึ่งใกล้ที่สุด
- แนวทางนี้รองรับข้อจำกัดแบบอสมการได้
B-rep kernel
ใน CAD สำหรับงานเครื่องกล ผู้ใช้ต้องสามารถโต้ตอบกับขอบและผิวหน้าของชิ้นส่วนได้โดยตรง
- โปรแกรม parametric CAD ทุกตัวแสดงขอบเขตของชิ้นส่วนโดยตรงในรูปของโครงสร้างข้อมูล
- ลูกบาศก์สามารถแสดงเป็นโซลิดที่มี 6 หน้า แต่ละหน้ามี 4 ขอบ และแต่ละขอบมี 2 จุด วิธีนี้เรียกว่า boundary representation (B-rep)
- สำหรับผิวโค้ง จะใช้พื้นผิว NURBS ซึ่งเป็นการทำให้ spline ทั่วไปยืดหยุ่นขึ้น เพื่อให้ควบคุมรูปทรงอิสระเชิงศิลป์ได้ และแทนเส้นโค้งภาคตัดกรวยได้อย่างแม่นยำ
- การแทนรูปทรงด้วยวิธีนี้ทำได้ยาก และจะยิ่งยากขึ้นอีกเมื่อพยายามทำ boolean operation เช่น union, intersection และ difference
- ไลบรารีที่จัดการข้อมูลเหล่านี้และทำ boolean operation ได้เรียกว่า B-rep kernel และเป็นสิ่งที่สร้างได้ยากมาก
ตลาด CAD ปัจจุบัน:
- บริษัท CAD รายใหญ่ต่างก็เขียน B-rep kernel ของตัวเองขึ้นมา และใช้เวลาหลายสิบปี
- B-rep kernel ที่สำคัญที่สุดคือ Parasolid ซึ่งรองรับผลิตภัณฑ์อุตสาหกรรมจำนวนมาก
- ในตลาดโอเพนซอร์ส CAD, OpenCascade คือ B-rep kernel ยอดนิยมเพียงตัวเดียว
B-rep kernel โอเพนซอร์สตัวใหม่:
- ขณะนี้กำลังมีการพัฒนา B-rep kernel โอเพนซอร์สตัวใหม่ชื่อ Truck
- เขียนด้วย Rust ซึ่งมีข้อดีอย่างการรับประกันความปลอดภัยของหน่วยความจำ การทำงานแบบขนานได้ง่าย และรองรับการคอมไพล์เป็น WebAssembly
- Truck มีขนาดเล็กและน้ำหนักเบา รองรับการอ่าน/เขียนไฟล์ .step, การทำ triangulation ของพื้นผิว, รองรับ NURBS และการทำ intersection/union/difference กับโซลิด
ตัวติดตามประวัติ
โปรแกรม parametric CAD จะเก็บประวัติฟีเจอร์ของการออกแบบไว้
- ชิ้นส่วนถูกสร้างให้สมบูรณ์ผ่านงานอย่าง sketch, extrude, revolve เป็นต้น
- คำว่า "parametric" หมายถึงสามารถย้อนกลับไปยังขั้นก่อนหน้า แก้ไข แล้วเล่นฟีเจอร์ต่อจากนั้นซ้ำเพื่อให้ได้ชิ้นส่วนที่ต่างออกไปเล็กน้อย
- สามารถทำให้โมเดลเป็นพารามิเตอร์ได้ด้วยการฉีดตัวแปรเข้าไป
แนวทางในการแก้ความเปราะบางของ parametric CAD:
- กลยุทธ์การสร้างแบบยืดหยุ่น (RMS): ชุดกฎสำหรับออกแบบชิ้นส่วน
- เพิ่มประวัติฟีเจอร์เข้าไปใน sketch: สามารถเก็บและแสดงฟีเจอร์ของ sketch ใน feature tree เพื่อใช้แนวคิด RMS กับ sketch เดียวได้
- บันทึกอีเวนต์ของผู้ใช้ทั้งหมดลงใน append-only log เพื่อให้มีฟังก์ชัน undo/redo แบบไม่จำกัด
ส่วนติดต่อผู้ใช้ 3D
เราชอบแนวคิดของการรัน CAD ในเบราว์เซอร์
- Onshape ทำงานในเบราว์เซอร์ แต่จริง ๆ แล้วรันอยู่บน cloud instance ของ AWS ที่มี GPU รองรับ
- CADmium ใช้ Truck ที่คอมไพล์เป็น WebAssembly ทำให้ทำทุกอย่างได้ในเบราว์เซอร์ เป็นแอปแบบ local-first
เทคโนโลยีสแตก:
- Three.js: 3D viewport
- Svelte: การจัดการสถานะ/ความเป็น reactive
- Threlte: ตัวเชื่อมระหว่าง Svelte กับ Three.js
- การส่งข้อความระหว่าง UI กับ B-rep kernel
- Electron: การรันแบบ local
- เทคโนโลยีมาตรฐานอื่น ๆ: Typescript, TailwindCSS, Vite เป็นต้น
รูปแบบไฟล์
CADmium ใช้ JSON สำหรับทุกอย่าง
- บันทึกการทำงานประกอบด้วย JSON line
- รองรับการส่งออกชิ้นส่วนที่ออกแบบแล้วไปยังรูปแบบแลกเปลี่ยนที่ง่ายกว่า
- ตัวอย่าง:
{ "steps": [ { "type": "sketch", "id": "Sketch-01", "data": { ... } }, { "type": "extrude", "id": "Extrude-01", "data": { "distance": "10mm", "sketch": "Sketch-01", "faces": [0], "type": "new" } } ] } - สามารถแปลงเป็น .step หรือ .stl ได้ด้วย CADmium command-line interface (CLI):
$ CADmium export my_part.cadmium --format stl
บทสรุป
เราไม่รู้ว่าไอเดียใดในที่นี้จะสำเร็จ และไอเดียใดจะล้มเหลว แต่ที่ไหนสักแห่งในพื้นที่นี้มีโอกาสที่ทีมขนาดเล็กจะสร้างผลกระทบครั้งใหญ่ต่ออุตสาหกรรมการผลิตได้
ความช่วยเหลือที่ต้องการ:
- การเขียนโปรแกรม Rust (การปรับปรุงทั่วไป)
- Computational geometry (แพตช์สำหรับ Truck)
- ความช่วยเหลือด้าน Three.js (camera controller ใหม่, แสงที่ดีขึ้น, post-processing)
- การหาโอกาสด้าน grant หรือผู้สนับสนุนที่มีทุนมาก
สิ่งที่ยังไม่พูดถึงตอนนี้ แต่ต้องการกลับมาพูดภายหลัง:
- Venture capital
- การสร้าง toolpath (CAM)
- Finite element analysis (FEA)
หากแนวคิดนี้น่าสนใจ โปรดเข้าร่วมเซิร์ฟเวอร์ Discord ของ CADmium เพื่อมาพูดคุยกัน!
ความเห็นของ GN⁺
- ข้อดีของ Rust: Rust เหมาะกับโปรเจกต์โอเพนซอร์สมาก เพราะมีทั้งความปลอดภัยด้านหน่วยความจำและรองรับการทำงานแบบขนานได้ง่าย ซึ่งจะช่วยเพิ่มเสถียรภาพและประสิทธิภาพของ CADmium อย่างมาก
- การใช้ WebAssembly: การใช้ WebAssembly เพื่อให้ทำงาน CAD ได้โดยตรงในเบราว์เซอร์ถือว่านวัตกรรมมาก ทำให้ยังทำงานต่อได้แม้ในสภาพแวดล้อมที่การเชื่อมต่ออินเทอร์เน็ตไม่เสถียร
- การทำรูปแบบไฟล์ให้ง่ายขึ้น: รูปแบบไฟล์ที่ใช้ JSON เข้าใจง่าย และแก้ไขได้โดยตรงใน text editor จึงมีประโยชน์มาก ช่วยให้การทำงานร่วมกันและการจัดการเวอร์ชันง่ายขึ้น
- ความสำคัญของประวัติฟีเจอร์: การให้ฟังก์ชัน undo/redo แบบไม่จำกัดผ่านประวัติฟีเจอร์สามารถยกระดับประสบการณ์ผู้ใช้ได้มาก เพราะช่วยให้แก้ความผิดพลาดระหว่างกระบวนการออกแบบได้ง่าย
- พลังของชุมชนโอเพนซอร์ส: โปรเจกต์โอเพนซอร์สสามารถพัฒนาได้รวดเร็วผ่านการมีส่วนร่วมและการสนับสนุนจากชุมชน และ CADmium เองก็มีโอกาสเติบโตขึ้นอีกมากจากการเข้าร่วมของนักพัฒนาและผู้ใช้จำนวนมาก
ยังไม่มีความคิดเห็น