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

บทสรุป

เราไม่รู้ว่าไอเดียใดในที่นี้จะสำเร็จ และไอเดียใดจะล้มเหลว แต่ที่ไหนสักแห่งในพื้นที่นี้มีโอกาสที่ทีมขนาดเล็กจะสร้างผลกระทบครั้งใหญ่ต่ออุตสาหกรรมการผลิตได้

ความช่วยเหลือที่ต้องการ:

  1. การเขียนโปรแกรม Rust (การปรับปรุงทั่วไป)
  2. Computational geometry (แพตช์สำหรับ Truck)
  3. ความช่วยเหลือด้าน Three.js (camera controller ใหม่, แสงที่ดีขึ้น, post-processing)
  4. การหาโอกาสด้าน grant หรือผู้สนับสนุนที่มีทุนมาก

สิ่งที่ยังไม่พูดถึงตอนนี้ แต่ต้องการกลับมาพูดภายหลัง:

  1. Venture capital
  2. การสร้าง toolpath (CAM)
  3. Finite element analysis (FEA)

หากแนวคิดนี้น่าสนใจ โปรดเข้าร่วมเซิร์ฟเวอร์ Discord ของ CADmium เพื่อมาพูดคุยกัน!

ความเห็นของ GN⁺

  1. ข้อดีของ Rust: Rust เหมาะกับโปรเจกต์โอเพนซอร์สมาก เพราะมีทั้งความปลอดภัยด้านหน่วยความจำและรองรับการทำงานแบบขนานได้ง่าย ซึ่งจะช่วยเพิ่มเสถียรภาพและประสิทธิภาพของ CADmium อย่างมาก
  2. การใช้ WebAssembly: การใช้ WebAssembly เพื่อให้ทำงาน CAD ได้โดยตรงในเบราว์เซอร์ถือว่านวัตกรรมมาก ทำให้ยังทำงานต่อได้แม้ในสภาพแวดล้อมที่การเชื่อมต่ออินเทอร์เน็ตไม่เสถียร
  3. การทำรูปแบบไฟล์ให้ง่ายขึ้น: รูปแบบไฟล์ที่ใช้ JSON เข้าใจง่าย และแก้ไขได้โดยตรงใน text editor จึงมีประโยชน์มาก ช่วยให้การทำงานร่วมกันและการจัดการเวอร์ชันง่ายขึ้น
  4. ความสำคัญของประวัติฟีเจอร์: การให้ฟังก์ชัน undo/redo แบบไม่จำกัดผ่านประวัติฟีเจอร์สามารถยกระดับประสบการณ์ผู้ใช้ได้มาก เพราะช่วยให้แก้ความผิดพลาดระหว่างกระบวนการออกแบบได้ง่าย
  5. พลังของชุมชนโอเพนซอร์ส: โปรเจกต์โอเพนซอร์สสามารถพัฒนาได้รวดเร็วผ่านการมีส่วนร่วมและการสนับสนุนจากชุมชน และ CADmium เองก็มีโอกาสเติบโตขึ้นอีกมากจากการเข้าร่วมของนักพัฒนาและผู้ใช้จำนวนมาก

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น