3D 海龜繪圖
March 14, 2022想像有隻海龜,只會前進與轉彎,在海裡游泳,游過的路線都會留下痕跡,如果這隻海龜很特別,行走時有個規律,那它就會是隻有藝術感的海龜!
t3d 函式
如果想知道怎麼實作 3D 海龜繪圖,可以參考〈CadQuery〉的〈3D 海龜繪圖〉,不過,會想使用海龜繪圖,應該是不太想知道怎麼實作吧…XD
如果想直接基於 3D 海龜來繪圖,dotSCAD 提供了 t3d
函式,它的操作與〈2D 海龜繪圖〉的 t2d
函式類似;當然,因為是 3D,除了 forward
與 turn
(繞自身 z 軸轉動,左轉為正角度)以外,還有 roll
(繞自身 x 軸轉動,左翻身為正角度)與 pitch
(繞自身 y 軸轉動,抬頭為正角度)。
最主要的是,必須從海龜自身觀點來操作(想像你就是海龜),而不是從世界座標的觀點來作。
來看看基於〈2D 海龜繪圖〉的星形畫法,若是加上抬頭的重複,可以繪製出什麼圖案呢?
use <polyline_join.scad>
use <turtle/t3d.scad>
angle = 144;
length = 10;
n = 5;
width = 1;
commands = [["turn", angle], ["forward", length]];
module repeat(t, commands, n, width) {
if(n > 0) {
new_t = t3d(t, commands);
polyline_join([t3d(t, "point"), t3d(new_t, "point")])
sphere(width / 2);
repeat(new_t, commands, n - 1, width);
}
}
t = t3d();
for(a = [0:360/n:360]) {
repeat(t3d(t, [["pitch", a]]), commands, n, width);
}
這可以畫出五個立體的五角星形:
footprints3 函式
t2d
有個對應的 footprints2
函式,t3d
也有個對應的 footprints3
函式,它只接受 "forward"
、"turn"
、"roll"
與 "pitch"
指令,函式會自動生成、管理海龜,如果你只是單純地想讓海龜前進、轉彎、翻身、抬頭,記錄海龜走過的路徑,使用 footprints3
會簡單許多。例如:
use <polyline_join.scad>
use <turtle/footprints3.scad>
angle = 144;
length = 10;
n = 5;
width = 1;
commands = [
for(i = [0:n])
each [["turn", angle], ["forward", length]]
];
for(a = [0:360/n:360]) {
path = footprints3([["pitch", a], each commands]);
polyline_join(path)
sphere(width / 2);
}
這會繪製方才看到的五角星形,來試著使用 footprints3
畫個盤旋:
use <polyline_join.scad>
use <turtle/footprints3.scad>
length = 10;
width = 2;
n = 200;
$fn = 24;
turn_a = 360 / $fn;
pitch_a = 5;
path = footprints3([
for(i = [0:n])
each [
["forward", length],
["turn", turn_a],
["pitch", pitch_a]
]
]);
polyline_join(path)
sphere(width / 2, $fn = 4);
這會繪製出以下的結果:
是不是簡單多了呢?當然,t3d
可以做的事情比較多,這意謂著它可以做到更多 footprints3
做不到的事,像是一些碎形圖案,這就留到下一篇文件再來談了。