Blenderโดย milo อ่าน 8 นาทีเรียบเรียงโดยมี AI ช่วย

วาดเส้นโค้งคณิตศาสตร์ให้เป็นโมเดล 3D ด้วย Lissajous curve Python Blender

เอาสูตรคณิตศาสตร์ที่เคยเรียนมาวาดเป็นเส้นโค้งสวยงามใน Python แล้วยกเข้า Blender สร้างโมเดล 3D ได้จริง พร้อมโค้ดตัวอย่างครบทุกขั้นตอน

สารบัญ

เมื่อสูตรคณิตศาสตร์กลายเป็นงานศิลปะ 3 มิติ

เคยสงสัยไหมว่าเส้นโค้งประหลาดที่เราเห็นในหนังสือคณิตศาสตร์ สามารถกลายเป็นโมเดล 3D สวยๆ ใน Blender ได้ภายในไม่กี่นาที?

ความจริงคือ เส้นโค้งพาราเมตริกอย่าง Lissajous หรือ Hypocycloid ไม่ใช่แค่ทฤษฎีบนกระดาษ แต่เป็นรากฐานของลวดลายศิลปะ เอฟเฟกต์ในเกม และแอนิเมชันที่เราเห็นกันทุกวัน บทความนี้จะพาคุณลงมือเขียน Python เพื่อวาดเส้นโค้งเหล่านี้ แล้วนำไปสร้างโมเดล 3D ใน Blender ผ่าน Python script แบบ step-by-step

ถ้าคุณเคยอ่านบทความเรื่อง "เส้นโค้งพาราเมตริก" ที่เน้นทฤษฎีมาก่อน คราวนี้เราจะเปลี่ยนบรรยากาศด้วยการลงมือทำจริงทั้งใน Python และ Blender เลย

ทบทวนสูตร Lissajous และ Hypocycloid แบบกระชับ

ก่อนเขียนโค้ด เรามาทบทวนสูตรกันสั้นๆ เพื่อให้เห็นภาพก่อน

Lissajous curve

เส้นโค้ง Lissajous เกิดจากการรวมสองการสั่นแบบฮาร์โมนิกที่ตั้งฉากกัน สูตรพาราเมตริกคือ:

x(t) = A * sin(a*t + δ)
y(t) = B * sin(b*t)

โดยที่ A และ B คือแอมพลิจูด, a และ b คือความถี่ ส่วน δ คือเฟส ความน่าตื่นเต้นอยู่ที่ว่า ถ้าอัตราส่วน a:b เป็นจำนวนตรรกยะ เส้นโค้งจะปิดสวยงาม แต่ถ้าไม่ใช่ เส้นจะวิ่งไปเรื่อยๆ ไม่รู้จบ

Hypocycloid

Hypocycloid เกิดจากจุดบนวงกลมเล็กที่กลิ้งอยู่ด้านในวงกลมใหญ่ สูตรคือ:

x(t) = (R - r) * cos(t) + r * cos((R - r)/r * t)
y(t) = (R - r) * sin(t) - r * sin((R - r)/r * t)

เมื่อ R คือรัศมีวงใหญ่, r คือรัศมีวงเล็ก ถ้า R/r เป็นจำนวนเต็ม เส้นโค้งจะมีกลีบสมมาตร เช่น R=4, r=1 จะได้รูปดาวสี่แฉกที่เรียกว่า Astroid

เข้าใจสูตรแล้ว ต่อไปเรามาวาดมันด้วย Python กัน

วาดเส้นโค้งด้วย Python และ matplotlib

ขั้นแรกเราจะใช้ matplotlib เพื่อเห็นภาพเส้นโค้งก่อนนำเข้า Blender โค้ดต่อไปนี้วาดทั้ง Lissajous และ Hypocycloid คู่กัน

import numpy as np
import matplotlib.pyplot as plt

# พารามิเตอร์ Lissajous
A, B = 1.0, 1.0
a, b = 3, 4
delta = np.pi / 2

t = np.linspace(0, 2 * np.pi, 1000)
x_liss = A * np.sin(a * t + delta)
y_liss = B * np.sin(b * t)

# พารามิเตอร์ Hypocycloid
R, r = 5, 1
x_hypo = (R - r) * np.cos(t) + r * np.cos((R - r) / r * t)
y_hypo = (R - r) * np.sin(t) - r * np.sin((R - r) / r * t)

fig, axes = plt.subplots(1, 2, figsize=(12, 5))

axes[0].plot(x_liss, y_liss, color='royalblue')
axes[0].set_title(f'Lissajous (a={a}, b={b}, δ=π/2)')
axes[0].set_aspect('equal')
axes[0].grid(True)

axes[1].plot(x_hypo, y_hypo, color='crimson')
axes[1].set_title(f'Hypocycloid (R={R}, r={r})')
axes[1].set_aspect('equal')
axes[1].grid(True)

plt.tight_layout()
plt.savefig('curves.png', dpi=150)
plt.show()

ลองรันดู คุณจะเห็น Lissajous ที่มีลักษณะคล้ายเชิงเข็มนาฬิกาที่มี 4 แฉก และ Hypocycloid ที่มี 5 กลีบสมมาตร ลองเปลี่ยนค่า a, b หรือ R, r ดู คุณจะพบลวดลายใหม่ไม่รู้จบ

ทีนี้เรามาดูวิธีนำเส้นโค้งเหล่านี้เข้าสู่ Blender

นำเส้นโค้งไปสร้างโมเดล 3D ใน Blender ด้วย Python script

Blender มี Python API ที่ทรงพลังมาก เราสามารถสร้าง curve object จากพิกัดที่คำนวณได้โดยตรง โดยไม่ต้องวาดด้วยมือ

โค้ดสร้าง Lissajous curve ใน Blender

เปิด Blender ขึ้นมา ไปที่ Scripting workspace แล้ววางโค้ดนี้ลงใน Text Editor แล้วกด Run Script

import bpy
import math

# ล้าง scene เดิม
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(use_global=False)

# พารามิเตอร์ Lissajous
A, B = 2.0, 2.0
a, b = 5, 6
delta = math.pi / 2

steps = 1000
t_max = 2 * math.pi

# สร้าง curve data
curve_data = bpy.data.curves.new(name='LissajousCurve', type='CURVE')
curve_data.dimensions = '3D'
curve_data.resolution_u = 12

spline = curve_data.splines.new(type='POLY')
spline.points.add(steps)  # มีจุดเริ่มต้น 1 จุดอยู่แล้ว

for i in range(steps + 1):
    t = (i / steps) * t_max
    x = A * math.sin(a * t + delta)
    y = B * math.sin(b * t)
    z = 0.0  # ปรับให้เป็น 3D ได้ภายหลัง
    spline.points[i].co = (x, y, z, 1.0)

# สร้าง object จาก curve
curve_obj = bpy.data.objects.new('Lissajous', curve_data)
bpy.context.collection.objects.link(curve_obj)

# เพิ่ม bevel ให้เส้นมีความหนา
curve_data.bevel_depth = 0.05
curve_data.bevel_resolution = 4

# ตั้งกล้องให้มองเห็นทั้งรูป
bpy.ops.object.camera_add(location=(0, -6, 5), rotation=(math.radians(45), 0, 0))

กด Run Script แล้วเปลี่ยนมุมมองเป็น Camera View คุณจะเห็นเส้นโค้ง Lissajous ที่มีความหนาสวยงามอยู่ใน scene

ปรับให้เป็น 3D ด้วยการเพิ่มแกน Z

เส้นโค้ง 2D ดูธรรมดาไป เรามาเพิ่มมิติที่สามโดยให้ค่า Z เปลี่ยนตามเวลาด้วย ลองแก้บรรทัดคำนวณพิกัดเป็นแบบนี้

for i in range(steps + 1):
    t = (i / steps) * t_max
    x = A * math.sin(a * t + delta)
    y = B * math.sin(b * t)
    z = 0.5 * math.sin(3 * t)  # เพิ่มความสูงตามแกน Z
    spline.points[i].co = (x, y, z, 1.0)

ตอนนี้เส้นโค้งจะบิดเป็นเกลียว 3 มิติ ดูเป็นประติมากรรมเลย ลองหมุนมุมมองดูจะติดใจ

สร้าง Hypocycloid ใน Blender

โค้ดสร้าง Hypocycloid ก็คล้ายกัน เปลี่ยนแค่สูตรคำนวณพิกัด

R, r = 3.0, 1.0

for i in range(steps + 1):
    t = (i / steps) * t_max
    x = (R - r) * math.cos(t) + r * math.cos((R - r) / r * t)
    y = (R - r) * math.sin(t) - r * math.sin((R - r) / r * t)
    z = 0.3 * math.sin(2 * t)
    spline.points[i].co = (x, y, z, 1.0)

ลองเล่นค่า R และ r ดู เช่น R=5, r=2 จะได้ดาวห้าแฉกบิดเป็นเกลียว

ประยุกต์สร้างลวดลายศิลปะและเอฟเฟกต์เกม

เมื่อเราคุมเส้นโค้งได้แล้ว โอกาสประยุกต์ใช้มีเยอะมาก มาดูตัวอย่างเป็นไอเดียกัน

1. สร้างลวดลายศิลปะเรขาคณิต

ลองสร้าง Lissajous curve หลายเส้นซ้อนกัน โดยเปลี่ยนค่า a และ b ทีละน้อย แล้วให้แต่ละเส้นมีสีต่างกัน จะได้ผลงานศิลปะเชิงเรขาคณิตที่ไม่ซ้ำใคร

colors = [(1, 0.2, 0.3, 1), (0.2, 0.8, 1, 1), (0.9, 0.9, 0.2, 1)]

for idx, (a_val, b_val) in enumerate([(3, 4), (5, 6), (7, 8)]):
    # สร้าง curve แต่ละเส้นตามโค้ดก่อนหน้า
    # แล้วกำหนดสีใน material
    mat = bpy.data.materials.new(name=f'Mat_{idx}')
    mat.diffuse_color = colors[idx]
    curve_obj.data.materials.append(mat)

2. เอฟเฟกต์เส้นวิ่งในเกม

ในเกม เส้นโค้งเหล่านี้สามารถใช้เป็นเส้นทางเคลื่อนที่ของอนุภาค เช่น ผลึกเวทมนตร์ที่บินวนรอบตัวละคร หรือเส้นพลังงานที่ลากเป็นรูป Lissajous คุณสามารถ export curve จาก Blender เป็น .glb แล้วนำเข้าเอนจินเกมอย่าง Godot หรือ Unity ได้เลย

3. โมเดลเส้นโค้งสำหรับ motion graphics

ในงาน motion graphics เส้นโค้ง Lissajous มักใช้เป็นเส้นทางของกล้องหรือวัตถุที่เคลื่อนที่ ลองสร้างเส้นโค้งใน Blender แล้วใช้ Follow Path constraint ให้วัตถุเคลื่อนตามเส้น คุณจะได้แอนิเมชันที่ลื่นไหลสวยงามโดยไม่ต้องคีย์เฟรมเอง

4. สร้างท่อและโครงสร้างจากเส้นโค้ง

ปรับ bevel_depth ให้หนาขึ้น แล้วเพิ่ม modifier เช่น Array หรือ Screw คุณจะได้โครงสร้าง 3D ที่เป็นท่อวิ่งตามเส้นโค้ง เหมาะสำหรับสร้างโมเดลท่อในฉากไซไฟหรือเส้นเคเบิลในฉากอุตสาหกรรม

ทิปและข้อควรระวัง

  • ค่า a และ b ที่เป็นจำนวนเต็ม จะให้เส้นโค้งปิดสวยงาม ถ้าใช้ค่าที่ไม่เป็นจำนวนตรรกยะ เส้นจะไม่ปิดและอาจดูรก
  • จำนวน steps ต้องมากพอ ถ้าน้อยเกินไปเส้นจะเป็นเหลี่ยม แต่ถ้ามากเกินไป Blender อาจทำงานช้า ค่า 1000-2000 มักเพียงพอ
  • ระวัง memory ถ้าสร้างเส้นโค้งหลายเส้นพร้อมกัน ควรลบ curve data ที่ไม่ใช้ออกเพื่อประหยัด memory
  • Export format ถ้าจะนำไปใช้ในเอนจินเกม แนะนำ .glb เพราะรองรับ curve และ material ได้ดีกว่า .obj

สรุป

การนำคณิตศาสตร์ไปสร้างงานศิลปะ 3D ไม่ใช่เรื่องยากอย่างที่คิด ด้วย Lissajous curve Python Blender เราสามารถเปลี่ยนสูตรบนกระดาษให้กลายเป็นโมเดล 3D สวยงามได้ในขั้นตอนไม่กี่ขั้น ตั้งแต่วาดใน matplotlib เพื่อตรวจสอบรูปร่าง ไปจนถึงสร้าง curve object ใน Blender และประยุกต์ใช้ในงานศิลปะ เกม หรือ motion graphics

ข้อดีอย่างหนึ่งของวิธีนี้คือ คุณคุมทุกพารามิเตอร์ด้วยโค้ด หมายความว่าถ้าอยากได้ลายใหม่ แค่เปลี่ยนตัวเลขสองสามตัวก็ได้ผลลัพธ์ใหม่ทันที ไม่ต้องวาดใหม่ทั้งหมด

ลองนำโค้ดในบทความนี้ไปรันดู แล้วลองปรับพารามิเตอร์ดูว่าคุณจะค้นพบลายเส้นโค้งแบบไหนที่ใช่สไตล์คุณ ถ้าได้ผลงานชิ้นโปรด อย่าลืมแชร์ในคอมเมนต์หรือโพสต์ในคอมมูนิตี้ให้เพื่อนๆ ดูกันด้วย

คุณมีเส้นโค้งพาราเมตริกแบบไหนที่อยากลองสร้างใน Blender บ้าง? บอกมาเลย บางทีบทความต่อไปอาจเป็นเส้นโค้งที่คุณเสนอก็ได้

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

พบข้อมูลที่ไม่ถูกต้องหรือคลาดเคลื่อน?เข้าสู่ระบบเพื่อทักท้วง
บทความนี้เป็นอย่างไร?

ยังไม่มีความคิดเห็น — มาเป็นคนแรกกันเถอะ!