sand3d ไลบรารี Python ที่ให้ AI เขียนโมเดล 3D เป็นโค้ดสั้นๆ อย่างเครื่องซักผ้าที่เปิดประตู หมุนถัง เลื่อนลิ้นชักได้ ก็ยาวแค่ 54 บรรทัด
sand3d คือไลบรารี Python ที่ให้ AI เขียนโมเดล 3D เป็นชิ้นส่วนมีชื่อและข้อต่อขยับได้ ได้โค้ดที่คนอ่านรู้เรื่อง และส่งออกไปเว็บ เกม หรือเครื่องพิมพ์ 3D ได้

ถ้าลองเปิดแกลเลอรีของ sand3d ไลบรารี Python สำหรับสร้างโมเดล 3D แล้วกดเล่นดู จะเห็นเครื่องซักผ้าฝาหน้าค่อยๆ เปิดประตู ถังซักด้านในเริ่มหมุน และช่องใส่ผงซักฟอกเลื่อนเปิดออกมา
พอคลิกที่ชิ้นส่วนไหน โค้ดที่สร้างชิ้นส่วนนั้นก็จะไฮไลต์ขึ้นมาให้เห็นในหน้าต่างข้างๆ ทันที
ที่สำคัญคือ โมเดลเครื่องซักผ้าทั้งเครื่องนี้มาจากโค้ดไฟล์เดียวที่ยาวเพียง 54 บรรทัดเท่านั้น
โค้ดของ sand3d ไม่ได้กำหนดพิกัดทีละจุด แต่ใช้วิธีระบุว่าโมเดลประกอบด้วยชิ้นส่วนอะไรบ้าง แต่ละชิ้นชื่ออะไร และขยับได้อย่างไร ทีม Sandflow ออกแบบไลบรารีนี้มาเพื่อให้ AI เขียนโค้ดสร้างโมเดล 3D ได้โดยตรง คู่มือคำสั่งทั้งหมดจึงสั้นกระชับพอจะใส่ลงใน Prompt หรือข้อความคำสั่งสำหรับ AI ส่วนโค้ดที่ AI เขียนออกมา คนก็ยังอ่านเข้าใจและแก้ไขต่อได้ง่าย
โปรเจกต์นี้เปิดให้ใช้งานแบบโอเพนซอร์สบน GitHub ภายใต้สัญญาอนุญาต Apache-2.0 เบื้องหลังการทำงานใช้โปรแกรม 3D อย่าง Blender โดย sand3d จะสั่งงานผ่านโมดูล Python อย่าง bpy เมื่อสร้างโมเดลเสร็จแล้วก็ส่งออกไปใช้งานต่อได้หลากหลาย ทั้งบนเว็บ เกม ซอฟต์แวร์จำลองหุ่นยนต์ หรือส่งไปพิมพ์ด้วยเครื่องพิมพ์ 3D

กำหนดชิ้นส่วนด้วยชื่อ แทนการไล่คำนวณพิกัดทีละจุด
ปกติถ้าจะให้ AI เขียนโค้ดสร้างโมเดล 3D วิธีที่ตรงไปตรงมาที่สุดคือให้เขียนสคริปต์ Python สั่งงาน Blender โดยตรง แต่วิธีนี้โค้ดมักจะยาวมาก และ AI ต้องคอยคำนวณพิกัดตำแหน่งของแต่ละชิ้นส่วนเองทั้งหมด
sand3d จึงเปลี่ยนวิธีคิดใหม่ จากเดิมที่ AI ต้องคอยตอบว่า "ชิ้นส่วนนี้ต้องวางตรงพิกัดไหน" มาเป็น "โมเดลชิ้นนี้ประกอบด้วยอะไรบ้าง และชิ้นส่วนไหนต่อกับชิ้นไหน" แม้แต่ขอบหรือระนาบของรูปทรงก็ใช้วิธีอ้างอิงด้วยชื่อเรียกแทน
ตัวอย่างที่เห็นภาพชัดที่สุดคือแผ่นยึดบนหน้าแนะนำโปรเจกต์ใน GitHub เป็นแผ่นสี่เหลี่ยมมุมมน เจาะรู 2 รู และลบเหลี่ยมคมที่ขอบด้านบน ทั้งหมดนี้เขียนด้วยโค้ดสั้นๆ แค่นี้:
import sand3d as s3d
def bracket(w=80, d=40, t=6, hole_d=6.6, pitch=50):
plate = s3d.extrude("plate", s3d.rect(w, d, r=4), t)
s3d.hole(plate, hole_d, on=s3d.grid(2, 1, pitch, 0))
s3d.fillet(plate, 1, edges="top")
return plate
s3d.export(bracket(), "bracket.glb")อธิบายการทำงานทีละบรรทัดได้ดังนี้ โดยทุกค่ามีหน่วยเป็นมิลลิเมตร:
import sand3d as s3d: นำเข้าไลบรารี sand3d โดยใช้ชื่อย่อว่าs3dคำสั่งต่างๆ จึงขึ้นต้นด้วยs3d.def bracket(...): กำหนดฟังก์ชันชื่อ bracket พร้อมตั้งค่าขนาดเริ่มต้นไว้ที่พารามิเตอร์ในบรรทัดแรก ได้แก่ กว้าง (w) 80, ลึก (d) 40, หนา (t) 6, ขนาดรูเจาะ (hole_d) 6.6 และระยะห่างระหว่างรู (pitch) 50s3d.extrude(...): วาดสี่เหลี่ยมขนาด 80 x 40 มิลลิเมตร มุมมนรัศมี 4 แล้วยืดความหนาขึ้นมา 6 พร้อมตั้งชื่อชิ้นส่วนนี้ว่า plates3d.hole(...): เจาะรู 2 รู เรียงกันในแนวนอน (2 คอลัมน์ 1 แถว) ห่างกัน 50 มิลลิเมตรs3d.fillet(plate, 1, edges="top"): ลบเหลี่ยมคมขอบด้านบนให้โค้งมนด้วยรัศมี 1 มิลลิเมตรs3d.export(...): สร้างโมเดลแล้วส่งออกเป็นไฟล์bracket.glbซึ่งเป็นไฟล์ 3D ที่เปิดดูบนเว็บหรือนำเข้าเกมได้ทันที
คำสั่ง fillet คือบรรทัดที่แสดงให้เห็นชัดเจนว่า sand3d ใช้วิธีอ้างอิงด้วยชื่อ เพราะโค้ดไม่ได้ระบุพิกัดเลยว่าขอบด้านบนอยู่ที่ไหน แค่ใส่คำว่า "top" ระบบก็จะค้นหาขอบด้านบนแล้วลบคมให้โดยอัตโนมัติ
ถ้าต้องการปรับให้แผ่นยึดกว้างขึ้น ก็แค่เรียกใช้คำสั่ง bracket(w=120) โดยค่าอื่นๆ ยังคงเดิม และไม่ต้องตามไปแก้ตำแหน่งรูเจาะหรือขอบใหม่ทีละจุด

นอกจากนี้ หน้าเอกสารของโปรเจกต์ยังย้ำว่า โค้ดชุดเดิมจะสร้าง Mesh หรือโครงตาข่ายรูปหลายเหลี่ยมที่ประกอบกันเป็นผิวโมเดล 3D ออกมาเหมือนเดิมทุกครั้ง ตรงกันทุกบิต
ข้อต่อ 4 จุดที่ทำให้เครื่องซักผ้าขยับได้

ขณะที่แผ่นยึดเป็นโมเดลชิ้นเดียวที่อยู่นิ่งๆ สิ่งที่ทำให้โมเดลใน sand3d ขยับได้ก็คือข้อต่อ โดยแต่ละจุดเขียนคำสั่ง joint เพียงบรรทัดเดียว ระบุว่าชิ้นไหนขยับ ขยับรอบแกนใด และขยับได้มากน้อยแค่ไหน
สำหรับโมเดลเครื่องซักผ้าในแกลเลอรี กำหนดข้อต่อไว้ทั้งหมด 4 จุด อยู่ในช่วงท้ายของไฟล์ washing_machine.py:
door = s3d.group("door", ring, glass, handle)
s3d.joint("door_hinge", door, hinge, axis="-Z", range=(0, 143))
s3d.joint("drum_spin", drum, front.move(0, 400), kind="continuous")
s3d.joint("drawer_slide", drawer, top_band.move(150), kind="prismatic", axis="+X", range=(0, 200))
s3d.joint("dial_turn", dial, top_band.move(-150), kind="continuous")
return s3d.assembly("washing_machine", cab, drum, door, drawer, dial, front=front)โค้ดแต่ละบรรทัดทำงานดังนี้:
door_hinge: บานพับประตูเครื่องซักผ้า สามารถเปิดออกได้ตั้งแต่ 0 ถึง 143 องศาdrum_spin: ถังซักด้านใน สามารถหมุนรอบตัวเองได้ต่อเนื่องไม่สิ้นสุด เพราะกำหนดประเภทข้อต่อเป็นแบบcontinuousdrawer_slide: ช่องใส่ผงซักฟอก เป็นข้อต่อแบบเลื่อนแนวตรงหรือ prismatic เลื่อนเปิดออกตามแกน +X ได้ระยะ 0 ถึง 200 มิลลิเมตรdial_turn: ปุ่มหมุนเลือกโปรแกรมซัก เป็นข้อต่อแบบcontinuousที่หมุนได้ต่อเนื่องไม่สิ้นสุดเช่นกัน
สังเกตว่าบรรทัดแรกยังไม่ใช่ข้อต่อ แต่เป็นคำสั่ง group เพื่อรวมขอบประตู กระจก และมือจับเข้าเป็นกลุ่มเดียวกัน ทำให้เมื่อบานพับประตูเปิด ทั้งกระจกและมือจับจะขยับตามไปด้วย ส่วนบรรทัดสุดท้ายคือคำสั่ง assembly ที่รวมทุกชิ้นส่วนเข้าด้วยกันเป็นชิ้นงานสมบูรณ์ในชื่อ washing_machine
ใน sand3d มีคำสั่งรวมชิ้นส่วน 3 รูปแบบหลัก ซึ่งแบ่งตามลักษณะการยึดติดของชิ้นงาน:
join: หลอมรวมหลายชิ้นส่วนให้กลายเป็นชิ้นเดียวกันแบบถาวร และใช้วัสดุเดียวกันทั้งหมดgroup: จัดกลุ่มชิ้นส่วนให้อยู่ด้วยกัน โดยแต่ละชิ้นยังแยกจากกันและคงวัสดุเดิมของตัวเองไว้ แต่จะเคลื่อนที่ไปด้วยกันjoint: กำหนดข้อต่อเพื่อให้ชิ้นส่วนหนึ่งเคลื่อนไหวสัมพันธ์กับอีกชิ้นส่วนหนึ่ง
นอกจากนี้ในไฟล์เดียวกันยังมีฟังก์ชัน washer_open() ที่จัดท่าทางของเครื่องซักผ้าไว้ โดยสั่งให้เปิดประตูค้างไว้ที่ 92 องศา เลื่อนช่องผงซักฟอกออกมา 120 มิลลิเมตร และหมุนปุ่มเลือกโปรแกรมไปที่ 30 องศา

ในแกลเลอรีของ sand3d มีตัวอย่างโมเดลกลไกที่ขยับได้แบบนี้ถึง 12 ชิ้น ทุกชิ้นเขียนจบในโค้ดไฟล์เดียวที่ยาวตั้งแต่ 54 ถึง 188 บรรทัด ตัวอย่างเช่น โคมไฟตั้งพื้นที่มีข้อต่อซ้อนกัน 3 ชั้น โดยส่วนคอหมุนรอบเสาได้ แขนโคมไฟยกปรับมุมขึ้นลงได้ และตัวโคมไฟที่ปลายแขนก็ปรับเอียงได้อีกทอดหนึ่ง นอกจากนี้ยังมีตู้เย็นสองประตู ประตูรั้วสองบาน หัวขาตั้งกล้อง กล้องส่องทางไกล ไปจนถึงขวดน้ำที่มีฝาเกลียวหมุนเปิดปิดได้
ใช้ Token น้อยลง 2-6 เท่า จากผลทดสอบของทีมผู้พัฒนา

ทีมพัฒนาวัดความยาวและความกระชับของโค้ดเป็นจำนวน Token ซึ่งเป็นหน่วยนับปริมาณข้อความที่โมเดล AI ใช้อ่าน Prompt และสร้างคำตอบ โค้ดตัวอย่างแผ่นยึด 10 บรรทัดข้างต้นใช้ไปเพียง 121 Token เท่านั้น
การใช้ Token น้อยลง หมายความว่า AI เขียนโค้ดสั้นลงเพื่อให้ได้โมเดลชิ้นเดิม ซึ่งช่วยประหยัดทั้งเวลาประมวลผลและลดค่าบริการเรียกใช้โมเดล AI ที่คิดเงินตามปริมาณ Token โดยตรง
ทีมพัฒนาได้นำโค้ดของ sand3d ไปเปรียบเทียบกับโค้ดที่สร้างโมเดลชิ้นเดียวกันด้วยเครื่องมืออื่นอีก 4 รูปแบบ แล้วนับจำนวน Token เฉพาะเนื้อโค้ดจริงโดยไม่รวมคอมเมนต์
นอกจาก Blender Python แล้ว เครื่องมืออีก 3 ตัวในตารางก็เป็นภาษาและเฟรมเวิร์กสำหรับสร้างโมเดล 3D ด้วยโค้ดเช่นกัน ได้แก่ CadQuery, FeatureScript ของ Onshape และ Articraft โดยคำว่า "ชิ้นส่วน CAD" หมายถึงชิ้นส่วนเชิงกลจากงานออกแบบวิศวกรรม ที่นำมาจากชุดข้อมูลสาธารณะ
ตัวเลขในคอลัมน์สุดท้ายคือค่ามัธยฐาน หรือค่ากลางของจำนวน Token ที่ใช้:
| เทียบกับ | ที่มาของโปรแกรมเปรียบเทียบ | จำนวนชิ้นงาน | ใช้ Token มากกว่า sand3d |
|---|---|---|---|
| Blender Python | ให้ AI เขียนโค้ด | ชิ้นส่วน CAD 30 ชิ้น | 4.0 เท่า |
| CadQuery | โค้ดจากชุดข้อมูล Zero-To-CAD | ชิ้นส่วน CAD 17 ชิ้น | 2.3 เท่า |
| FeatureScript (Onshape) | โค้ดจากชุดข้อมูล CADFS | ชิ้นส่วน CAD 13 ชิ้น | 6.0 เท่า |
| Articraft Python SDK | โค้ดจากชุดข้อมูล Articraft | โมเดลที่ขยับได้ 12 ชิ้น | 2.0 เท่า |
แถวของ Blender Python ยังมีสถิติเพิ่มเติมว่า จากโค้ด 30 ชิ้นที่ให้ AI เขียน มีเพียง 9 ชิ้นเท่านั้นที่รันผ่านและได้รูปทรงถูกต้องตรงกับโมเดล CAD ต้นฉบับ
ขณะที่ฝั่ง sand3d โค้ดทั้ง 30 ชิ้นเป็นโค้ดอ้างอิงที่ทีมงานเขียนเตรียมไว้ในคลังโค้ดของโปรเจกต์เอง และทุกชิ้นสร้างโมเดลได้ตรงกับต้นแบบ
ต้องเข้าใจให้ตรงกันก่อนว่า นี่ไม่ใช่การแข่งกันระหว่าง AI สองฝั่ง ตัวเลข 9 จาก 30 บอกให้รู้ว่า ถ้าปล่อยให้ AI เขียนโค้ด Blender Python ตรงๆ จะพลาดบ่อยแค่ไหน
สามารถดูตารางเปรียบเทียบสถิติและจำนวน Token ของแต่ละชิ้นงานแบบละเอียดได้ที่หน้าเปรียบเทียบ Token บนเว็บไซต์ของโปรเจกต์
ติดตั้ง sand3d แล้วส่งคู่มือให้ AI อ่านก่อนเริ่มงาน
ขั้นตอนที่ 1: เลือกเวอร์ชัน Python ให้ถูกต้อง แนะนำให้ใช้ Python 3.13 หรือ 3.11 แต่ห้ามใช้ Python 3.12 เพราะแพ็กเกจ bpy ยังไม่มีตัวติดตั้งสำหรับเวอร์ชันนี้ ส่วนคนที่ใช้ Mac ชิป Intel แนะนำให้ใช้ Python 3.11 เนื่องจาก bpy ตั้งแต่เวอร์ชัน 5.2 ขึ้นไปไม่มีแพ็กเกจรองรับเครื่องรุ่นนี้แล้ว
ขั้นตอนที่ 2: ติดตั้งด้วยคำสั่งเดียว สามารถติดตั้ง sand3d ผ่านเครื่องมือจัดการแพ็กเกจ pip ได้ทันที:
pip install sand3dถ้าโปรเจกต์ใช้ uv อยู่แล้ว ก็ใช้คำสั่ง uv add sand3d แทนได้เลย ตัว Blender จะติดตั้งมาพร้อมกันในรูปโมดูล bpy อัตโนมัติ ไม่จำเป็นต้องลงโปรแกรม Blender แยกต่างหาก
ขั้นตอนที่ 3: ส่งคู่มือคำสั่งให้ AI ไฟล์ docs/api.md รวบรวมรูปแบบการเรียกใช้ฟังก์ชัน กฎเกณฑ์คำสั่งทั้งหมด พร้อมตัวอย่างโค้ดไว้อย่างครบถ้วน ยาวรวมเพียง 3,643 Token คำแนะนำอย่างเป็นทางการคือให้คัดลอกเนื้อหาทั้งหมดในไฟล์นี้ไปใส่ไว้ใน System Prompt เพื่อเป็นข้อความคำสั่งตั้งต้นก่อนที่ AI จะเริ่มทำงาน ส่วนไฟล์ llms.txt ในโปรเจกต์ก็ทำหน้าที่ชี้ให้ AI ไปหาคู่มือนี้
ขั้นตอนที่ 4: สั่งให้ออกแบบเป็นชิ้นส่วนและวางแผนโครงสร้างก่อน สำหรับโมเดลที่ประกอบด้วยชิ้นส่วนหลายชิ้น หน้า guidelines ของโปรเจกต์ได้วางแนวทางปฏิบัติไว้ 8 ข้อ ซึ่งมีหลักการสำคัญคือ ให้วางโครงสร้างภาพรวมก่อน กำหนดรายละเอียดชิ้นส่วน และเขียนโค้ดแยกตามแต่ละชิ้นงาน
เวลาเขียนโค้ดจริง ลำดับจะเป็นดังนี้: ฟังก์ชันแรกสุดตั้งชื่อตามโมเดลหลัก ฟังก์ชันนี้ไม่สร้างรูปทรงเรขาคณิตเองโดยตรง แต่มีหน้าที่เรียกฟังก์ชันของแต่ละชิ้นส่วนทีละบรรทัด แล้วส่งค่ากลับเป็น s3d.assembly จากนั้นจึงเขียนฟังก์ชันแยกของแต่ละชิ้นส่วน โดยกำหนดขนาดหลักของชิ้นงานไว้เป็นพารามิเตอร์ในบรรทัดแรกของฟังก์ชัน เหมือนตัวอย่างแผ่นยึดข้างต้น
ตัวอย่าง Prompt ด้านล่างเรียบเรียงตามแนวทางนี้ แม้ไม่ได้ยกมาจากเอกสารของ sand3d โดยตรง แต่เปลี่ยนจากตู้ข้างเตียงเป็นโมเดลที่ต้องการได้:
อ่าน docs/api.md ให้จบก่อน แล้วใช้ sand3d เขียนตู้ข้างเตียงที่มีลิ้นชักหนึ่งชั้นและประตูหนึ่งบาน
1. เริ่มจากฟังก์ชันที่ตั้งชื่อตามของ ฟังก์ชันนี้ไม่ต้องสร้างรูปทรง ให้เรียกชิ้นส่วนบรรทัดละชิ้น แล้ว return s3d.assembly
2. เขียนฟังก์ชันละหนึ่งชิ้นส่วน ใส่ขนาดหลักเป็นพารามิเตอร์ของฟังก์ชัน หน่วยมิลลิเมตร ตัวเลขที่คิดจากขนาดอื่นได้ให้เขียนเป็นสูตร
3. ประกาศลิ้นชักกับประตูด้วย s3d.joint พร้อมช่วงที่ขยับได้
4. ห้ามใช้ bpy หรือ bmesh
5. ส่งออกเป็นไฟล์ .glbทั้งนี้ หน้า guidelines ระบุไว้เองว่า กฎชุดนี้สรุปมาจากรูปแบบของโค้ดที่สร้างขึ้นจริง และยังไม่เคยทดสอบอย่างเป็นทางการว่าใช้เป็น Prompt ได้ผลแค่ไหน
กฎเรื่องการคำนวณขนาดจากตัวแปรหลัก เป็นจุดที่ถ้ามองข้ามไปจะไม่เห็นผลกระทบในทันที ตัวอย่างเช่น โมเดลตู้แช่ในเอกสาร แม้จะเขียนโค้ดรันผ่านและได้รูปทรงที่ถูกต้อง แต่โค้ดกลับฝังค่าตัวเลขตายตัวไว้หลายจุด ทั้งที่ควรคำนวณสัมพันธ์กับความกว้าง ความลึก และความสูง พอจะปรับแก้ความสูงของตู้ ตู้ก็พัง
ข้อดีของการเขียนโมเดลด้วยโค้ดที่คนอ่านเข้าใจ จะเห็นผลชัดเจนที่สุดเมื่อเกิดข้อผิดพลาด ในเอกสารเดียวกันมีตัวอย่างโมเดลตู้แขวนผนังที่บานประตูเปิดทะลุเข้าไปในตัวตู้ ซึ่งเกิดจากการกำหนดทิศทางแกนของบานพับเป็น "+Z" แทนที่จะเป็น "-Z" พอส่งกลับไปให้ AI แก้ไข ก็แก้ให้ถูกต้องได้ทันทีเพียงแค่สลับเครื่องหมายตัวเดียว
ส่งออกเป็น GLB, STL หรือ URDF ได้ด้วยคำสั่งเดียว
การส่งออกไฟล์โมเดลใน sand3d ทำได้ด้วยคำสั่งเพียงบรรทัดเดียว เช่น s3d.export(machine, "washer.glb") โดยระบบจะเลือกฟอร์แมตไฟล์ตามนามสกุลที่เราระบุ ทั้ง .urdf, .usda, .obj และ .stl ทั้งนี้ ในขั้นตอนการเขียนโค้ดจะใช้หน่วยวัดเป็นมิลลิเมตร แต่ไฟล์ที่ส่งออกจะบันทึกค่าความยาวเป็นหน่วยเมตรให้อัตโนมัติ
| ไฟล์ | การนำไปใช้งาน | ข้อมูลข้อต่อ Joint |
|---|---|---|
| GLB | ใช้งานบนเว็บ ตัวแสดงผลโมเดล 3D และเอนจินเกม | มีข้อมูลข้อต่อแนบไปด้วย (ตามท่าทางขณะส่งออก) |
| STL | นำเข้าโปรแกรม Slicer สำหรับเตรียมพิมพ์ด้วยเครื่องพิมพ์ 3D | ไม่มีข้อมูลข้อต่อ (เก็บเฉพาะโครงตาข่าย Mesh) |
| URDF | โปรแกรมจำลองการทำงานของหุ่นยนต์ (เช่น ROS, PyBullet, MuJoCo, Isaac) | มีข้อมูลข้อต่อครบถ้วน แยกชิ้นส่วนที่ขยับได้ พร้อมระบุข้อต่อและลิมิตในท่าทางตั้งต้น |
| USDA | NVIDIA Omniverse, Isaac Sim และงานที่ใช้มาตรฐาน USD | มีข้อมูลข้อต่อแนบไปในรูปแบบ OpenUSD พร้อมข้อมูลวัสดุ |
| OBJ | โปรแกรมงาน 3D ทั่วไป | ไม่มีข้อมูลข้อต่อ (เก็บเฉพาะโครงตาข่าย Mesh) |
ข้อควรระวังสำหรับไฟล์ GLB คือ ข้อมูลข้อต่อจะเก็บไว้ในฟิลด์ extras ที่เป็นช่องข้อมูลเสริมของแต่ละชิ้นส่วนในไฟล์ แม้ข้อมูลข้อต่อจะติดไปกับไฟล์ด้วย แต่ไม่ได้หมายความว่าเปิดในเกมแล้วโมเดลจะขยับได้ทันที เพราะโดยทั่วไปยังจำเป็นต้องเขียนโค้ดเพื่ออ่านข้อมูลในฟิลด์นี้มาควบคุมการขยับอีกทอดหนึ่ง
ส่วนไฟล์ STL และ OBJ จะบันทึกเฉพาะโครงตาข่าย Mesh ตามท่าทางของโมเดลขณะส่งออกเท่านั้น ถ้าต้องการพิมพ์เครื่องซักผ้า 3D ในท่าที่เปิดประตูหรือปิดประตู จึงต้องจัดท่าทางของโมเดลให้เรียบร้อยก่อนส่งออกไฟล์
เนื่องจากเบื้องหลังของ sand3d ทำงานบน Blender ฉากทั้งหมดที่ได้จึงเป็นฉาก Blender ปกติ ถ้าต้องการส่งออกไฟล์ฟอร์แมตอื่นๆ ที่ Blender รองรับ ก็สั่งส่งออกต่อจากตรงนั้นได้เลย
sand3d เหมาะกับโมเดลที่มีชิ้นส่วนประกอบ ยังไม่ใช่งานปั้นตัวละคร
ผู้ใช้งานที่จะได้ประโยชน์สูงสุดจาก sand3d คือคนที่ต้องการสร้างโมเดลที่มีชิ้นส่วนประกอบชัดเจน และต้องการความยืดหยุ่นในการปรับขนาดในภายหลัง เช่น เครื่องใช้ อุปกรณ์กลไก หรือเฟอร์นิเจอร์
โมเดลทั้ง 12 ชิ้นในแกลเลอรีล้วนเป็นสิ่งของและกลไก โดยยังไม่มีโมเดลประเภทตัวละครหรือสัตว์เลยแม้แต่ชิ้นเดียว หน้า guidelines ของโปรเจกต์ระบุไว้ชัดเจนว่า รูปทรงอิสระยังคงเขียนด้วยโค้ดได้ยาก ถ้า sand3d ยังไม่มีฟังก์ชันรองรับรูปทรงเรขาคณิตที่ต้องการ การกำหนดตำแหน่งจุดแบบตารางอาจให้ผลลัพธ์ที่ใกล้เคียงกว่า ส่วนรูปทรงที่ยังเขียนไม่ได้ ทีมพัฒนาก็แนะนำให้แจ้งผ่านหน้า Issue บน GitHub เพื่อขอให้เพิ่มคำสั่งใหม่เข้ามา
สำหรับคนที่อยากศึกษาตัวอย่างโค้ดเพิ่มเติมนอกจากในแกลเลอรี ทีมพัฒนาเปิดคอลเลกชันโค้ด sand3d ไว้บนแพลตฟอร์มรวมชุดข้อมูล AI อย่าง Hugging Face คอลเลกชันนี้รวมตัวอย่างโมเดลจาก 5 แหล่งข้อมูล ตั้งแต่ของใช้ในชีวิตประจำวันไปจนถึงชิ้นส่วนเครื่องจักร และเผยแพร่ภายใต้สัญญาอนุญาต CC BY 4.0
แต่ถ้าเป้าหมายคือการให้ AI เข้าไปควบคุมและทำงานในโปรแกรม Blender โดยตรง สามารถอ่านเพิ่มเติมได้จากบทความวิธีสั่ง coding agent ให้ใช้ Blender บน Mac
จุดเริ่มต้นที่ง่ายและเห็นภาพที่สุด คือการลองเข้าไปกดเล่นดูในแกลเลอรีสักรอบ จากนั้นลองให้ AI ช่วยเขียนโมเดลที่มีโครงสร้างง่ายๆ พร้อมข้อต่อสัก 1 จุด เช่น กล่องที่มีฝาเปิดได้
พอโมเดล 3D กลายมาเป็นโค้ดที่คนอ่านเข้าใจ บานประตูที่เปิดผิดทิศทางก็เป็นแค่บั๊กตัวหนึ่ง ที่แก้ได้ด้วยการสลับเครื่องหมายเพียงตัวเดียว
ที่มา:
ชอบเรื่องแนวนี้ มีอีบุ๊คฟรีให้อ่านต่อ
สร้าง Claude Skill แบบไม่ต้องรู้โค้ด คู่มือสร้าง Claude Skill ของคุณเองด้วยการคุยกับ Claude Code เป็นภาษาไทย
กดสมัครแล้วเราจะส่งเทคนิค AI และของแจกใหม่ๆ ให้ทางอีเมล เลิกรับได้ตลอด
Claude Cowork · The Business Playbook

ฉบับภาษาไทย 15 บท เรียนรู้ผ่านโปรเจกต์จำลองต่อเนื่องทั้งเล่ม ตั้งแต่ตั้งค่า Workspace จัดการไฟล์ เชื่อมแอป ตั้งระบบอัตโนมัติ จนถึงสร้าง Plugin


