Kit API
Her şey kit/iso-kit.ts içindedir; aynı API kit/iso-kit.mjs'te de vardır. Dünya koordinatları [x, y, z]'dir; x ve y zeminde, z yukarı, yaklaşık 1 px'lik birimlerle. Ekran koordinatları SVG viewBox'ındaki [sx, sy]'dir. Yollar 0.1'e yuvarlanmış SVG d dizgileri olarak döner.
İçindekiler
- Türler
- Kamera
- Katılar
- Yüzlerdeki çizgiler
- Parça kütüphanesi
- Hareket eden şeyler
- SVG dizgileri (çerçevesiz)
- Kart ve sayfa
- React bileşenleri
- Herhangi bir eksende yuvarlak parçalar (
kit/lathe.mjs) - Borular, hortumlar ve kablolar (
kit/tube.mjs) - Denetim (
kit/audit.mjs) - WebGL katmanı (
kit/gl.mjs) - Araçlar
- Dönen gruplar (
kit/turn.mjs,turn-build.mjs,turn-audit.mjs)
1. Türler
type Flat = [number, number]; // ekran noktası
type Point3 = [number, number, number]; // dünya noktası
type Plane = [number, number]; // zemin noktası (x, y)
interface Plan { x: number; y: number; w: number; d: number; r: number } // zeminde yuvarlatılmış dikdörtgen
interface Projection { origin: Flat; scale: number; azimuth?: number; elevation?: number }
interface SolidPaths { fill; outline; crease; top; shades: string[4]; bevel?; seamless? }
type Tone = "hi" | "mid" | "lo" | "faint";
type LineTone = Tone | "lit" | "red" | "green" | "blue";
2. Kamera
| Fonksiyon | Ne yapar |
|---|---|
fitProjection(points: Point3[], width, height, { pad = 24, headroom = 0, azimuth = 45, elevation = 30 }) |
Bu noktaları viewBox'ta ortalayan ve sığdıran bir izdüşüm. boxCorners(plan, z0, z1) ve en yüksek uç gibi her uç noktayı verin. |
iso(point, P) |
Dünyadan ekrana. |
depthOf(point, P) |
Büyük değer izleyiciye daha yakın demektir. Arkadan öne boyamak için artan sırada sıralayın. |
towardViewer(P) |
İzleyiciye bakan zemin yönü, [cos a, sin a]. Normali bu yöne bakan yüzler görünürdür. |
screenRise(h, P) |
h yüksekliğinin ekranda kaç px kapladığı. |
cameraOf(P) |
Ham sinüs ve kosinüsler. |
3. Katılar
Tüm katılar prizmalardır: dümdüz yukarı uzatılmış bir zemin dış hattı.
| Fonksiyon | Ne yapar |
|---|---|
slabOf(plan, z, h, P, steps = 8, bevel = 0) |
Yuvarlatılmış bir kutu. steps köşe başına nokta sayısıdır (küçük parçalar için 2–4, büyük yuvarlatılmışlar için 8–10). bevel (0.3–1.6) görünen kenarlar boyunca üstte içeri çekilmiş, siluet köşelerine uzanan bir parlaklık çizgisi ekler. |
cylinder(cx, cy, r, z, h, P, steps = 32, bevel = 0) |
Yuvarlak bir direk, disk, ayak, topuz ya da ped. Küçükler için 16–20, büyük diskler için 56–72 adım kullanın. |
extrude(ring: Plane[], z, h, P, { convex = true, bevel }) |
Herhangi bir zemin dış hattı. İçbükey dış hatlar için convex: false verin (dolgu bir zarf yerine yüzler olur). |
ringOf(plan, steps) |
Noktalar olarak yuvarlatılmış dikdörtgen dış hattı. |
roundedPlan(plan, steps) |
Aynı şey. |
circleRing(cx, cy, r, steps) |
Noktalar olarak bir daire dış hattı. |
insetPlan(plan, by) |
Bir planı küçültür (büyütmek için negatif by kullanın). Yarıçapı makul tutar. |
corners(plan, inset) |
Ayaklar ve vidalar için köşelerden içeri çekilmiş dört zemin noktası. |
boxCorners(plan, z0, z1) |
fitProjection için sekiz köşe. |
haloOf(plan, z, h, P) |
Yumuşak bir gölge için bir dolgu yolu: <path class="iso-halo" d=…>. |
Bir SolidPaths'in içerdikleri:
fill: kâğıt rengindedir, arkadaki her şeyi gizler.shades[0..3]: ışığa nasıl baktıklarına göre gruplanmış görünen yanlar.top: üst yüz, daha açık.crease: üstün görünen yanlarla buluştuğu yer.bevel: isteğe bağlı.outline: siluet.
solidSvg ve <Solid> bunları bu sırayla boyar.
4. Yüzlerdeki çizgiler
| Fonksiyon | Ne çizer |
|---|---|
onTop(points: Plane[], z, P, closed?) |
Yatay bir yüzde bir çoklu çizgi. |
lineOnTop(a, b, z, P) |
Yatay bir yüzde tek bir parça. |
planOutline(plan, z, P, steps) |
Bir yüzde yuvarlatılmış dikdörtgen dış hattı; oluklar ve kakmalar için (insetPlan). |
ring(cx, cy, r, z, P, steps) |
Bir yüzde bir daire; vida halkaları, bezeller ve oturma yerleri için. |
segment(a, b, P) |
Herhangi bir 3B parça. |
rise(at, z0, z1, P) |
Dikey bir parça. |
pointsAt(points, P) |
Vida ve perçin noktaları için bir nokta listesini izdüşürür. |
dotGrid(x, y, cols, rows, gap, z, P) |
İzdüşürülmüş delikler. |
topMatrix(at, z, P, along = "x") |
faceTextSvg/FaceText için metni üst yüze düz yatıran bir dönüşüm. |
sideMatrix(at, z, P, "left" | "right") |
Aynısı, dikey bir yüzde. |
5. Parça kütüphanesi
| Fonksiyon | Döndürdüğü |
|---|---|
knurl(cx, cy, r, z0, z1, count, P, inset = 0.4) |
Bir silindirin görünen yarısında dikey çizgiler. |
sideArc(cx, cy, r, z, P, steps) |
Bir silindir yanındaki yatay bir dairenin görünen ön yarısı: dikişler ve bantlar. |
sideSeam(plan, z, P, steps = 8) |
Aynısı bir kutu için: z yüksekliğindeki yuvarlatılmış planın görünen yakın yarısı; köşelerini dolanır ve tam olarak levhanın dikey siluet kenarlarında biter. Levhanın kendi steps'ini verin ve onu levhanın inner'ı olarak çizin. Bir kutuda kaynak dikişi, bant, kapak dikişi ya da trim çizgisi çizmenin yolu budur: asla köşelerden içeri çekilmiş bir segment değil. |
ringSeam(ring, z, P) |
Herhangi bir zemin dış hattı için sideSeam (extrude'a verdiğiniz halka). |
sideRing(center: Point3, r, "x" | "y", P) |
Dikey bir yüzde bir daire: delikler, çubuk uçları, mercekler. |
coil(from, to, [cy, cz], r, turns, "x" | "y", P) |
Arka → çubuk → ön boyayabilmeniz için { back, front } yay yarıları. |
topTicks(from, to, step, every, edge, z, [minor, major], P, axis) |
Üst yüzde, edge çizgisinden +y (ya da +x) yönünde büyüyen { minor, major } cetvel çentikleri. |
sideTicks(from, to, step, every, face, top, [minor, major], P, axis) |
Dikey bir yüzden aşağı sarkan çentikler. |
radialTicks(cx, cy, r, count, every, z, [minor, major], P, from = 0, span = 2π) |
Kadran ve döner tabla çentikleri. 0 açısı −y'ye bakar ve yukarıdan bakıldığında saat yönünde artar. |
6. Hareket eden şeyler
| Fonksiyon | Ne yapar |
|---|---|
translateAlong(P, [dx, dy, dz]) |
Önceden kurulmuş bir grubu bir dünya ötelemesiyle taşıyan bir "translate(x y)" dizgisi. Kızaklar, çekmeceler, dalıcılar ve kaldırıcılar için kullanın. |
holdStill(element, [dx, dy]) |
element içindeki her [data-hold] öğesine ters ötelemeyi verir; böylece içinde durduğu grup [dx, dy] ekran birimi hareket ederken bir kırpma yerinde kalır. G.rodOut kırpması tutan bir öğeyi her hareket ettirdiğinizde onu aynı ötelemeyle çağırın. |
axisVector(P, [1, 0, 0]) |
Bir dünya biriminin ekran vektörü. İşaretçi hareketini dünya hareketine çevirmek için kullanın. |
z etrafındaki dönmeler bir ekran dönüşümüyle yapılamaz: dönen yolları her karede ya da adımda yeniden kurun. Bu bir ibre, bir işaretçi ya da küçük bir parça için ucuzdur.
7. SVG dizgileri (çerçevesiz)
| Fonksiyon | Notlar |
|---|---|
solidSvg(paths, { tone = "hi", crease = "faint", halo, lit, flat, className, inner }) |
paths.seamless ayarlıyken (pürüzsüz torna gölgelendirmesi, sphereOf) grup data-seamless alır ve ISO_CSS her ton bölgesini kendi renginde 0.4 genişlikte konturlar; böylece yan yana birçok ton levhası kılcal dikiş göstermez. inner, dış hattın (iso-edge) hemen önüne yerleştirilen ek çizgi işaretlemesidir; siluet konturunun altında durması gereken dikişler, kaynak çizgileri ve bant çizgileri için; React Solid onu bir prop olarak alır. |
lineSvg(d, { tone = "lo", dotted, dashed, flow, className, free }) |
flow kesik çizgileri canlandırır; bir yol boyunca hareket eden şeyler için kullanın. free: true (ya da "start", "end") data-free yazar ve scripts/lines.mjs'e bir ucun çıplak bir yüzde durmasının amaçlandığını söyler: basılı metni temsil eden çizgiler, bir ibrenin kuyruğu, bir işaretçinin ucu. Diğer her çizgi ucu bir şeye inmelidir. |
dotsSvg(points, { size = 0.5, tone = "mid", pulse }) |
Bir nokta üçüncü bir değer, opaklığını taşıyabilir ([x, y, 0.4]); dotsOf(..., { fade }) bir cıvata çemberini durdurmak yerine böyle söndürür. |
fadedSvg(list, style) |
ribsOf(..., { fade })'un döndürdüğü gibi her biri bir opaklık taşıyan bir çizgi kümesini çizer: [{ d, alpha }] ya da [d, alpha]. Çizgiler 0.05'lik adımlarla opaklığa göre gruplanır, her grup tek bir <g opacity> içinde, ve 0.02'nin altındaki çizgiler atılır. Üyeleri bir kenara doğru tek tek sönen her doku için kullanın: nervürler, kanatçıklar, tırtıllar, çizgiler. |
fadeLineSvg(points, { fade = [start, end], tone = "lo", className, stops = 6 }) |
Durmak yerine ilk start ve son end px'inde sönen tek bir çizgi (ekran noktaları) (her rampa sönmüş ucunda data-free taşır; böylece çizgi kontrolü onu geçirir). Her rampa kendi kirişi boyunca bir userSpaceOnUse doğrusal gradyanla konturlanır (stops adımda bir smoothstep, renk var(--anatomy-<tone>)'den alınır, böylece iki tema da çalışır) ve orta kısım düz bir lineSvg'dir; böylece üst üste binen uçlar, boncuklar ya da dikişler olmaz. Bir yüzün ortasında biten bir doku çizgisi için kullanın: biten bir oluk, bir köşeye varmadan duran bir kaynak çizgisi, eğri bir plakadaki bir çizgi. Bir rampayı çizginin çeyrek dönüşünden kısa tutun, çünkü doğrusal bir gradyan kirişi izler. Gradyan kimlikleri yolun bir hash'idir; bu yüzden iki kez çizilen aynı çizgi tek bir tane paylaşır. |
wireSvg(from, to, { via = [], tone = "lo", dotted, dashed, flow, ends: "both" | "from" | "to" | "none", size = 1.2 }) |
Uç noktalı bir bağlantı. |
faceTextSvg(transform, text, { size = 3, tone = "mid", anchor }) |
|
groupSvg(children, { class, transform, "data-part": … }) |
|
figureSvg({ width, height, label, body, standalone: false | "dark" | "light", className }) |
<svg>. label erişilebilir açıklamadır: nesnenin ne olduğunu ve neyi gösterdiğini söyleyin. className sınıfına eklenir; bu, onu bir tuvalin altına yığdığınızda işe yarar (rt-back, rp-back). |
8. Kart ve sayfa
| Fonksiyon | Notlar |
|---|---|
plateHtml({ fig, title, hint, readout, keys: [{ mark, label }], caption, body }) |
Kart. mark şunlardan biridir: raised, flat, lit, edge, dim, dotted, dashed, red, green, blue. Okuma öğesi data-readout taşır; böylece canlı kod ona yazar. |
pageHtml({ title, theme = "dark", body, script, width = 650 }) |
ISO_CSS gömülü bağımsız bir belge. |
kitScript() |
scripts/inline-kit.mjs'ten. Sayfa canlandırırken lineOnTop ve translateAlong gibi kit fonksiyonlarını çağırabilsin diye onu script'in başına ekleyin. |
glScript() |
scripts/inline-kit.mjs'ten. Shader'lı bir sayfada kitScript()'ten sonra gömmek için kit/gl.mjs'in kaynağı (GLSL_ISO, glCamera, glLayer, smooth, burst, settle): script: kitScript() + glScript() + live. Kite bağlı değildir; bu yüzden canlı kodu hiçbir kit fonksiyonu çağırmayan bir sayfa onu tek başına gömebilir (Raptor glScript() + LIVE kullanır). Her şey tek bir modül betiğidir; bu yüzden canlı kod smooth, burst ya da settle'ı yeniden bildirmemelidir: ikinci bir const smooth sayfayı öldüren bir SyntaxError'dur. |
turnScript() |
scripts/inline-kit.mjs'ten. Canlı parçaları olan bir sayfa için export'u çıkarılmış 3B çalışma zamanı (TURN, TURN_CSS): script: turnScript() + glScript() + live. İç öğeleri t3/T3_ önekiyle başlar; böylece kitin ve WebGL katmanının yanına gömülür. |
ISO_CSS |
Tüm stiller. kit/iso.css aynı metindir. |
9. React bileşenleri
Sunucuda güvenli olan kit/react/draw.tsx'ten:
<Solid paths tone crease halo lit flat className inner />(inner,solidSvg'deki gibi dış hattın altına yerleştirilen çizgi işaretlemesidir)<Line d tone dotted dashed flow free /><Wire from to via tone dotted dashed flow ends size /><Dots points size tone pulse />(bir nokta,dotsSvg'deki gibi[x, y, alpha]olarak opaklık taşıyabilir)<FaceText transform size tone anchor>text</FaceText><IsoFigure width height label>…svg çocukları…</IsoFigure><Plate fig title hint readout keys caption>…şekil…</Plate>
"use client" olan kit/react/live.tsx'ten:
useReadout(){ anchor, say }döndürür.anchor'ı kök öğenize koyun;say(text)kartın okuma değerini yazar.useLoop(tick: (dt, calm) => keepGoing, running)runningolduğu veticktrue döndürdüğü sürece bir kare döngüsü çalıştırır. Yeniden başlatmak içinkick()döndürür.follow(current, target, dt, seconds, calm)üstel yumuşatmadır.spring(state, target, dt, stiffness, damping, calm)alt adımlı bir yaydır. Oturduğunda true döndürür.useEased(target, seconds)React durumu olarak yumuşatılmış bir sayı döndürür. Küçük şekiller için uygundur.useInView(ref),useStillness(),asksForStillness().Stage,IsoFigure'ın kullandığı sarmalayıcıdır. CSS animasyonları içindata-inviewekler.
10. Herhangi bir eksende yuvarlak parçalar (kit/lathe.mjs)
kit/iso-kit.mjs zeminde duran prizmalar kurar. kit/lathe.mjs bir profili herhangi bir eksen etrafında döndürür; çanlar, yanma odaları, flanşlar, valf gövdeleri, pompa salyangozları, boru bağlantı parçaları, eğik yatan eyleyiciler ve dikey bir yüzdeki konektörler için. slabOf ile aynı SolidPaths'i döndürür; böylece solidSvg onları boyar. import * as G from "../../kit/lathe.mjs" olarak içe aktarın.
Çerçeveler. Bir çerçeve { o, a, u, v }'dir: bir orijin, birim eksen ve iki birim radyal yön. Parça üzerindeki bir nokta (s, r, angle)'dır: o'dan eksen boyunca s, eksenden r ve u'dan v'ye doğru angle.
| Fonksiyon | Ne yapar |
|---|---|
frameAlong(o, a) |
o'dan geçen a ekseninde, u ve v'si sizin için seçilmiş bir çerçeve. Herhangi bir açıdaki borular, göbekler ve flanşlar için kullanın. |
frameOf(o, a, u, v) |
Açıların bir anlam taşıması için açık radyal yönlü bir çerçeve: G.frameOf([0, 0, z], [0, 0, 1], [1, 0, 0], [0, 1, 0]) 0 açısını +x'e yöneltir. |
pointOf(F, s, r, angle) |
Dünya noktası. |
radialOf(F, angle), tangentOf(F, angle), angleToward(F, direction) |
Çerçevedeki yönler ve bir yöne bakan açı. |
Katılar. Bir meridyen eksen boyunca [s, r] noktalarının bir listesidir. Pürüzsüz bir halkayı işaretlemek için üçüncü bir öğe ekleyin ([s, r, 1]); böylece orada kıvrım çizgisi çizilmez. Bunu bir çan ya da kubbe gibi eğri profiller için kullanın. Herhangi bir pürüzsüz köşesi olan bir meridyen kendiliğinden pürüzsüz gölgelenir (smooth varsayılanı "auto"'dur, yani softOf(meridian)); vazgeçmek için smooth: false, pürüzsüz köşesi olmayan bir profilde zorlamak için true ya da { rows } ve analitik bir eğri için { slope } ya da { slope, radius } verin.
Pürüzsüz gölgelendirme. Onsuz her faset satırı tek bir düz ton alır ve eğri bir profil ton bloklarından bir merdiven gösterir (ilk Raptor çanı ve boğazı böyleydi ve gözden geçiren bunu hemen gördü). smooth ile her meridyen parçasının yanı enterpole edilmiş bir normalden gölgelenir: ton sınırları gerçek eş ışık eğrileri olur, rows düzeyde örneklenir ve ton bölgesi başına tek bir çokgen olarak yayılır; böylece tüm parça boyunca temiz eğriler olarak uzanırlar.
smooth: trueher pürüzsüz köşe dizisini ([s, r, 1]) monoton kübik Hermite eğrisiyle (Fritsch–Carlson eğimleri: profilin döndüğü yerde sıfır, başka yerlerde ağırlıklı harmonik ortalama) enterpole eder ve o tek eğriyi normaller, ton levhaları, siluet ve zarf için kullanır; kirişin 0.2 px yakınına inene kadar yeniden örneklenmiş olarak. Gölgelendirme ve dış hat böylece aynı şekli tanımlar ve normal yalnızca profilin değiştirdiği yerde işaret değiştirebilir. Pürüzsüz köşeli her profil için kullanın: kubbeler, boğazlar, koniler, valf şişkinlikleri, bir alev konisi. (Doğal bir spline bir tepenin yakınında aşar; bir valf şişkinliğinde ton bantlarını gövde boyunca zikzak çizdirdi.)smooth: { slope }normali analitik birdr/ds'den alır; böylece bantlara bölünmüş bir gövde tek bir normal alanı paylaşır ve ton eğrileri bant birleşimlerini basamaksız geçer. Yalnızca birslopeile profil noktaları düz birleştirilir; bu yüzden analitikr(s)'yi sık örnekleyin (bir boğazda 20–30 düğüm) ve bel veren bir gövdenin silueti aynıslope'u kullanır; böylece dış hat da gerçek eğriyi izler.smooth: { slope, radius }yüzeyi de analitik birr(s)'den alır: ton levhaları, zarf ve siluet düğümler arasında hepsiradius'u izler; bu yüzden bir bant için iki düğüm yeterlidir.bandsOf'un her banda verdiği budur.- Elle yazılmış düğümler bir eğri değildir. Monoton Hermite yalnızca C1'dir:
dr/ds'si her düğümde düzleşen ve aralarında aşan parçalı ikinci derece bir fonksiyondur; bu yüzden ton bantları duraksar ve sonra sarsılır: oyuklu bir merdiven. Raptor boğazı ([128, 31, 1], [134, 27.6, 1], …) bunu 5×'te gösterdi. Bir bağlantı parçasından büyük her eğri gövde analitik bir profil vesmooth: { slope }alır: boğazr = √(24.2² + (c·(s − 146))²), alev konisi uçtar = 0'a kapananr = 48·(1 − x)^0.8, valf şişkinliği bir elips, yalpa diski18.4 − a·|s − 297.5|⁴'tür. Denetiminwobble'ı,slopeolmadan pürüzsüzleştirilen vedr/ds'si uçları arasında dönen her profili listeler. rows(varsayılan 6) her parça boyunca başlangıç örneklemesidir. Satırlar sonra her ton sınırı düz bir kirişinerror(0.35 px) yakınına inene kadar ve bant sayısının değiştiği her yerdedepth(8) düzeye ya da ekrandafineness'e (0.1 px), hangisi önce gelirse, kadar bölünür; böylece beliren ya da kaybolan bir bant düz bir kesimde bitmek yerine bir şeritte sıfır genişlikte doğar. Her ton sonra kendi bölge sayısı korunduğu sürece, gövdenin her meridyen parçası ve pürüzsüz düğümü boyunca tek bir çokgen olarak yayılır ve yalnızca o ton sayısının değiştiği yerde köprülenir; gelip giden bir bant artık diğer tonları satırlara kesmez. Bu, küçük tornalanmış bir topu yaklaşık yarı boyuta indirdi ve satır dikişlerini kaldırdı. Görünürlük çizilen fasetin normalini kullanır; böylece tonlar her zaman dış hatta ulaşır; her ton çokgeni aynı yönde sarılır; böylece bir tonun üst üste binen parçaları asla bir deliğe dönüşerek birbirini iptal etmez.- Sonuç
seamlessolarak işaretlenir (solidSvg'ye bakın). Düz kapaklar (s'nin değişmediği halkalar) faset gölgelendirmelerini korur.
| Fonksiyon | Ne yapar |
|---|---|
lathe(meridian, F, P, { steps = stepsFor(rMax, 32, 160, scaleOf(P)), fill = "auto", hole = null, bevel = 0, rims = "all", smooth = "auto", waist = 0.5 }) |
Genel dönel katı. Fasetler kitin ışığıyla dört tonda gölgelenir ve extrude gibi gruplanır. fill: "auto" halkaların zarfını kullanır, ancak gerçek siluet onun waist px'den fazla içinde kalırsa (bir boğaz, bir makara) gövdeyi iki yanda görünen uç yaylarıyla birleştirilen silhouettePoints ile doldurur ve dış hatlar (yalnızca siluet tüm yan boyunca kesintisizse: yüzeyi bir yerde size tam olarak bakan bir gövde, örneğin boynundan dik açıyla ayrılan bir valf şişkinliği, zarfa geri döner, çünkü kırık parçaları birleştirmek üzerinde başıboş üçgenler çiziyordu); "surface" bunu zorlar, "hull" zarfı zorlar; fill: "facets" yalnızca görünen fasetleri doldurur ve dış hat çizmez; içeriden görülen içbükey ya da açık bir şekil için buna ihtiyacınız vardır. hole: [s, r] bir borunun ucu için dolguya ve dış hatta yuvarlak bir delik keser. bevel kapalı bir kapaktan (r = 0'da bir meridyen ucu) içeri çekilmiş bir parlaklık ekler. rims dış hattı uç halkalarda tutar: "all", "none", "first", "last" ya da "ends". Yalnızca ilk ya da son halka boyunca olan zarf kenarları düşürülür; iç halkalar boyunca olan kenarlar her zaman kalır; böylece yan siluet bütün kalır. |
solidOf(profile, F, P, options) |
Bir profili iki uçta da eksene kapatır ve en büyük yarıçaptan steps'i seçer. Tornalanmış bir parça yapmanın olağan yoludur: G.solidOf([[0, 12], [6, 12], [8, 9, 1], [20, 9]], F, P). |
bandOfProfile(profile, F, P, options) |
Kapaksız açık bir bant; derinliğe göre sıralanan parçalara bölünmüş uzun bir gövdenin bir uzunluğu için. Tüm gövdeyi bir kerede kesen bandsOf'u tercih edin. |
bandsOf(profile, cuts, F, P, { slope, radius, steps, rows = 6, rims = "none", fill = "auto", samples = 72 }) |
Tek bir eğri gövde (profile boyunca yükselen s), cuts'taki s değerlerinde tek bir normal alanı, tek bir yüzey ve tek bir faset sayısı paylaşan derinliğe göre sıralanabilir bantlara kesilir. Analitik slope ve radius'u verin ya da hiçbirini: o zaman profileCurve(profile) onları profilden yapar (her pürüzsüz düğüm dizisinden geçen monoton Hermite, başka yerlerde düz); böylece hiçbir bantın kendi uç eğimleri olmaz. { bands, sidesOf, radius, slope, steps, s0, s1 } döndürür. Her bant { s0, s1, profile, paths, outline, seam }'dir: paths dış hattı temizlenmiş olarak solidSvg için hazırdır, outline gerekirse bantın kendi kiriş dış hattıdır (Raptor eteğinin son bandı onu korur), seam bir sonraki bantla buluştuğu görünen yaydır (inner'a koyun) ve profile denetim için kaydedilecek olandır (A.solid(F, band.profile, { radius })). sidesOf(from = s0, to = s1, { ends = false | true | "first" | "last", count = samples }) { d, points } döndürür: gövdenin o aralıktaki iki analitik yan kenarı tek bir yol olarak, isteğe bağlı olarak uçlarında görünen kenar yaylarıyla, artı kaydedilecek 3B noktaları (points.map((list) => A.tube(list, 0.4 / scale))). Dış hat tek bir sürekli eğri olsun diye d'yi bantların üzerinde küçük bir derinlik sapmasıyla tek bir öğe olarak çizin. |
profileCurve(profile, { slope, radius }) |
s'si yükselen bir profil için { s0, s1, radius(s), slope(s) }: smooth'un içinden çizdiği eğri. s yükselmezse hata fırlatır, çünkü bir profildeki basamak bir kıvrımdır ve ayrı bir katıya aittir. |
outlineOf(meridian, F, P, { steps, fill, hole, rims, smooth, waist }) |
Dış hattını ayrı çizdiğiniz bir gövde için lathe'in gölgelendirmesiz yalnızca fill ve outline'ı. |
softOf(meridian) |
Herhangi bir köşe pürüzsüz işaretliyse true. |
disc(s0, s1, r, F, P, options) |
Eksende kısa bir silindir: diskler, flanşlar, göbekler, pimler, tıpalar. |
ringBand(s0, s1, rIn, rOut, F, P, options) |
Kalınlığı olan bir halka: bir şeyin çevresinde bir flanş ya da bilezik. |
stepsFor(radius, least = 16, most = 112, scale = 0) |
Bir faset sayısı. scale ile (birim başına ekran px'i, scaleOf(P)) her faseti ekranda yaklaşık 3 px uzunlukta tutar; disc, ringBand, solidOf, bandOfProfile ve lathe steps vermediğinizde bunu kullanır (32–160). Fasetler yalnızca ton dolgularını belirler: dış hatlar, kenarlar, kıvrımlar ve pahlar gerçek daireden yaklaşık 1.5 px'te örneklenir ve tam olarak yüzlerin döndüğü yerde biter. |
saddleOf(F, a, start, s1, P, { steps }) |
Bir eyer pedi: F.a boyunca eğri bir ev sahibi yüzeyinden s1'deki düz bir yüze uzanan a yarıçaplı bir silindir. start(angle) her doğurucunun ev sahibinden ayrıldığı yerdir (ev sahibinin sdf'ini ikiye bölerek bulun) ya da F.a'ya dik bir ev sahibi silindir için bir R sayısı (o zaman saddleStart(R, a, angle) her doğurucunun başlangıcını verir). Dolgu görünen fasetlerinin ve yüzünün birleşimidir, dış hat iki yan doğurucusu, eyer eğrisinin görünen kısmı ve yüz kenarıdır; böylece ev sahibiyle gerçek kesişim boyunca buluşur. Eğri bir gövdedeki düz bir flanşın kenar boşluğu bırakacağı her yerde flanşları onun üzerine oturtun. |
prismOf(F, polygon, s0, s1, P) ve stadium(r0, r1, offset) |
Çerçevenin u, v düzleminde herhangi bir dışbükey [x, y] çokgeninin F.a boyunca uzatılmış prizması; faset tonları, dolgu ve dış hat olarak zarf ve yalnızca keskin köşelerde kıvrımlarla. stadium iki dairenin zarfıdır; bir motoru bir eyleyiciye birleştiren bir dişli kutusu plakası için. |
sphereOf(centre, r, P, { steps = 48 }) |
Tam pürüzsüz tonlu bir top: her ton bölgesi küresel bir kapağın izdüşürülmüş zarfıdır; bu yüzden tornalanmış bir profil yerine dört küçük çokgene mal olur. Çubuk ucu yatakları, T bağlantı parçaları ve topuzlar için kullanın. seamless'tir. |
silhouettePoints(profile, F, P, { samples = 72, slope, radius }) |
Dış hattın şeklini denetim için kaydetmek üzere silhouetteOf'un iki yan kenarı 3B nokta listeleri olarak. |
silhouetteOf(profile, F, P, { samples = 72, slope, radius }) |
profile'dan ([s, r] noktaları, doğrusal enterpole) geçen dönel yüzeyin iki analitik yan kenarı, iki çoklu çizgiden tek bir yol olarak: yüzeyin izleyiciden uzağa döndüğü noktalar (`cos(θ − φ) = r′·aV/ |
Yuvarlak yüzeylerde çizgiler ve noktalar. Bunlar yalnızca izleyiciye bakanı çizer. slope, o halkadaki yüzeyin dr/ds'sidir; böylece bir koni ya da çandaki bir çizgi gerçek yüzeyin döndüğü yerde gizlenir.
| Fonksiyon | Ne yapar |
|---|---|
arcOf(F, s, r, P, { slope = 0, steps, least = 0.02, inward = false, from = 0, to = 2π, trim = 0.3 }) |
Yüzeydeki bir halkanın görünen yayı: dikişler, bantlar, kaynak çizgileri, bir dudak. Kenar açıları tam olarak çözülür (t = φ ± acos(c)) ve kenarda duran her uç, yuvarlak ucu dış hat konturunun içinde kalsın diye trim px kısaltılır. inward: true bir lülenin içi gibi iç bir yüzeyde gördüğünüz yayı çizer. least: -1 tüm halkayı verir. Dikişleri dış hattın altına çizin: solidSvg(paths, { inner: lineSvg(arcOf(…), { tone: "faint" }) }). Katıdan sonra eklendiğinde soluk bir dikiş ucu kenar konturunun üzerine boyar ve her dikişte silueti çentikler. |
circleOf(F, s, r, P, steps) |
Tam kapalı bir daire; bir yüz halkası, bir delik ya da doldurduğunuz bir boşluk gibi. |
ribsOf(F, s0, s1, r, count, P, { phase, twist, least = 0.12, r1 = r, fade, seams }) |
Görünen eksenel çizgiler: herhangi bir eksen boyunca bir tırtıl, nervürler ya da kanatçıklar. twist onları sarmal yapar ve r1 bir koni boyunca uzanmalarını sağlar. fade: [lo, hi] ile [{ d, alpha }] döndürür; her nervürün opaklığı size ne kadar baktığının bir smoothstep'idir; böylece küme least'te durmak yerine dönüşe doğru söner. Onları fadedSvg ile çizin. seams: true (ya da "first", "last") sonuca s0 ve s1'deki dikiş yaylarını ekler (tam opaklıkta); böylece bir nervür sırası ve bittiği dikişler her zaman tek bir s'yi paylaşır; bunu yalnızca nervürlerin zaten çizilmiş bir basamakta ya da bant ucunda bittiği yerde kapalı bırakın. |
rodOut(F, from, to, r, P, { stroke, ...latheOptions }) |
s = from'daki bir salmastradan kayarak çıkan bir çubuk (F.a ondan dışarı bakar); ucu dinlenmede to'da, stroke kadar daha dışarı gider ya da aynı çubuk onun içine geri çekilir. { paths, clip, from, to, stroke, reach } döndürür: paths, from − stroke'tan to'ya tek bir çubuktur ve clip, çubuğu salmastra yüzünden to + stroke'a kadar kaplayan bir yoldur. <clipPath id><path data-hold d=clip/></clipPath><g clip-path=url(#id)>solidSvg(paths)</g> çizin, öğeyi hareket ettirin, holdStill'i çağırın ve A.slide(F, from, to, r)'yi kaydedin (craft.md, bölüm 3). |
spokesOf(F, s, r0, r1, count, P, { phase, sweep, from, to }) |
Bir yüzde radyal çizgiler; kanatlar ve türbin kanatçıkları için. |
dotsOf(F, s, r, count, P, { phase, slope, least = 0.08, all = false, fade }) |
Görünen taraftaki bir cıvata çemberinin ekran noktaları. Onları dotsSvg'ye verin. Tam karşıdan gördüğünüz bir yüz için all: true kullanın. 0'ın epey üstünde bir least çemberi yüzeyin ortasında durdurur; bunun yerine fade: [0.04, 0.42] verin, noktalar azalan bir opaklık taşısın. |
fadeOf(value, [lo, hi]) |
İki sönmenin de kullandığı smoothstep. |
facingOf(F, angle, P, slope) |
O açıdaki bir yüzeyin izleyiciye ne kadar baktığı. Pozitif görünür demektir. |
3B'de yollar, borular ve kablolar için.
| Fonksiyon | Ne yapar |
|---|---|
fillet(points, radius, perArc = 7, { P, tube, margin = 1.3 }) |
Bir çoklu çizginin her köşesini radius bükümüyle yuvarlatır; mevcut alana (daha kısa bacağın 0.48'i) sınırlanmış olarak. Bir boruyu birkaç düz bacak olarak yerleştirin, sonra fileto yapın. P ve tube (boru yarıçapı) ile her köşenin bükümü margin · tube / (0.7 · f²)'ye büyür; burada `f = |
resample(points, spacing), pathLength(points), cut(points, from, to) |
Eşit aralık, toplam uzunluk ve yay uzunluğuna göre bir alt yol. |
pointAlong(points, at), tangentAlong(points, at) |
Bir yay uzunluğundaki konum ve yön. Bunları bir yola flanşlar, bantlar, valfler ve kelepçeler yerleştirmek için kullanın. |
spiral(F, s, r0, r1, a0, a1, steps = 28) |
Bir pompa salyangozu gibi genişleyen bir sarmalın 3B noktaları. Onları bir yarıçap fonksiyonuyla tubePieces'e verin. |
arcPoints(F, s, r, a0, a1, steps = 24) |
Bir manifold, bir su püskürtme halkası ya da bir kablo demeti şeridi gibi bir halkanın çevresindeki 3B noktalar. |
Kamera ve vektörler.
viewOf(P)izleyiciye birim yöndür; bu yüzdendot3(p, viewOf(P))depthOf(p, P)'ye eşittir.lightOf(P)kitin ışığıdır.scaleOf(P)dünya birimi başına ekran birimidir.toneOf(normal, P)vebandOf(score)dört tonlu grubu verir.hullOf(points)verunsOf(flags)modülün kendi kullandığı zarf ve dizi yardımcılarıdır.- Vektör yardımcıları
dot3,add3,sub3,mul3,len3,unit3,cross3velerp3'tür.
Bantlarda uzun bir eğri gövde. Her bant onu saran borulara karşı derinlik sıralansın diye onu bandsOf ile kesin. Her bant gövdenin steps'ini, normal alanını ve yüzeyini paylaşır; böylece ton eğrileri her birleşimi basamaksız geçer ve dış hat her birleşimde kırılan bant başına bir kiriş yerine sidesOf'tan tek bir eğri olarak gelir. Raptor çanı:
const BELL = G.bandsOf([[3.2, bell(3.2)], [116, bell(116)]], [14, 28, 44, 60, 76, 92, 106], ENGINE, P, { radius: bell, slope: bellSlope, steps: 96, rows: 8 });
BELL.bands.forEach((band, index) => put("nozzle", ex(ENGINE, (band.s0 + band.s1) / 2), S(band.paths, { tone: "hi", inner: index === 2 ? Ln(band.seam, { tone: "faint" }) : "" }), { shapes: [record(A.solid(ENGINE, band.profile, { radius: bell }))] }));
const SIDES = BELL.sidesOf(3.2, 106, { ends: "first" });
put("nozzle", ex(ENGINE, 105), Ln(SIDES.d, { tone: "hi" }), { bias: 0.2, shapes: SIDES.points.map((points) => A.tube(points, 0.4 / KS)) });
Bantları, kendi Hermite uyumlarıyla iki düğümlü kirişler üzerinde ayrı bandOfProfile çağrılarından elle kurmayın: o zaman her bantın kendi uç eğimleri olur, tonları her birleşimde basamak yapar ve kiriş dış hattı kırılır.
Bilinen tuzaklar.
- Dört ton nicemlemesi, bir gövde pürüzsüzleştirilmediğinde her faset satırının eğimini izler. Her eğri düğümü pürüzsüz işaretleyin (
[s, r, 1]) ve gölgelendirme kendiliğinden izlesin; hâlâ bir eğriyi tanımlayan sert düğümlü bir profilsmooth: truegerektirir. Bantlara kesilmiş bir gövdedebandsOfkullanın. - Pürüzsüz gölgelendirme daha ağırdır.
smooth'lu küçük tornalanmış bir top yaklaşık 9 KB'a mal olur;sphereOf3 KB'ın altındadır. Toplar içinsphereOfkullanın ve küçük parçalardarows'u düşük tutun.
11. Borular, hortumlar ve kablolar (kit/tube.mjs)
import { tubePieces, tubeSvg, runsOf, crossingsOf } from "../../kit/tube.mjs";
| Fonksiyon | Ne yapar |
|---|---|
tubePieces(points3, radius, P, { maxLength = 30, spacing = 2.2, closed = false, breaks = [], gaps = [], caps = true, stripes = "auto" }) |
3B bir yolu en fazla maxLength dünya birimlik parçalara böler. Her biri kâğıt bir gövde, ışığa doğru bir parlaklık bandı, ondan uzağa bir gölge bandı ve iki kenar çizgisiyle 2B bir şerit olarak çizilir. Komşu parçalar 0.5 birim örtüşür ve kenar çizgileri gövdeyle aynı örtüşen aralıktan kesilir; böylece bir birleşimde ne dikiş ne de dış hatta çentik görünür. Parlaklık ve gölge her açık uçta gövdeden 0.5 daha uzanır; böylece bir şerit altındaki gövdenin kenar yumuşatmalı kesimini örter ve kendi kesimi komşunun özdeş şeridinin üzerine düşer; her çerçeve normali tüm yol boyunca merkezi bir farktır; böylece iki parçanın şeritleri örtüştükleri yerde tam olarak çakışır (ikisi de tek bir çizgide kesildiğinde salyangozun gölge bandını her birleşimde kılcal bir çizgi kesiyordu). radius bir sayı ya da sivrilmeler ve salyangozlar için t'nin (yol boyunca 0'dan 1'e) bir fonksiyonudur. breaks bir parçanın bitmesi gereken yay uzunluklarıdır (bir kesişmede ya da borunun bir parçanın yanından geri döndüğü yerde). gaps, bir bilezik, kelepçe, valf ya da bağlantı parçası onları örttüğü için çizilmeyen [from, to] yay uzunluğu aralıklarıdır; boru bir boşluğun her iki yanında düz biter. Bir boşluğun yanındaki her uç eliptik bir kapak alır (izdüşürülmüş kesit, dış yarım yayı bir kenar olarak) ve caps: false (ya da başlangıcı bir T bileziğinin içinde gizlenen bir kol için [false, true] gibi [start, end]) vermedikçe yolun kendi iki ucu da; böylece bir boru bir flanş yüzüyle düz bir kesim yerine doğru eğri boyunca buluşur. Parlaklık ve gölge şeritleri kapağı izler: uç yüzü uzağa dönükken elipsin dış yarısına ve yüz size dönükken iç kenarına (bir kenar olarak çizilir) kadar; böylece hiçbir şerit uca varmadan durmaz. Boşluksuz kapalı bir yol ilk ve son parçalarını birbirinin çevresine sarar. [{ mid, body, shine, shade, edges, wide, points, radii, ends, from, to }] döndürür: mid derinlik sıralaması için parçanın dünya uzayındaki merkezidir; wide, yol ekranda parlaklık ve gölge bantları için yeterince geniş olduğunda true'dur (tüm yol için en geniş noktasından bir kez karar verilir; böylece bir sivrilme bir parça birleşiminde şeritlerini asla düşürmez; stripes: true ya da false bunu geçersiz kılar); points ve radii parçanın 3B merkez çizgisi ve yarıçaplarıdır (denetim için kaydedin); ends hangi uçların bir komşuyla birleşim değil, gerçek uç olduğunu söyler. |
tubeSvg(piece, { tone = "hi" }) |
Tek bir parça <g class="tb"> olarak. Parlaklık ve gölge yalnızca wide parçalarda görünür, sonra parçanın halkaları (.tb-ring), sonra kenarlar. |
tubePieces(…, { rings: { pitch = 3, twist = 0, cross = false, fade = [0.1, 0.55], phase = 0, steps = 16, tone = "lo" } }) |
Borunun kesitini izleyen bir doku: bir örgü, oluk, bant sargısı ya da zırh. İstasyonlar yolun başından her pitch birim 3B yay uzunluğunda durur (phase onları kaydırır); böylece desen her parça birleşiminden sürekli geçer; her biri oradaki kesitin görünen ön yayı olarak çizilir, opaklığı fadeOf(facing, fade) olan kısa parçalara bölünür; böylece doku sert bir çizgide bitmek yerine iki kenara doğru söner. twist (yarıçap cinsinden) her halkayı kenardan kenara o kadar ilerleyen bir sarmala çevirir ve cross: true bir örgü için diğer yönü ekler. Halkalar her parçanın şerit taşması üzerinden uzanır; böylece bir birleşimdeki sonraki parça kendi gövdesinin kesiminin üzerine özdeş bir parça çizer ve gerçek uçlarda ve boşluk yüzlerinde durur (halkalar bir uç yüzünden bir pitch'in üçte biri uzak durur, sarmallar onun üzerinde biter). Her parça rings: [{ d, alpha }] taşır; ringsSvg(rings, tone) onları tek başına çizer. |
runsOf(total, gaps) |
gaps çıkarıldıktan sonra total uzunluğundaki bir yolun çizilen [from, to] aralıkları. Her diziyi denetim için kendi borusu olarak kaydedin. |
crossingsOf(points, centre, axis, radius) |
Bir yolun bir kelepçe ya da bileziğin diskini kestiği yay uzunlukları (centre'dan geçen, axis'e normal, radius içindeki düzlem). Her birini kelepçenin kalınlığında bir boşluğa çevirin. |
.tb-body, .tb-shine ve .tb-shade dolguları ISO_CSS'in (ve kit/iso.css'in) parçasıdır; bu yüzden tubeSvg ek CSS olmadan herhangi bir kit sayfasında çalışır. Onları sayfa CSS'inde yalnızca boruları yeniden stillendirmek için geçersiz kılın; Raptor'un seçili parçalar için yaptığı gibi (.it[data-on] .tb-body).
Boruları derinliğe göre sıralamak. Bir boru birçok derinlikteki parçalar arasından geçer; bu yüzden her parçayı kendi derinliğinde çizin: onu öğe listenize G.dot3(piece.mid, G.viewOf(P)) anahtarıyla, geçtiği katıların yanına koyun. Bir borunun komşular arasında dokunduğu yerde kısa parçalar (maxLength 6–18) ve zeminde düz yatan bir halka için uzun parçalar (400) kullanın. Bir boruyu SVG katmanları arasında bölmek için piece.mid'i test edin. Dalga leğeninin motor kablosu üç yola ayrılır: köprünün üzerindeki parçalar (piece.mid[2] > Z.top - 1 && piece.mid[1] < IN.y + IN.d - 10) çubuktan önce ön SVG'ye, kenarın üstündeki geri kalanı yakın kapaklardan sonra ön SVG'ye ve ayaktan kontrol kutusuna inen uzunluk orta SVG'ye. Lamba kablosu taban kenarının üzerinden sarkan parçaları (piece.mid[1] < BASE.y - 0.2) arka SVG'ye gönderir. Raptor kadar yoğun bir şekilde bu anahtarları gözle ayarlamayın: parçaları kaydedin ve orderKeys'in (bölüm 12) onları oturtmasına izin verin.
Bir boruyu saran her şey onu böler. Bir bilezik, bant, körük diski, kelepçe ya da valf gövdesi üzerinde durduğu borudan geniştir. Boru onun içinden tek parça geçerse, parça bileziğin hem arkasında hem önündedir ve hiçbir anahtar onları sıralayamaz: bilezik ya borunun yakın tarafını gizler ya da boru bileziğin yüzünün üzerine boyar. Boruyu bilezikte boşluklu bırakın (gaps: [[at - t/2, at + t/2]]): uzak parça bileziğin arka yüzünde biter, yakın parça ön yüzünde başlar ve ikisi de temiz sıralanır. Raptor'un pipe()'ı bunu kendi uç flanşları, bantları, körükleri ve valfi için, cable() ise crossingsOf aracılığıyla kablo demeti kelepçeleri için yapar.
Raptor'un pipe() yardımcısı iyi bir kalıptır:
- Kontrol noktalarını 2.6 × r'lik (en az 3) bir bükümle
filletyapın. Bir valf ya da körük en az gövdesi artı iki fileto kesimi (her birir_bend · tan(turn / 2)) kadar uzun düz bir bacak gerektirir; onu bir bükümün üzerine koyarsanız uçları boruya keser. - Önce bilezikleri (uç flanşları, bantlar, körük diskleri, valf gövdesi) hesaplayın ve aralıklarını
gapsolarak verin. - Yolu
tubePiecesyapın; her parçayıpointsveradii'siyle ve çizilen her diziyi denetim için bir boru olarak kaydedin. - Bilezikleri boruya ait olarak (
owner) çizin; böylece denetim bir borunun kendi flanşını bir çarpışma olarak saymaz.
cable(), kendi grubunda kalan bir uca bir uç noktası ve başka birine inen bir uca bir konektör kabuğu (shells: [start, end]) ekler; böylece şekil söküldüğünde her kablo hâlâ bir şeyde biter. İki yardımcı da şekil sökülmüşken bağlantısından çıkan bir uç için free: [start, end] alır ve { P, tube: r } ile fileto yapar (fillet'e bakın). İzleyiciye bakan bir porttan ayrılması gereken bir hat bir elbow'dan başlar (göbek üzerinde bir bilye, iki birleşimde de küre üzerinde kenar, hat ondan bir sonraki noktasına doğru ayrılır); böylece dönüş bir bağlantı parçasının içinde olur. pipe() her uç flanşının arka yüzünü yol ucuna koyar ve bir hattı flanş yerine bir coupling'de (hızlı ayrılan bir bağlantıda bir rakor somunu) bitirebilir.
12. Denetim (kit/audit.mjs)
import * as A from "../../kit/audit.mjs";
Tek satırlık kanca. Bir kaydedici yapın, her çizim yardımcısının öğelerini koymasına ve şekillerini ona kaydetmesine izin verin, anahtarları oturtun ve derlemeyi auditOrExit ile bitirin:
const R = A.recorder(P, { order: STAGGER, spring: SPRING });
R.put({ piece: "base", at: centre, bias: 0.1, svg, shapes: [R.solid(A.slab(plan, 0, 6, { name: "base.plate" }))] });
R.route("base.cable", route, 0.6, { piece: "base", gaps, limp: true });
A.settle(R, P);
R.items.sort((a, b) => a.key - b.key);
A.auditOrExit(R, P, { crowd: [] });
node build.mjs --audit sonra raporu yazdırır ve herhangi bir başarısız satırda sıfır olmayan kodla çıkar; bayrak olmadan auditOrExit hemen döner. Sökülmeyen bir şekil order vermez ve her patlatma kontrolü dinlenme pozuna indirgenir.
| Fonksiyon | Ne yapar |
|---|---|
recorder(P, { order = [], spring = {}, ground = grounded }) |
{ items, solids, tubes, routes, put, solid, route, nameFor }. put({ at, bias, key, name, piece, move, ride, shapes, ...rest }) çizilen bir öğe ekler (key vermedikçe anahtarı dot3(at, V) + bias'tır; svg, route ve chunk gibi geri kalanı öğede tutulur) ve şekillerine öğenin move, ride ve piece'ini damgalar. solid(shape) bir şekli kaydeder ve döndürür; öğenin shapes'i için ya da sıralanmış katmanın dışında çizilen statik parçalar için. route(name, points, radius, { owner, touch, bundle, limp, gaps, closed, ends, rims, free, piece, move, ride }) bir boru ya da kabloyu kaydeder: gaps arasındaki çizilen her dizi için tips, tipAxes, tipRims ve free uçlarıyla bir boru, artı folds ve crowding için yol. nameFor(base) tekrarlanan adları numaralandırır (base, base#2, …). order ve spring canlı sayfanın kademesi ve yayıdır. |
explodeStates(order, spring, { uniform = 10, stride = 4 }) |
{ depth, frames, apart }: derinlik çözücü durumları (tekdüze paylar, her kademe sınırında geri dönüşlerle her stride'ıncı yeniden oynatılan kare, önek durumları) ve açıklık kareleri (her yeniden oynatılan kare artı önek durumları). Hiçbir şey sökülmediğinde { depth: [0], frames: [] }. |
settle(R, P, { states, skip = sameRun, ...overlapOptions }) |
overlapsOf ve orderKeys'i çalıştırır ve anahtarları öğelere yazar. Öğelerin sahip olduğu sırayı korur; bu yüzden R.items'ı sonradan sıralayabilirsiniz. Her derlemede çalıştırın. |
audit(R, P, { allow, crowd, cover, ground, frames, apart }) |
Kaydedilmiş şekiller üzerinde aşağıdaki her kontrol, report ve failures için tek bir sonuç olarak: dinlenmede, sökülmüşken ve her karede açıklık, katı açıklığı, dinlenmede ve sökülmüşken sıkışıklık (ince katılara karşı da), vekil şekiller, uç noktaları, açık uçlar, katlanmalar, kendiyle örtüşmeler, dalgalanma, oturmalar, destekler ve derinlik sırası. allow derinlik çiftlerini, crowd sıkışıklık çiftlerini, cover vekil öğeleri mazur gösterir. Asla çizgi işaretlemesini görmez: bunun için sayfada scripts/lines.mjs çalıştırın. |
auditOrExit(R, P, { flag = "--audit", argv, ...auditOptions }) |
Bayrakla: audit, raporu ve bir özet satırı yazdırır ve herhangi bir başarısızlıkta process.exitCode = 1 yapar. |
sameRun(a, b), grounded(shape) |
Tek bir yolun komşu parçaları (örtüşme geçişinde atlanır) ve varsayılan zemin (meta'sında ground: true olan ya da adı stand. ile başlayan bir şekil). |
keyAt(item, state, V), labelOf(state), cameraBasis(P) |
Bir öğenin bir patlatma durumundaki sıralama anahtarı (key + lift · share), bir durumun yazdırılabilir etiketi ve kendi sondalarınız için kameranın ekran-sağ, ekran-aşağı ve izleyiciye-doğru birim vektörleri { R, D, V }. |
Ayrıntılı bir şekil, bir gözden geçiren yakınlaşana kadar gözün kaçırdığı şekillerde başarısız olur: dinlenmede ya da patlatmanın herhangi bir karesinde bir şeyin içinden geçen bir boru ya da kablo, bağlantısından havada kalan bir flanş, havada asılı ya da komşusuna gömülü bir parça, ekranda geri dönen ya da bir noktaya sıkışan bir yol, başka bir çizginin dış hattına düşen bir büküm ya da uç, şekil söküldüğünde sarkan bir kablo ucu ve örtüştükleri yerde yanlış sırayla çizilen iki şey. Denetim bunların hepsini gerçek geometriden ölçer. Raptor'da (478 öğe, 1.119 derinlik durumu, açıklık için yaklaşık 4.400 yeniden oynatılan ve önek karesi) anahtarlar her derlemede yaklaşık bir dakika ve tam bir --audit toplamda yaklaşık üç dakika sürer; çoğu kare başına açıklıktır.
Şekiller. Çizdiğiniz her şey için, inşa ederken, dünya birimlerinde bir şekil kaydedin:
| Kurucu | Şekil |
|---|---|
solid(F, profile, { radius, ...meta }) |
Tornalanmış bir parça: iki uçta da eksene kapatılmış profil, solidOf'a verdiğiniz aynı [s, r] listesi. Pürüzsüz düğüm dizileri çizimin kullandığı aynı Hermite eğrisi boyunca (ya da bir bandsOf bandı için olduğu gibi radius(s) boyunca) izlenir; böylece kaydedilen yüzey kirişleri değil, çizilen yüzeydir. |
lathe(F, meridian, { radius, ...meta }) |
Aynı izlemeyle G.lathe(meridian, F, P)'nin şekli: herhangi bir kapalı meridyen (halkalar, valf gövdeleri, kutular). |
body(F, polygon, meta) |
F etrafında döndürülen herhangi bir kapalı [s, r] çokgeni, olduğu gibi alınır. Eksen üzerinde yatan kenarlar yüzey değildir; bu yüzden bir diskin derinliklerindeki bir nokta gerçek derinliğini ölçer. |
disc(F, s0, s1, r, meta), ring(F, s0, s1, rIn, rOut, meta) |
Flanşlar, göbekler, pimler, bilezikler. |
box(min, max, meta), orientedBox(centre, axes, half, meta) |
Kare bloklar; 45°'de bir kiriş. |
slab(plan, z, height, meta, steps = 8), extruded(ring, z, height, meta), cylinder(cx, cy, r, z, height, meta) |
slabOf, extrude ve cylinder'ın şekilleri: zemine dikilmiş aynı yuvarlatılmış plan ya da herhangi bir çokgen halkası (dışbükey olsun olmasın); böylece yuvarlatılmış bir platform köşesi ya da L biçimli bir braket çizildiği gibi kontrol edilir. |
prism(F, polygon, s0, s1, meta) |
G.prismOf'un şekli: çerçevenin u, v düzleminde F.a boyunca uzatılmış herhangi bir çokgen. |
traced(meridian, { radius, error = 0.02, depth = 6 }) |
solid ve lathe'in kaydettiği çokgen. |
ball(at, r, meta) |
Küreler ve uç noktaları (size / scale dünya birimi). meta.flats: [[nx, ny, nz, d]] düzlükler keser (n·(p − c) ≤ d yarı uzayı korunur): sdf max(|p − c| − r, n·(p − c) − d …)'dir, yüzey örnekleri düzlüklerin kenarlarını içerir, boundsOf değişmez (tutucu). 3B modun mafsal bilyeleri bunu kaydeder. |
tube(points, radius, meta) |
Yarıçaplı (sayı, 0..1'in fonksiyonu ya da nokta başına bir liste) bir boru ya da kablo merkez çizgisi. |
slide(F, from, to, r, meta) |
from'daki bir salmastradan kayarak çıkan bir çubuk (from'dan to'ya bir disc). Bir patlatma ya da strok durumunda pozlandığında ötelenmek yerine salmastra yüzünden to + offset · F.a'ya uzanır; böylece her kontrol çizilen çubuğu görür. Onu hareket eden öğeye koyun (strok move'u olana). |
moved(shape, offset), sdf(shape, p), boundsOf(shape) |
Yardımcılar: öteleme, işaretli uzaklık (içeride negatif), dünya sınırları. |
meta şunları taşır: name (raporlarda kullanılır ve önekle eşleşir: "nozzle.bell*"), owner (bir borunun kendi flanşları, bantları ve valfi), touch (bir borunun bilerek değebileceği adlar; örneğin bir kablo demetinin çevresindeki kelepçeler), bundle (bir kablo demetindeki kablolar yan yana yatabilir ve bir kelepçe kendi demetinin bundle'ını taşır), joined (boşluklu tek bir borunun dizileri), limp (bir kablo: hiçbir şeyi tutmaz), anchor: false (bir kelepçe: bir uç onu bağlantısı olarak sayamaz), fitting (merkezini crowding'in diğer hatlara karşı kontrol ettiği bir kelepçe ya da bilezik), seated (tasarım gereği ev sahibine gömülü bir ped ya da küre üzerinde kenar birleşimi), cut (bundan çıkarılan bir şekil ya da şekil listesi: bir eyer pedi ev sahibince kesilen bir disktir) ve curve (analitik eğimi olmayan tornalanmış bir parçanın pürüzsüzleştirilmiş profili, wobble için). Boru dizileri ayrıca tips (yolun gerçek uç noktaları ya da bir salyangozun başlangıcı gibi bir gövdeye karışan bir uç için null), tipAxes, tipRims (her uçtaki flanş ya da konektör yarıçapı), free (sökülmüşken bağlantısından çıkması amaçlanan uçlar), offset ve total (dizinin yolunda nerede durduğu) taşır. Her şekil onu çizen öğenin move, ride ve piece'ini taşır; böylece herhangi bir patlatma durumunda pozlanabilir.
Durumlar. Bir patlatma durumu bir sayıdır (her grup o payda) ya da grup başına bir payla { label, shares }'tir. uniformStates(10) 0, 0.1 … 1 verir; bunlar kimsenin gördüğü kareler değildir, bu yüzden yalnızca anahtar çözücüyü beslerler. springStates(order, { stagger, stiffness, damping, substeps, fps = 60, settle = 1e-3, stride = 1, reversals = [] }) canlı sayfanın kendi yaylarını kademeleriyle yeniden oynatır; dinlenmeden açarak ve sökülmüşten kapatarak, her yay hedefinin settle yakınına inene kadar fps'de kare başına bir durum (Raptor'da her yön için yaklaşık 1.2 s; böylece her toplanmanın yavaş kuyruğu da kontrol edilir). stride: 4 derinlik rasterı için her dördüncü kareyi tutar. reversals hızlı bir üzerine gelmenin oluşturduğu yolları ekler: açılış, sonra o kadar saniye sonra yeniden kapanış (ve tersi), sayfanın kendi zamanlamasıyla: bir geri dönüşte yalnızca hedefi değişen gruplar yeniden planlanır, kendi aralarında kademelendirilerek; böylece yeni ayrılan biri hemen geri döner ve hâlâ bekleyen biri basitçe evde kalır. reversalsOf(order, stagger) her kademe sınırının iki yanında 8 ms'de bir geri dönüş verir: kötü pencereler oradadır (bir sonraki başlangıçtan 15 ms önceki bir geri dönüş sıcak gaz kanalını hâlâ evde park etmiş bir metan pompasına uçurdu) ve elle seçilmiş üç zaman hepsini kaçırdı. prefixStates(order, { shares = [0.25, 0.5, 0.75, 1] }) önek kuralının arkasındaki statik durumları ekler: ilk k − 1 grup tamamen dışarıda, k'ıncı her payda, kalanı evde. Kademe boyunca paylar her zaman artmayan sıradadır (erken gruplar önde gider; açılırken, kapanırken ve geri dönerken); bu yüzden ulaşılabilir her kare bunların arasında kalır. 40 ms'lik bir örnek bütün içinden geçmeleri kaçırdı: iki örnek arasında lüle 15 birim, en geniş borunun iki katından fazla yol aldı. shareOf(item, state) bir öğenin payını onun ride'ından (ya da piece'inden) okur ve offsetOf(item, state) onun hareketi çarpı o paydır.
overlapsOf(items, P, { step = 0.25, tolerance = 0.3, least = 0.25, states = [0], skip }) her durumda ekran izleri örtüşen her çizilen öğe çiftini bulur ve örtüşme üzerinde step viewBox birimlik bir ızgarada iki şekle de kamera ışını boyunca ışın atar. Bir yüzey tolerance'tan fazla yakın olduğunda bir hücre sayılır. Her tarafın işaretlenmiş hücreleri kapatılır (bir genişletme, bir aşındırma; böylece tırtıklı bir şerit katılaşır), bir kez aşındırılır (böylece gerçek bir temas boyunca kılcal çizgi düşer) ve en büyük bağlı parça px² cinsinden ölçülür; o alan en az least olduğunda bir taraf "önde"dir. Eski 0.5 adımı ve 4 komşulu çekirdek sayımıyla, bir pompa gövdesine gömülü bütün bir flanş ve her kablo kesişmesi (0.5'lik bir kablo üç hücreden dar) gürültü olarak okundu. Her öğe evde bir kez ışın atılır; herhangi bir durumda rasterı, ekranda ötelemesi kadar (ızgaraya yuvarlanmış) ve derinlikte offset · V kadar kaydırılmış o tek rasterdır; bu bir öteleme için tamdır. Çift sonuçları çiftin göreli kaymasıyla önbelleğe alınır; böylece birlikte hareket eden çiftler bir kez ölçülür. Raptor'da 1.119 durum (tekdüze, her yeniden oynatılan yolun her dördüncü karesi, önek durumları) eski 61'den daha ucuzdur. skip(a, b) tek bir borunun komşu parçaları gibi çiftleri hariç tutar.
orderKeys(items, overlaps, { gap = 0.02 }) her tek taraflı çifti o çiftin durumunda bir kurala çevirir: keyFront − keyBack ≥ gap + shareBack · liftBack − shareFront · liftFront. Anahtarlarda doğrusaldır; bu yüzden tek bir en uzun yol gevşetmesi tüm durumları bir kerede oturtur ve bir öğeyi yalnızca daha sonraya taşır. Karşılanamayan bir döngü en zayıf kuralını düşürür (dropped). Farklı yerlerde birbirinin önünde olan çiftler cycles'tır.
depthOrder(items, P, { overlaps, solved, rest, allow }) her durumda son sırayı kontrol eder. Dinlenmede (rest, varsayılan 0 ve 1 durumları) ve her yeniden oynatılan yay karesinde her yanlış çift bir sorundur: temiz bir yanlış sıra, bir kilitlenme ve k + lift · share biçiminde hiçbir anahtarın tutamayacağı bir çift, hepsi ekranda görünür. Tekdüze durumlarda yalnızca temiz bir yanlış sıra sayılır; oradaki kilitlenmeler geçen olarak listelenir. allow, açıkça mazur gösterilecek [patternA, patternB] çiftlerini alır.
clearances(tubes, solids, { ratio = 0.5, least = 0.2, state, only, mounts }) her boruyu örnekler ve bir katıya ya da başka bir boruya max(least, ratio · r)'den daha yakın geldiği her yeri listeler. Bir dizinin düz ucunun yakınında kesimin üzerinden taşacak bir küreyi değil, uç halkasını ölçer. Yalnızca bir ucun kendi bağlantısı (kenarının oturduğu şekil, mountsOf'a bakın), o bağlantının borusu ve bağlantıyı paylaşan ya da bu boruya inen bir hattın bağlantı parçaları ve yalnızca ucun r + gap + 1 yakınında mazur görülür; bir ucun yakınında başka hiçbir şeye 0.1'den fazla girilemez. Her şeyi pozlamak için state verin (mazeret yalnızca boru ve bağlantı birlikte durdukları yerin 0.05 yakınındayken geçerlidir) ve yalnızca girişleri listelemek için only: "through". Bir borunun başka bir boruya uzaklığı gerçek kapaklı silindir uzaklığıdır; böylece bir flanşın altında düz biten bir dizi, sonraki dizinin içine giriyormuş gibi görünen hayali yuvarlak bir kapak büyütmez.
mountsOf(tubes, solids), terminals(tubes, solids) her boru ucu için uç kenarına (flanş ya da konektör yarıçapında 12 nokta) en yakın bağlantılı şekli bulur ve kenarı onun 0.15 yakınında olmayan her ucu listeler: portundan uzakta duran bir flanş, eğri bir gövdede düz bir flanş (kenar boşluğu), demetin yanında ya da bir kelepçenin içinde duran bir kablo.
looseEnds(tubes, solids, { state = 1 }) o patlatma durumunda onunla birlikte hareket eden başka bir sahibin hiçbir katısına değmeyen her boru ucunu listeler. Kendi flanşı, kaplini ya da konektör kabuğu sayılmaz (onunla kontrol asla başarısız olamazdı: 25 Raptor ucu yalnızca kendi bağlantı parçasına dayanıyordu). free işaretli uçlar kasıtlı bir liste olarak ayrı bildirilir; diğer her şey başarısız olur.
supports(solids, tubes, { ground, touch = 0.15, sunk = 0.5 }) katıların ve rijit boruların bir temas grafiğini kurar ve ground'a (varsayılan: stand. ile başlayan adlar) bağlı olmayan her katıyı, artı bir sahibi paylaşmadıkça ya da biri diğerine seated olmadıkça (cut'ında adlandırılmış) birbirine sunk'tan fazla gömülü her katı çiftini listeler. Oturtulmuş bir ped yalnızca ev sahibine karşı mazur görülür: Raptor'un başka bir gruptaki sıcak gaz pedine 0.5 gömülü ateşleyici flanşı genel bir seated bayrağının arkasına saklandı. hanging tutulan hiçbir şeye bağlanmayan rijit boruları listeler ve onlar da başarısız olur.
solidClearances(solids, { state, sunk = 0.5 }) katıları pozlar ve o durumda farklı ötelemede duran her çift için her birinin yüzey noktalarını diğerinin sdf'ine karşı test eder; sunk'tan fazla içeride olan her şey başarısız olur (oturtulmuş bir ped ve ev sahibi mazur görülür). 1 durumunda ve her yeniden oynatılan ve önek durumunda çalıştırın: bir grubun bir gövdesinin, pedinin ya da flanşının başka birinin gövdesinin içinden süpürmesi boru kontrollerine görünmezdir.
seats(solids) başka bir grupla hareket eden bir ev sahibine göre kesilmiş her seated şekli listeler. Sökülmüşken kesik tabanı görünür: metan pompasının türbinine ve halkasına göre kesilen sıcak gaz kanalının eyeri sivri kuyruklu pürüzlü bir kırık olarak uçtu. Bir eyer ev sahibinin grubuna aittir; hareket eden hat onunla düz yüzünde buluşur.
selfOverlaps(items, P, { fold = 0.25, least = 0.5 }) çizilen her boru parçasını kendisine karşı kontrol eder: ekran merkez çizgisinin borunun ekran yarı genişliğinin altında bir yarıçapta döndüğü yerde şeridin iç kenarı geriye akar ve tek parçanın dış hattı kendini keser (gizli bacağın kenarlarının içinden göründüğü bir düğüm). O katlanma en az least px olduğunda ve nokta başka bir öğe tarafından örtülmediğinde başarısız olur. Bir portun bir iki yarıçapı içinde dönen, izleyiciye bakan bir bacak olağan nedendir.
wobble(solids, { samples = 20 }) kaydedilmiş her curve'ün dr/ds'sini parça başına 20 noktada örnekler ve dizinin uçları arasında döndüğü s değerlerini listeler.
folds(routes, P, { fold = 140, turn = 110, pinch = 2, items }) ekran yönü dört yarıçap içinde fold dereceden fazla dönerken gerçek dönüşü turn'ün altında olan her yolu ({ name, points, r }) (izleyiciden uzağa uzanıp sonra inen bir borunun sivri ucu) ve 1.5, 3 ve 6 yarıçaplık açıklıklar üzerinde ölçülen, borunun ekran yarıçapının pinch katının altında bir yarıçap etrafında ekranda 90°'den fazla dönen her bükümü (kenardan görülen bir fileto: izleyiciye bakıp sonra tırmanan bir bacağın V'si) listeler. Bir ucun üç boru genişliği içindeki bir sıkışma uçtan görülen bir kütüktür ve sayılmaz. items ile yalnızca görebildiğiniz bükümler sayılır: her birine her çizilen şekle karşı ışın atılır.
crowding(routes, P, { gap = 1, bend = 30, links, items, allow, state, clear = 2 }) bir yolun bükümünün (±2 yarıçap içinde bend dereceyi aşan bir 3B dönüş) ya da ucunun ekranda başka bir yolun dış hattına düştüğü her yeri listeler: dış hatlar gap px'ten yakın ya da örtüşüyor ve iki hat da orada görünür (items'a karşı ışın atılır; bir yolun kendi flanşları, kabukları ve kelepçeleri yol olarak sayılır). Bunlar gerçek derinlik ne olursa olsun bir birleşim ya da başka birinin içinden geçen bir hat gibi okunur. Bir büküm derin örtüşmeyle asla mazur görülmez; bir uç yalnızca diğer hat orada düzken ve ucun kendisi ondan açıktayken. Her fitting (bir kablo demeti kelepçesi) de kontrol edilir: dış hattı başka bir hattın clear px yakınına düşen bir kelepçe o hat kelepçeden çıkıyormuş gibi okunur; Raptor'un kablo demeti kelepçesi sökülmüş pozda oksijenden ön yakıcıya giden hatta böyle yaptı. links (linksOf(tubes, mounts)'tan) gerçekten buluşan hatları mazur gösterir: biri diğerine bağlı, ikisi tek bir bağlantıda. state yolları ve öğeleri bir patlatma durumunda pozlar; böylece sökülmüş poz da kontrol edilir (yollar move, ride, piece taşır). allow baktığınız ve açık bulduğunuz [patternA, patternB] çiftlerini alır.
slenderOf(solids, { ratio = 4, least = 0.3 }) her ince kaydedilmiş katıyı (yarıçapının ya da yarı genişliğinin ratio katından uzun tornalanmış bir parça, prizma ya da kutu: gergi çubukları, piston çubukları, direkler, raylar, saplar) audit'in crowding'e rods olarak verdiği bir sözde yola çevirir. Bir borunun bükümü ya da ucu birine inerse, boru ona ya da ona bağlı bir şeye monte edilmedikçe, başka bir boruya iner gibi başarısız olur (crowding: hose.B end × cyl.tie-rod (rod)). Çubuklar yalnızca üzerine inilen hattır: kendi uçları kontrol edilmez.
coverage(items, P, { least = 0.6, pad = 1, allow }) svg dizgisi olan her öğe için çizdiğinin ekran kutusunu (markupBox(svg): her yol, daire, çizgi, dikdörtgen ve çoklu çizgi, transform'lar ve clip-path'ler üzerinden, haleler, metin ve defs olmadan) kaydedilmiş şekillerinin ekran kutusuyla (footprintOf(shape, cameraBasis(P))) karşılaştırır ve şekilleri çiziminin least'inden azını kaplayan her öğeyi listeler: stand-in shapes: rod.rod its shapes cover 4% of its drawing. Uzun bir çubuk için kaydedilen bir şerit ya da üç parça çizen bir öğe için kaydedilen tek bir şekil, diğer her kontrolü geri kalanına kör eder. audit, çizimi gerçekten gövdesinin ötesine uzanan öğeleri mazur göstermek için cover: [names] alır; önce her birine bakın.
report(result) her şeyi biçimlendirir; failures(result) derlemeyi başarısız kılması gerekenleri sayar.
Raptor bunu şöyle bağlar (examples/raptor-engine/build.mjs): onun put, tubeItems ve record'u R.put, R.route ve R.solid üzerine ince sarmalayıcılardır ve derlemenin sonu şudur:
A.settle(R, P);
items.sort((a, b) => a.key - b.key);
A.auditOrExit(R, P, { crowd: CROWD_OK });
Canlı sayfa aynı STAGGER ve SPRING'i verisinden okur; bu yüzden denetim ve sayfa birbirinden kayamaz. Her yardımcı (turned, band, flangeAt, boss, padOn, boxAt, valveOn, pipe, cable, clampAt, strut, eyleyiciler) öğesini koyarken şeklini kaydeder ve arka katmanda çizilen statik sehpa (platform, alev konisi, su püskürtme halkası ve beslemesi, kolonlar, ekler) stand.frame'e ait sabit şekiller olarak kaydedilir; böylece bir parçayı sehpaya süren bir patlatma vektörü de başarısız olur. Hiçbir şey kontrolden kaçmaz.
13. WebGL katmanı (kit/gl.mjs)
| Dışa aktarım | Ne olduğu |
|---|---|
GLSL_ISO |
glLayer'ın başa eklediği GLSL girişi. Kamera uniform'larını (uCanvas, uView, uOrigin, uK, uCam, uTime) ve viewOf, project, towardViewer, rayOf, pixelOf, lightDir, onFloor, onWallX, onWallY, hash12, hash13, noise2, noise3, fbm2, fbm3, window ve tonemap fonksiyonlarını tutar. Parçanızda hiçbirini yeniden tanımlamayın: GLSL ikinci bir rayOf'u reddeder. |
rayOf(vb) (GLSL) |
Orijinden geçen ve kameraya bakan dikey düzlemde vb viewBox noktasının altındaki dünya noktası. rayOf(vb) + t·towardViewer() o pikselin tüm ışınıdır; daha büyük t izleyiciye daha yakındır. |
pixelOf() (GLSL) |
Tuval pikseli başına dünya birimi, (uView.x / uCanvas.x) / uK. Zeminin derinlik yönü için uCam.z'ye, bir duvarda yukarı için uCam.w'ye bölün. |
glCamera(P) |
Bir izdüşüm için { origin, k, cam }. Node'da çalışır; bu yüzden sayfa DATA'sına koyun. |
glLayer({ canvas, fragment, view, camera, uniforms = [], fixed = {}, extensions = [], maxRatio = 1.5, onError }) |
{ gl, extensions, set(values), draw(values, time), clear() } ya da WebGL olmadan veya bir derleme hatasında null döndürür. uniforms her karede göndereceğiniz uniform'ları adlandırır. fixed, hiç değişmeyen her şey için (planlar, yükseklikler, tema sabitleri) oluşturmada bir kez ayarlanan { name: value }'dur. extensions "GL_OES_standard_derivatives" gibi GLSL uzantılarını listeler; bağlamın desteklediği her biri etkinleştirilir ve #extension … : enable olarak başa eklenir ve döndürülen extensions etkinleştirilenleri listeler. |
set(values) |
Seyrek değişen bir değer için çizmeden uniform'ları ayarlar. |
draw(values, time) |
Tuvali sığdırır, kamera uniform'larını ve uTime'ı, sonra values'ı ayarlar ve çizer. |
clear() |
Yalnızca bir şey çizildiyse şeffafa temizler. |
smooth(a, b, x) |
JS'te smoothstep. |
burst(age, rise, fall) |
Bir olay zarfı: rise saniye boyunca bir smoothstep yükselişi, sonra zaman sabiti fall olan üstel sönüm. age ≤ 0 için 0. |
settle(state, target, dt, seconds, calm = false) |
state = { x, v } üzerinde zaman sabiti seconds olan, dört alt adımlı kritik sönümlü bir yay. Hata ve hız ikisi de 1e-4'ün altına inince hedefe oturur. Hâlâ hareket ederken true döndürür. calm doğrudan hedefe atlar. |
| GLSL_TURN | 3B şekiller için isteğe bağlı GLSL; şekil tarafından parçasının başına eklenir: uGroupX/Y/Z/T, toGroup(p) (dünya → grubun dinlenme-dünyası koordinatları), toWorld(g), dirToGroup(d), dirToWorld(d) ve örtü maskeleri uCoverEdge[60], uCoverCount[6], coverOf(vb, soft) (efektten sonra boyanan bir parçanın içinde 1). toWorld'ü tanımlar: onu kendininkini bildiren bir parçanın başına eklemeyin. Parça 70 uniform vektör kullanır. |
| glslPose(Name, prefix = "uName") | Herhangi bir grup için aynı dört fonksiyon: prefixX/Y/Z/T üzerinde toName, fromName, dirToName, dirFromName; böylece tek bir shader birkaç grubu izler. Ona TURN.poseUniforms(controller, group, prefix) verin. |
fixed, set ya da draw için bir değer bir sayı (float), 2–4 uzunluğunda bir dizi (vec2–vec4) ya da bildirilen türün uniform dizisine giden 4'ten uzun bir dizi veya Float32Array olabilir: uniform vec3 name[N] için uniform3fv (örtü kenarları, kıvılcım konumları), benzer şekilde uniform2fv/uniform4fv ve uniform float name[N] için uniform1fv. Bu çağrılar üzerinden int, matris ya da örnekleyici yoktur; bir sampler2D varsayılan olarak 0 doku birimini kullanır; bu yüzden bir dokuyu layer.gl ile bağlayın (dalga leğeninin geçmiş dokusu). uniforms ya da fixed içinde olmayan adlar ve derleyicinin optimize edip attığı uniform'lar atlanır.
smooth, burst ve settle düz JS'tir: bir modülde onları kit/gl.mjs'ten içe aktarın ya da glScript()'i gömen bir sayfada bedavaya alın. references/webgl.md tam sözleşmeyi, minimal bir sayfayı ve zanaat kurallarını içerir.
14. Araçlar
| Betik | Ne için kullanılır |
|---|---|
scripts/capture.mjs |
Tek seferlik ekran görüntüleri: masaüstü, telefon, üzerine gelme, tuşlar, zamanlanmış görüntüler, 4× yakınlaştırmalar, azaltılmış hareket, konsol kontrolü. Chrome WebGL açık (SwiftShader'a izin verilmiş) başlar; böylece shader'lar görünür. --times gecikmeleri ilk görüntüden ölçülür; --key, drive.mjs ile aynı tuş kodlarını gönderir (7, Digit7'dir; Comma , gönderir). |
scripts/drive.mjs |
WebGL açık başsız Chrome'da senaryolu oturumlar: kaydırma, hareket, tıklama, tuş, yavaşlatma, until, eval, görüntüler ve temas sayfaları. --no-webgl SVG yedeğini kontrol eder ve --preload file.js sayfanın kendisinden önce bir betik çalıştırır. Shader geçişleri ve dizisi olan her şey için kullanın. references/verify.md'ye bakın. |
scripts/lines.mjs |
Çizgi ucu kontrolü: karttaki her doku çizgisi bir kontur, bir nokta ya da bir dış hatta ya da daha sonraki bir dolgunun altında bitmelidir. --out başarısızlıkları halkalar; herhangi birinde 1 ile çıkar. Aynı kontrol drive.mjs'in ["lines"] eylemidir. references/verify.md, "Çizgi uçları"na bakın. |
scripts/inline-kit.mjs |
kitScript(), glScript() ve turnScript() kiti, WebGL katmanını ve 3B çalışma zamanını bağımsız bir sayfaya gömmek için düz betik olarak döndürür. |
scripts/drive.mjs ["turn", value, group?] |
3B şekiller: ilk dönme grubunu (ya da group'u veya bir değerler nesnesini) window.__isoTurn üzerinden ayarlar ve iki kare bekler. |
scripts/drive.mjs ["orbit", out.png, from, to, step, sel?, scale?, [x,y,w,h]?, columns?] |
3B şekiller: açılar boyunca, her karesi θ° ile etiketli bir temas sayfası. Tam bir tur boyunca 15°; bir sıra değişikliği boyunca 0.1°; katlanmaya yatkın bir büküm boyunca 1°. |
scripts/turn-check.mjs |
3B şekiller. build.mjs --fidelity (Node: P′(θ)'da kit kurucularına karşı prizmalar, yuvarlaklar, torna parçaları ve borular); page.html --order (bir --verify derlemesi gerektirir), --pops, --lines, --perf, --states file.json, --part name, --out dir. Her kontrol önce yerleştirilmiş kontrol örneğini çalıştırır. references/3d.md, bölüm 14. |
scripts/turn-bench.mjs |
3B şekiller: 360 açı üzerinde, parça türü başına Node'da emit ve order CPU süresi (7'nin medyanı). |
15. Dönen gruplar (kit/turn.mjs, turn-build.mjs, turn-audit.mjs)
İsteğe bağlı 3B mod. Rehber references/3d.md'dir; bu referanstır.
import { turning, separate, gjk } from "../../kit/turn-build.mjs";
import { TURN, TURN_CSS } from "../../kit/turn.mjs";
import * as TA from "../../kit/turn-audit.mjs";
turning(P, { recorder, scale = 1 }) → T
| Üye | Ne yapar |
|---|---|
T.group(name, { parent?, turn: { pivot } | slide: { direction, travel } | hinge: { point, axis, range } | free: { origin } }) |
Rijit bir grup. Değerler: derece (turn, hinge), dünya birimi (slide), { R | q | axis+angle, t, world? } ya da null (free). |
T.layer(name), T.stack(names) |
Canlı katmanlar ve canlı ve statik katman adlarının arkadan öne tam yığını. |
T.prism, T.round, T.lathe, T.ball, T.tube, T.fixed, T.plane, T.billboard, T.split |
Dinlenmede dünya koordinatlarında parçalar. Ortak seçenekler { name, group, layer, tone, crease, lit, material, owner, details }. İmzalar 3d.md, bölüm 4'te. |
T.build({ statics, poses, verify, strict }) |
{ svg, data, css, report, layerSvg(name, { width, height }), verify, planesByName }. |
T.parts, T.groups, T.layers, T.routes, T.data, T.built |
Denetim ve kontroller için sahne. |
details: seams, ribs: { s0, s1, count, phase, twist, fade, seams, tone }, bolts: [{ s, r, count, phase, size, tone, fade }], dots: [{ at, normal, size, tone }], rings: [{ at, normal, r, tone }], rules: [{ points, tone, free }], bevel. Her kurucu kendi çerçevesinde kendi alt kümesini alır (bir bilyenin s'si ilk düzlüğünün normali boyunca uzanır; bir prizma yalnızca noktaları, dikişleri ve pahı alır): 3d.md, bölüm 4'teki tablo. Malzemeler: gold, chrome, steel, gunmetal, rubber, brass, copper.
separate(A, B, hints) ve gjk(A, B, warm) iki nokta kümesi için { n, d, margin } döndürür (derlemenin düzlem çözücüsü).
TURN (çalışma zamanı)
| Üye | Ne yapar |
|---|---|
TURN.mount(stage, data, { onHold, onFrame, follow }) |
Kontrolcü: set(values | θ, { detail }), render(), angleAt(x, y, z, group), values, pose(name), detach(name), anchor(group, restPoint, restDir?), cover(names, options), order(layer), orderIndex(layer), events(), stats(), frames(), cams(), scene(), destroy(). window.__isoTurn'ü kurar. |
TURN.cover(controller, names | [names…], { polygons = 6, edges = 10, pad = 0.3, layers }) |
coverOf için { uCoverEdge, uCoverCount, dropped, parts }. |
TURN.poseUniforms(controller, group, prefix = "uGroup") |
GLSL_TURN ya da glslPose için dört vec3. |
TURN.anchor(scene, cams, group, point, dir), TURN.floorOf(scene, group, R) |
Bir kontrolcünün dışındaki çapalar; bir dönme altında bir grubun en düşük z'si. |
TURN.rotation(axis, deg), TURN.quat(q), TURN.compose(A, B) |
Serbest pozlar için [9] olarak dönmeler. |
TURN.materials, TURN.materialCss(), TURN.css(), TURN_CSS |
Malzeme adları; CSS. |
TURN.camera, TURN.poses, TURN.cams, TURN.prepare, TURN.emit, TURN.order, TURN.frame, TURN.gjk, TURN.disjoint, TURN.q, TURN.levels |
Araçlar için hat: grup başına kameralar, hazırlanmış bir sahne, bir parçanın karesi, bir katmanın sırası. |
Yörünge denetimi (kit/turn-audit.mjs)
| Dışa aktarım | Ne yapar |
|---|---|
orbitOrExit(T, R, P, { flag = "--audit", argv, sweep, clips, poses, crowd, cover, fittings, quick, only, log }) |
Bayrak varsa orbit'i çalıştırır, raporu yazdırır, herhangi bir başarısızlıkta çıkış kodunu 1 yapar. Yalnızca tam bir çalıştırma için turn audit passed ile biter; only ile turn audit partial, quick ile turn audit quick ile biter (3d.md, bölüm 13). |
orbit(T, R, P, options), orbitReport(result), orbitFailures(result) |
Kontroller, metin, sayı. result.skipped only'nin dışarıda bıraktığı satırları listeler (skipped olarak yazdırılır); result.quick hızlı bir çalıştırma için ayarlanır. |
posed(shape, pose), eventsOf(T, layer) |
Bir grup pozuyla taşınmış kaydedilmiş bir şekil; bir katmanın kenardan görünme açıları. |