Doğrulama
Şekle, başkasından önce, titiz bir gözden geçirenin bakacağı gibi bakın. Onu çizmek ucuzdur, tahmin etmek pahalıdır.
Yakalama
scripts/capture.mjs kendi başsız Chrome'unu başlatır (bulamazsa CHROME_PATH'i ayarlayın), bir dosya ya da URL yükler ve varsayılan olarak .iso-plate'e kırpar. Ayrıca okuma değerini, konsol hatalarını ya da istisnaları ve sayfanın yana kayıp kaymadığını yazdırır.
node scripts/capture.mjs page.html --out shots/desk.png # masaüstü 1440, dpr 2
node scripts/capture.mjs page.html --out shots/phone.png --width 390 # telefon
node scripts/capture.mjs page.html --out shots/hover.png --hover 0.7,0.5 # işaretçi %70 yatayda
node scripts/capture.mjs page.html --out shots/tour.png --times 1200,2400,3600 # hareket: zaman içinde ek görüntüler
node scripts/capture.mjs page.html --out shots/keys.png --key ArrowRight,ArrowRight
node scripts/capture.mjs page.html --out shots/joint.png --zoom 200,80,220,170 # 4x yakın çekim, kart px'i cinsinden
node scripts/capture.mjs page.html --out shots/still.png --reduced # azaltılmış hareket
node scripts/capture.mjs http://localhost:3000/docs --select "figure:nth-of-type(3) .iso-plate" # bir geliştirme sunucusu sayfasında tek şekil
--select herhangi bir CSS seçicisi alır; varsayılan olarak ilk .iso-plate'e kırpar. Her --times gecikmesi ilk görüntüden sayılır; bu yüzden 1200,2400,3600 ondan yaklaşık 1.2, 2.4 ve 3.6 s sonra çeker (bir yakalama 60–200 ms sürer, bu yüzden bundan daha yakın gecikmeler geç çalışır) ve name-<ms>.png olarak kaydeder. --key, drive.mjs ile aynı tuş kodlarını gönderir (7 için Digit7, . için Period; liste virgülle ayrıldığı için virgülü Comma olarak yazın). Diğer seçenekler --height (1000), --scale (2), --wait (ilk görüntüden önce 2500 ms), --zoom-scale (4) ve --theme dark|light'tır. Ürettiğiniz her PNG'yi okuyun: açın ve bakın.
İki betik de Chrome'u WebGL açık olarak başlatır (--enable-unsafe-swiftshader --ignore-gpu-blocklist); böylece shader'lar capture.mjs görüntülerinde de görünür. Zamanlanması ya da yavaşlatılması gereken her şey için drive.mjs kullanın.
Sürme
scripts/drive.mjs, WebGL açık başsız Chrome'da senaryolu bir oturum çalıştırır. Diziler için kullanın: üzerine gelin, sonra tıklayın, sonra yazın, sonra bir evreyi bekleyin. Patlamaları yakalayan yavaşlatılmış temas sayfaları ve WebGL'siz yedek için de kullanın. Her görüntüden sonra okuma değerini, ardından konsol hatalarını ve istisnaları yazdırır.
node scripts/drive.mjs page.html '[["wait",1500],["move",".rt-stage",0.7,0.4],["wait",600],["shot","shots/hover.png"]]'
node scripts/drive.mjs page.html --actions steps.json --height 1300
node scripts/drive.mjs page.html --actions steps.json --width 390
node scripts/drive.mjs page-light.html --actions steps.json --reduced
node scripts/drive.mjs page.html --actions steps.json --no-webgl
node scripts/drive.mjs page-light.html --actions steps.json --preload slow.js
Seçenekler: --width (1440), --height (1100), --scale (1), --reduced, --theme dark|light, --no-webgl (SVG yedeğini kontrol etmek için her getContext("webgl") ya da "webgl2" null döndürür), --preload file.js (sayfanın kendi betiklerinden önce çalışan bir betik: sayaçlar, saplamalar, kancalar ya da ilk kareden itibaren yavaş çalışmak için window.__driveSpeed=0.04) ve --actions file.json. Seçiciler varsayılan olarak ilk .iso-plate'tir ve oranlar öğe boyunca 0..1 arasındadır.
--theme (iki betikte de) yalnızca prefers-color-scheme'i taklit eder. Kit sayfaları temalarını derlenirken seçer (<body> üzerinde data-theme) ve bu medya sorgusunu yok sayar; bu yüzden açık temayı kontrol etmek için --light ile derleyin ve -light.html dosyasını sürün.
| Eylem | Ne yapar |
|---|---|
["scroll", sel] |
Öğeyi görüntü alanının ortasına kaydırır. |
["wait", ms] |
Bekler. |
["move", sel, fx, fy] |
Fareyi oraya 10 adımda, pointermove tetikleyerek kaydırır. |
["click", sel, fx?, fy?] |
Varsayılan olarak ortaya tıklar. |
["drag", sel, fx0, fy0, fx1, fy1, steps?] |
Bir noktada basar, diğerine birer kare arayla steps (20) hareketle kayar ve bırakır. Bunlar gerçek girdi olaylarıdır (işaretçi kimliği 1); bu yüzden setPointerCapture çağıran bir işleyici çalışır. Sürükleyerek döndürmeyi bununla test edin: eval'dan gönderilen PointerEvent'lerin etkin bir işaretçisi yoktur ve setPointerCapture NotFoundError fırlatıp işleyiciyi durdurur. |
["key", key, sel?, code?] |
sel'e odaklanır (varsayılan [tabindex="0"]) ve bir tuşa basar: "i", "Escape", "ArrowRight", " ", "7". Rakamlar DigitN, harfler KeyX ve noktalama işaretleri kendi kodlarını gönderir (Space, Minus, Comma…). Adı ortak tuşlar için code verin: ["key", "Shift", null, "ShiftRight"], ["key", "Enter", null, "NumpadEnter"]. |
["slow", factor] |
Sayfanın requestAnimationFrame zaman damgalarını ve performance.now'ı gerçek zamanın factor katında çalıştırır: ["slow", 0.05] 20× ağır çekimdir; böylece bir sayfa 100 ms'lik bir olayı birçok karede yakalar. ["slow", 1] gerçek zamanı geri getirir. |
["until", js, timeoutMs?] |
Bir JS ifadesini doğru olana kadar her 25 ms'de yoklar (varsayılan 10 s) ve zaman aşımında bir satır yazdırır. |
["eval", js] |
Sayfada JS çalıştırır ve sonucu yazdırır. Promise'ler beklenir. |
["shot", out, sel?, scale?, [x,y,w,h]?] |
Bir öğenin ya da onun CSS px cinsinden bir bölgesinin ekran görüntüsünü alır. |
["sheet", out, every, count, sel?, scale?, [x,y,w,h]?, columns?] |
Aralarında every ms olan count kare alır ve bunları numaralı tek bir PNG'de döşer. |
["turn", value, group?] |
3B şekiller: window.__isoTurn'ü ayarlar (bir sayı ilk dönme grubunu ayarlar, group başka birini adlandırır, bir nesne birkaçını ayarlar) ve iki kare bekler. |
["orbit", out, from, to, step, sel?, scale?, [x,y,w,h]?, columns?] |
3B şekiller: ilk dönme grubunun açıları boyunca, her karesi etiketli bir temas sayfası. ["orbit", "swap.png", 129.7, 130.2, 0.1, null, 6, [x, y, w, h]] tek bir sıra değişikliğinin 6× yakın çekimidir. |
["lines", out?, sel?, { tolerance }?] |
Aşağıdaki çizgi ucu kontrolü; önceki eylemlerin şekli bıraktığı pozda (sökülmüş, strok ortasında). out, her havada kalan ucun halkalandığı kartı yazar. Bir başarısızlık çalıştırmanın 1 ile çıkmasına yol açar. |
Tuzaklar:
- Görüntüler
scroll'dan sonra doğrudur; böylece bir sayfanın aşağısındaki bir şekle kaydırabilirsiniz. Tüm kart için yeterince uzun bir görüntü alanı (--height 1300) yine de en basitidir: şekil kaydırma 0'da görünürdür veIntersectionObserver'ı onu başlatır. - Bir sayfadaki kare aralığı
everyartı yakalama süresidir (60–200 ms; yakalamanın animasyon karelerini de durdurduğu ağır WebGL sayfalarında daha fazla). Bundan hızlı geçişler için sayfadan önce["slow", 0.05]ve sonra["slow", 1]koyun.wait,everyve sayfanınsetTimeoutzamanlayıcıları gerçek zamanda kalır; bu yüzden 0.05'te her 100 ms'de bir alınan sayfa, sayfa zamanında 5 ms aralıklıdır ve bir boşta turun devam zamanlayıcısı yine duvar saatine göre tetiklenir: bir tuş basışı onu yalnızca yaklaşık 3.6 s gerçek zaman erteler; bu yüzden her yavaşlatılmış sayfadan önce zararsız bir tuşa yeniden basın. Yüklemede başlayan bir olay, sayfanın ilk karesinden itibaren yavaş olmasını gerektirir:window.__driveSpeed=0.04içeren bir dosyayı--preloadedin. - Yavaş mod zamanlayıcıları yavaşlatmaz.
setTimeoutduvar saatiyle çalışır; bu yüzden uzun bir yavaşlatılmış yakalama sırasında bir boşta turun devam zamanlayıcısı (Raptor'un 3.6 s'likquietTour'u) turu yeniden başlatıp motoru sayfanın ortasında kapatabilir. Her yavaşlatılmış sayfadan önce turu durdurun ve dinlenmeyi bekleyin: o zamanlayıcı için bir saplama önceden yükleyin (const st = window.setTimeout; window.setTimeout = (f, d, ...a) => (d === 3600 ? 0 : st(f, d, ...a));),Escape'e basın,["until", "document.querySelector('[data-readout]').textContent.includes('cold')"]ve ancak bundan sonra geçişi başlatan tuşa basın. Zaten açılmış bir turdan başlayan "açılış" etiketli bir sayfa bir kapanışı filme alır. - Bir evreyi bekleyin, tahmin etmeyin.
["until", "document.querySelector('[data-readout]').textContent.includes('main stage')", 8000]okuma değeri evreye ulaşır ulaşmaz döner. nullseçici varsayılandır. Her eylemde eksik ya danullbir seçici ilk.iso-plateanlamına gelir (keyiçin odaklanabilir[tabindex="0"]); böylece["sheet", "s.png", 200, 16, null, 0.5]kartı filme alır.- Uzun eval dizgileri satır içi JSON tırnaklamasını bozar.
evalya dauntiliçeren her şeyi--actions steps.json'a koyun. - Sayfalar canlı kodlarını
<script type="module">olarak gömer; bu yüzden üst düzey değişkenlereval'a görünmez. Durumu bunun yerine DOM üzerinden okuyun: okuma metni,aria-valuetext,data-*öznitelikleri. Kareleri saymak ya da kare başına bir değer okumak için--preloadile bir kanca kurun (sayfadan önce çalışır, bu yüzdenrequestAnimationFrame'i ya daHTMLCanvasElement.prototype.getContext'i sarabilir).
Not: Bu sitedeki Türkçe sayfalarda okuma değerleri Türkçedir; yukarıdaki
includes('cold')veincludes('main stage')gibi kontroller İngilizce derlemeler içindir. Türkçe sayfadasoğukveana aşamakullanın.
Çizgi uçları
Denetim kaydedilmiş şekilleri görür, asla çizgi işaretlemesini değil; bu yüzden bir yüzün ortasında duran bir dikişi, çizgiyi, nervürü ya da çentiği göremez. scripts/lines.mjs çizimin kendisini başsız Chrome'da kontrol eder:
node scripts/lines.mjs page.html --out shots/lines.png
node scripts/lines.mjs page-light.html --out shots/lines-light.png --reduced
node scripts/drive.mjs page.html '[["key"," "],["wait",2000],["lines","shots/lines-apart.png"]]'
line ends: 3 of 1148 ends on 295 lines float
iso-line faint in it k -0.080 end 7.25 px from anything at card 507.4,407.2 length 75.7 d M392.1 381.7L507.4 407.2…
Karttaki her .iso-line'ın her açık alt yolu (dikişler, oluklar, fadedSvg'den nervürler, çizgiler, çentikler, ibreler, işaretçiler, teller) başka bir konturun, bir noktanın ya da bir dış hattın 1 viewBox px yakınında ya da kendisinden sonra boyanan bir dolgunun altında bitmelidir. Kısa düz bir işaretin (7 px'e kadar: bir çentik) bir ucunun 2 px içinde kökleşmiş olması gerekir; iki ucu da havada kalırsa başarısız olur. Kitin kendi dış hatları, kıvrımları, pahları ve boru kenarları kontrol edilmez; bir fadeLineSvg rampasının söndürdüğü uçlar da. lineSvg(d, { free: true }) (ya da "start", "end") durması amaçlanan bir ucu işaretler: basılı metni temsil eden çizgiler, bir ibrenin kuyruğu, bir işaretçinin ucu. Başka hiçbir şey için kullanmayın. Her havada kalan ucu, capture.mjs --zoom için hazır olarak kart px'i cinsinden ve derlemede bulabilmeniz için d'sinin başlangıcıyla yazdırır; --out onları kartın 2× görüntüsünde halkalar. İki temada ve şeklin dinlendiği her pozda çalıştırın ve 0 yazdırana kadar her çizgiyi düzeltin:
| Gördüğünüz | Çözüm |
|---|---|
| Bir kutuda köşelerden içeride bir dikiş ya da kaynak çizgisi | Levhanın inner'ı olarak k.sideSeam(plan, z, P, steps): köşeleri sarar ve siluette biter (craft.md, bölüm 3). |
| Bir yüzde, iki ucu da içeride kalan bir takviye ya da panel çizgisi | Kenardan kenara uzatın: yüzün altından üstüne ya da uçtan uca. |
| Dikişlerine varmadan duran nervürler | ribsOf(…, { seams: true }) ya da bandın uçlarında s0, s1. |
| Çıplak bir plakada havada duran ya da bir kenarın altından sarkan çentikler | Onları kenarında kökleşmiş bir cetvel şeridine koyun (topTicks edge, yüzün üst kenarında sideTicks top). |
| Havalandırma ya da ızgara çizgileri | Kapalı yuvalar: bir çizgi değil, ince yuvarlatılmış bir dış hat. |
| Bir parçanın altından geçip hemen ötesinde duran bir çizgi | Onu parçadan önce, tam uzunlukta çizin ve parçanın onu gizlemesine izin verin. |
| Bir etiket plakasındaki çizgiler | free: true. Metni temsil ederler. |
Denetim
Ekran görüntüleri, bakmayı düşündüğünüz şeyi yakalar. Boruları, kabloları ve yuvarlak parçaları olan bir şeklin geometrisinin de kontrol edilmesi gerekir; çünkü bir kanalın içinden geçen bir kablo ya da önündeki şeyin üzerine çizilmiş bir parça 1×'te görünmez, 4×'te apaçıktır. kit/audit.mjs'i derlemeye bağlayın (kit.md, bölüm 12): yardımcılar tek bir A.recorder(P, { order, spring })'a yazar, derleme A.settle(R, P)'yi çağırır ve A.auditOrExit(R, P) ile biter; ardından çalıştırın:
node examples/raptor-engine/build.mjs --audit
clearance: 0 problems
clearance apart: 0 problems
terminals: 0 ends not on a mount
loose ends: 0
screen folds: 0
support: 0 unsupported solids · 0 hanging tubes · 0 sunk pairs
depth order: 0 problems
through in mid-flight: 0 pairs
self-overlap: 0 chunks whose outline crosses itself on screen
wobble: 0 smoothed profiles whose slope turns between its ends
saddles off their host apart: 0
stand-in shapes: 0 items whose recorded shape covers too little of what it draws
crowding: 0 pairs where a bend or end touches another line on screen
free ends apart (marked free, not failing): 35
audit · 80 tubes · 267 solids · 478 items · 1119 depth states · 1707702 overlaps · 4292 order rules · 151.9 s
audit passed
audit passed ya da audit failed: n problems yazdırır ve herhangi bir başarısızlıkta sıfır olmayan kodla çıkar. Okunmak için orada duran iki liste dışında, uçuş ortasında olanlar ve items with no shape dahil her satır sayılır: in passing ve free ends apart. Derinlik sırası ve içinden geçme (her şeye karşı boru ve katıya karşı katı) aynı yeniden oynatılan karelerde kontrol edilir: yaylar oturana kadar açılmanın ve kapanmanın her karesi, her kademe sınırının iki yanında 8 ms'de bir geri dönüşün her karesi (reversalsOf: Raptor'un 35 ms'lik kademesinde 0.027, 0.043, 0.062, 0.078 … 0.393 s) ve önek durumları (prefixStates). Derinlik bu karelerin her dördüncüsünü kullanır. Her satırın nasıl okunacağı ve düzeltileceği:
| Satır | Anlamı | Çözüm |
|---|---|---|
through A × B clearance -2.4 |
A borusu o yay uzunluğu aralığında B ile kesişiyor. | A'yı yaklaşık 1.5 yarıçap pay bırakarak B'nin çevresinden yeniden yönlendirin ya da B'yi taşıyın. Yalnızca A'nın uç kenarının oturduğu şekil, o ucun yaklaşık bir yarıçap içinde, mazur görülür. |
close A × B clearance 0.2 < 0.6 |
A, B'nin yanından yarıçapının yarısından az payla geçiyor. | Yolu biraz kaydırın; kablo demeti şeritlerinin aralığını genişletin. |
clearance apart: through share 1 … |
Sökülmüş durumda bir boru bir şeyin içinden geçiyor. | O grubun patlatma vektörünü değiştirin. |
terminals: A end 1.40 from B (rim -1.1…1.3) |
A'nın ucu ya da uç flanşının kenarı bağlantısına oturmuyor: havada duruyor, eğik ya da flanş altındaki göbekten geniş. | Yolu tam yüzeyde, yüzey normali boyunca bitirin; göbeği en az flanş kadar geniş yapın; eğri bir gövdede flanşı bir eyer pedine oturtun. Bir kablo asla bir kelepçede bitmez. |
loose ends: share 1 A end touches nothing that moves with it |
Sökülmüşken uç havada asılı: başka bir sahibe ait hiçbir şey onunla birlikte hareket etmiyor (kendi flanşı ya da kabuğu sayılmaz). | Ona birlikte hareket eden bir bağlantı verin ya da çıkması amaçlanıyorsa (flanşlı bir kanal, başka bir gruptaki bir konektör) onu free olarak işaretleyin; böylece bir tercih olarak "free ends" altında listelenir. |
self-overlap: A:3 its outline folds back on screen |
Bir parçanın dış hattı kendini kesiyor: çizgi kendi yarı genişliğinin altında bir ekran yarıçapında dönüyor (bir porta yakın dönen, izleyiciye bakan bir bacak). | Porttan bir dirsek bilyesiyle çıkın (Raptor'un elbow'u), dönüşe daha fazla düz bacak verin ya da izleyiciye bakan bir düzlemde bükün (Raptor'un sideOn'u, craft.md, bölüm 8). |
wobble: A dr/ds turns at s = … |
Elle yazılmış düğümlerden pürüzsüzleştirilmiş bir profilin eğimi düzleşip tersine dönüyor; bu yüzden ton bantları merdiven yapıyor. | Ona analitik bir r(s) verin ve smooth: { slope } geçin. |
saddles off their host apart: A (piece) is cut to B (host piece) |
Bir eyer pedi başka bir grupla uçup kesik tabanını gösteriyor. | Pedi ev sahibinin grubuna verin; hareket eden boru onun düz yüzünden ayrılır. |
solid state A × B sunk 1.81 deep |
Farklı gruplardaki iki katı o karede birbirinin içinden geçiyor. | Boru için olduğu gibi: sırayı ya da vektörleri düzeltin veya bir çıkıntının altındaki boşluğu açın. |
screen folds: A turns 150° on screen for 78° in 3D |
Yol ekranda geri dönüyor ve bir sivri uç gibi okunuyor. | Dönüşten önceki bacağı ekranda yana doğru yönlendirin. |
screen folds: A turns 110° on screen round a 0.4 px bend |
Görünür bir büküm bir noktaya sıkışıyor: fileto kenardan görülüyor, bu yüzden iki bacak bir V'de buluşuyor. | Bir bağlantı parçasının içinde dönün (bir bilyeli T, hattın 45°'de ayrılması), izleyiciye bakan bir düzlemde bükün ya da portu normali ekran boyunca uzanacak şekilde taşıyın. |
through in mid-flight: apart 0.233 s A × B clearance -1.6 |
O yeniden oynatılan karede A, B'nin içinden geçiyor. | Sırayı ya da vektörleri düzeltin (motion.md, "Kademe sırasını belirleyin"): dıştaki parça önce ayrılır, başka bir grubun yüzüne bakan bir vektör o grubun daha önce ayrılmasını gerektirir, iç içe geçmiş parçalar bir yayı paylaşır. |
crowding: A bend × B outlines overlap 0.05 px |
A'nın bükümü ya da ucu ekranda B'nin dış hattına düşüyor ve bir birleşim ya da B'nin içinden geçen bir çizgi gibi okunuyor. | Buluşma iki düzlüğün net bir kesişmesi olacak şekilde yeniden yönlendirin ya da görünür bir boşluk bırakın. Bir çifti (allow) ancak 8×'te baktıktan sonra mazur görün. |
crowding: A end × B (rod) |
A'nın ucu ya da bükümü ince bir katının dış hattına düşüyor: bir gergi çubuğu, piston çubuğu, direk, ray ya da sap (yarıçapının ya da yarı genişliğinin 4 katından uzun her katı). Çubuk A'nın bağlantı parçasına takılmış gibi okunur. | Porta çubuğun karşısından yaklaşın ya da dirseği son bacak ekran boyunca uzanacak şekilde döndürün. |
stand-in shapes: A its shapes cover 4% of its drawing |
A için kaydedilen şekiller, A'nın çizdiğinden çok daha azını kaplıyor; bu yüzden denetim bir şeridi kontrol ediyor ve geri kalanı hakkında hiçbir şey söylemiyor. | Çizdiğinizin gerçek şeklini kaydedin (bir salmastradan kayarak çıkan çubuk için A.slide). Bir öğeyi (cover: [name]) ancak çizimi gerçekten gövdesinin ötesine uzanıyorsa ve ancak ona baktıktan sonra mazur görün. |
crowding: C fitting × B |
Bir kelepçe başka bir çizginin 2 px yakınına düşüyor ve o çizgi ondan çıkıyormuş gibi okunuyor. | Patlatma vektörünü ya da kelepçenin açısını değiştirin. |
support: loose A / hanging A / sunk A × B 1.2 deep |
Bir katı ya da rijit bir boru sehpaya giden hiçbir şeye değmiyor ya da B'ye gömülü. | Onu tutan braketi, saplamayı ya da plakayı ekleyin; gömülü bir parça için teması düzeltin (yüzey üzerinde kenar, seated işaretli ev sahibi tarafından kesilen ped; seated yalnızca ev sahibini kendi cut'ında mazur gösterir). |
order A is in front of B but drawn first |
A'nın yüzeyi örtüştükleri her yerde daha yakın, ama B onun üzerine boyuyor; dinlenmede ya da bir uçuş ortası karesinde. | Bunları normalde orderKeys düzeltir; kalan bir tane, bir kuralın bir döngüden düştüğü anlamına gelir; o döngüde kilitlenmiş çifti arayın. |
cycle A … (n the other way) |
A ve B bir yerde her biri diğerinin önünde: ekranda iç içe geçiyorlar. | Geometriyi değiştirin: boruyu bileziğinde boşluklu bırakın, bandı halkada bölün, çubuğu bilyede bitirin, salyangozu teğet yapın, valfi bir düzlüğe koyun, bir pedi ev sahibinin siluetinden uzak tutun. |
in passing |
Yalnızca tekdüze bir durumda kilitlenmeler ya da hiçbir k + lift · share ile sıralanamayanlar (tüm gruplar tek bir payda; sayfa bunu asla göstermez). |
Başarısızlık değil. Aynı şey yeniden oynatılan bir karede bir depth order sorunudur. |
items with no shape |
Bir şey kaydedilmiş bir şekil olmadan çiziliyor; bu yüzden hiçbir şey onu kontrol etmiyor. | Onu çizen yardımcıda kaydedin. |
Sıfır bir denetim gereklidir, yeterli değildir: bir dikişi, bir merdiveni ya da duran bir dokuyu göremez ve yalnızca kaydettiğinizi kontrol eder. Onu susturan bir vekil şekil bir hatadır; bu yüzden onu başarısız sayar. Çizgi kontrolünü çalıştırın, sonra bakın.
Yörünge (3B şekiller)
Dönen grupları olan bir şekil (references/3d.md) yörünge denetimini ve tarayıcı kontrollerini ekler. Bunları açık ve koyu sayfada çalıştırın.
node build.mjs --light --audit > audit.txt 2>&1 & # tam çalıştırma, arka planda: "turn audit passed" ile biter
node build.mjs --light --audit --quick # yinelerken ≈ 10× daha az durum: "turn audit quick" ile biter
node build.mjs --light --audit --quick --only=order,continuity # bir alt küme: geri kalanı "skipped" yazar, "turn audit partial" ile biter
node build.mjs --light --verify # --order için window.__isoVerify (kaydedilmiş şekiller) içeren bir sayfa
node ../../scripts/turn-check.mjs build.mjs --fidelity
node ../../scripts/turn-check.mjs page-verify-light.html --order --step 1
node ../../scripts/turn-check.mjs page-verify-light.html --order --states clip.json # menteşeler ve klipler: --step yalnızca ilk dönme grubunu döndürür
node ../../scripts/turn-check.mjs page-light.html --pops --no-webgl --states tilt-path.json # tek bir menteşe, 0.02°'de sürekli bir yol olarak
node ../../scripts/turn-check.mjs page-light.html --pops --no-webgl --step 1 --out shots/pops
node ../../scripts/turn-check.mjs page-light.html --lines
node ../../scripts/turn-check.mjs page-light.html --perf --width 1440
node ../../scripts/turn-check.mjs page-light.html --perf --width 390 --throttle 4
node ../../scripts/drive.mjs page-light.html '[["orbit", "shots/orbit.png", 0, 345, 15]]'
Süre. Bir dönüş, bir menteşe ve bir klipli 28 parçalı bir şekil hızlı modda 85 s, tam modda 17 dakika sürdü; 10 dakikalık bir kabuk zaman aşımını geçti: tam denetimi arka planda çalıştırın. Hızlı çalıştırmalar az örnekler (continuity 800 yerine 100 yarılama adayını, sıra taraması durumların onda birini kontrol eder); bu yüzden yol gösterirler ve yalnızca tam çalıştırmanın turn audit passed'ı geçerlidir. --only ile bir çalıştırma asla passed değil, turn audit partial ile biter.
Durumlar. Denetim her dönme grubunu 0.3°'de (sıra) ve 0.05°'de (süreklilik) tarar; artı 2000 rastgele durum ve her sıra değişikliği olayı ± 0.001°. Hareket klipleri (clips: [{ name, at(t), from, to, frame }]) kare kare yürünür: bir hareket, bir kavrama, bir kopma. Serbest ve menteşe grupları yalnızca verdiğiniz durumlarda kanıtlanır; bu yüzden her klibi birkaç dönme açısında verin.
Satırlar. separation, unseparated, cycles, forced, swaps, layers, rigid, swept, posed, folds, self, crowding, endon, coverage, depth, continuity. 3d.md, bölüm 13, her satırın başarısızlığını ve çözümünü içerir. Yerleştirilmiş bir hata her satırı başarısız kılar: gömülü bir ped (separation), üç eğik çubuktan bir fırıldak (cycles), dikey bir düzlemde bükülmüş bir lif (folds), 30°'de bir boru (endon), duran bir nervür sırası (continuity).
Tarayıcı kontrolleri (her biri önce kendi kontrol örneğini çalıştırır; başarısız olmayan bir kontrol örneği, kontrolün bozuk olduğu anlamına gelir):
--order: DOM'un dolgularına karşı bir WebGL z-buffer'ındaki kaydedilmiş şekiller: her açıda ve klip durumunda 4+ iç pikselli 0 canlı çift.--pops: her derecede birinci fark (θ → θ + 0.02°) ve tam bir tur boyunca 0.1°'de ikinci fark: hayatta kalan 0 bölge, 6+ px'lik 0 çekirdek. Listelediği 1–5 px'lik çekirdekleri okuyun.--lines: 24 açıda 0 havada kalan uç.--perf:3d.md, bölüm 15'teki bütçeler; 1440'ta ve 4× CPU ile 390'da.
Yörünge sayfaları. 15°'de 0–345°, ardından en büyük üç sıra değişikliği boyunca 0.1°'lik adımlar (denetim bunları "order changes" altında listeler), ardından yavaşlatılmış her klip (["slow", 0.05]). Bunları örümcek açıları (bir yönden bacak gibi okunan bir el), başkalarının arkasında kaybolan parçalar ve başka bir parçanın dış hattında biten çizgiler için okuyun.
3B şekiller için kontrol listesi
- Klipler dahil tam durum kümesiyle (
--quickdeğil,--onlydeğil)turn audit passed. - Her menteşe ve klip için
--statesüzerinde--order, her menteşe için 0.02°'lik bir yolda--pops(3d.md, bölüm 14). -
turn-checksıra, patlamalar ve çizgiler 0'da, sadakat geçti, her kontrol örneği tasarlandığı gibi başarısız. - Yörünge sayfaları 15°'de okundu; her mafsalın, kesişmenin ve doku ucunun 8 açıda, açık ve koyu temada 8× kırpımları.
- Malzemeler açık sayfada metal gibi okunuyor: parlaklık bantları dönüşle hareket ediyor, bir ton çapraz geçişinde hiçbir şey patlamıyor.
- Grubuna bağlanmış her shader onu 0.1°'lik adımlarda izliyor; dünya efektleri dönmüyor; mürekkep örten konturlarda duruyor (bir örtme maskesinin bir parçayla buluştuğu yerde 8× kırpım).
- Bütçeler 1440'ta ve 390 × 4'te ölçüldü; yoğun bir şekil gerektiriyorsa yarım hız kolu ile.
Yakın çekimler
Sahibi Raptor'un hatalarını açık temanın bir yakın çekiminde buldu: ana kanalın üzerinden geçen kablolar, basamaklı bir çan, aniden duran cıvata sıraları. O yakın çekimi her yerde, başkasından önce kendiniz çekin.
- İki temayı da derleyin (
node build.mjsvenode build.mjs --light) ve birleşimleri listeleyin: her flanş, T, dirsek, rotil, kelepçe, valf, körük, bant, eyer pedi ve kesişme; her eğri gövde (çanlar, boğazlar, kubbeler, koniler, valf şişkinlikleri, toplar);bandsOfile kesilmiş bir gövdenin her bant birleşimi ve bir dokunun bittiği her yer. Düz parçalarda da: bir kutu yüzündeki her dikiş, kaynak, takviye ve trim çizgisi (iki köşeye de ulaşıyor mu?), bir plakadaki her çentik ya da işaret sırası (bir cetvel şeridinde mi?), her nervür sırasının ekseni boyunca iki ucu, bir parça birleşiminde ve rakorlarında her dokulu hortum, kayan her çubuk (dinlenmede, strok ortasında ve tam strokta) ve içinde metin ya da shader içeriği olan her pencere ya da ekran. - Her alanı iki temada, monte edilmiş halde 4×'te çekin.
--zoom x,y,w,hkart px'i cinsinden bir bölge alır ve onu--zoom-scale(4) ile ölçekler:node scripts/capture.mjs page.html --out shots/joint-dark.png --zoom 200,80,220,170 node scripts/capture.mjs page-light.html --out shots/joint-light.png --zoom 200,80,220,170 - Ve sökülmüş halde, şekil sökülebiliyorsa. Onu oraya sürün, dinlenmeyi bekleyin, ardından bir bölgeyi 4 ölçekte çekin. Raptor Boşluk tuşuyla sökülmüş hale geçer ve okuma değeri ancak her yay vardığında
apart ·ile başlar; bu yüzdenapart.jsonşöyledir:[["key", " "], ["until", "document.querySelector('[data-readout]').textContent.startsWith('apart')"], ["wait", 400], ["shot", "shots/apart-joint.png", null, 4, [200, 80, 220, 170]]]node scripts/drive.mjs page.html --actions apart.jsonile çalıştırın, sonrapage-light.htmlüzerinde yeniden. - Her PNG'de şu hatalara bu sırayla bakın: bir şeyin içinden ya da içine geçen bir çizgi; yakın çizgisi arkada çizilmiş bir kesişme; başka bir çizginin dış hattında oturan bir büküm, uç ya da kelepçe; portundan uzakta duran ya da ona gömülü bir flanş; eğri bir yüzey boyunca basamak yapan ton blokları, oyuklar ya da soluk bir kama; düz bir kesimde biten bir bant; bir yüzeyin ortasında duran bir nervür, nokta ya da çizgi sırası; bir parça birleşiminde bir borunun parlaklığını ya da gölgesini kesen kılcal bir çizgi; dış hatta çentik açan bir dikiş; ulaşması gereken kenara varmadan duran bir dikiş, takviye ya da nervür; üst yüzde hiçbir şeye değmeyen kısa bir işaret; düz ve sert kenarlı ya da bir parça birleşiminde yeniden başlayan ya da kesilen bir hortum dokusu; hareket ederken dış hattı kırılan bir çubuk; penceresini aşan metin; bir açıklığın kenarından taşan shader içeriği. Aynı bölgenin önceki turdaki görüntüsüyle karşılaştırın.
- Shader'lar: efekt sırasında aynı bölgeler, artı
["slow", 0.05]ile yavaşlatılmış temas sayfaları (webgl.md, bölüm 9).
Ayrıntı turu. En son, 4×'te bir kırpım ızgarasıyla tarayın (bir Şekil için konu ve mekanizma, bir Kahraman ya da Destan için tüm çizim; SKILL.md, iş akışı adım 1) ve üzerinde doğru hiçbir şey olmayan herhangi bir yüz, köşe ya da taban parçası arayın. Her şekil son derece ayrıntılıdır (SKILL.md, "Her yaratım son derece ayrıntılıdır"): oraya ait gerçek parçaları ekleyin (vidalar, dikişler, pahlar, etiket plakaları, ölçekler, şeyleri tutan braketler); asla hiçbir parçaya ait olmayan süsleme değil.
Açık tema shader'ları
Açık tema yayınlanan temadır ve kâğıt üzerinde bir parlama mürekkeptir. Şimdiye kadarki her açık tema dönüşümü, tek bir karenin resminin göstermediği bir şey yüzünden önce incelemeden kaldı: ışık azalırken artan mürekkep, parlamadan önce soluk bir çakma, somon renkli bir aşama, bir konturun yanında bir saçak. Bu yüzden mürekkebe bakmanın yanı sıra onu ölçün (webgl.md, bölüm 8).
Kare başına mürekkep. Bunu ink.js olarak kaydedin ve --preload ile verin. Sayfanın çizdiği her kare için bir tuval bölgesinin beyaz üzerine bıraktığı ortalama mürekkebi, 255 − lum(rgb + 255 − a), çizimle aynı görevde geri okuyarak kaydeder:
const get = HTMLCanvasElement.prototype.getContext;
HTMLCanvasElement.prototype.getContext = function (kind, ...rest) {
const gl = get.call(this, kind, ...rest);
if (gl && String(kind).startsWith("webgl") && !this.__gl) {
this.__gl = gl;
for (const name of ["drawArrays", "clear"]) {
const call = gl[name].bind(gl);
gl[name] = (...args) => { gl.__drew = true; return call(...args); };
}
}
return gl;
};
const raf = window.requestAnimationFrame.bind(window);
window.__ink = [];
window.requestAnimationFrame = (callback) => raf((now) => {
callback(now);
const canvas = document.querySelector(window.__inkCanvas || "canvas");
const gl = canvas && canvas.__gl;
if (!gl || !gl.__drew) return;
gl.__drew = false;
const [x, y, w, h] = window.__inkBox || [0, 0, canvas.width, canvas.height];
const px = new Uint8Array(w * h * 4);
gl.readPixels(x, y, w, h, gl.RGBA, gl.UNSIGNED_BYTE, px);
let ink = 0;
for (let i = 0; i < px.length; i += 4) {
const bare = 255 - px[i + 3];
ink += 255 - (0.2126 * (px[i] + bare) + 0.7152 * (px[i + 1] + bare) + 0.0722 * (px[i + 2] + bare));
}
window.__ink.push(Math.round((ink / (w * h)) * 100) / 100);
});
- Neyi ölçeceğinizi seçin. Geçişten önce bir
evalilewindow.__inkCanvas'ı (bir seçici) vewindow.__inkBox'ı (tuvalin aygıt px'i cinsinden[x, y, w, h], sol alttan ölçülür; CSS px'icanvas.width / canvas.clientWidthile ölçekleyin) ayarlayın. Satırları sonra["eval", "window.__ink.join(' ')"]ile okuyun. - Önemli her bölge için bir kez yapın: bir boşluk, çekirdek, yalnızca yedeğin kapladığı bir alan. Yavaşlatılmış olarak ilk ışık boyunca (
window.__driveSpeed=0.04içeren ikinci bir dosyayı--preloadedin), her evre değişikliğinde ve sönmede çalıştırın. - Neye bakmalı. Mürekkep fiziksel niceliği monoton olarak izler: ışık gelirken artar, giderken azalır. Bir devirde tümsek, ilk ışıkta çukur yoktur.
- Ne yakaladı. Art yakıcının boşluğu düzeltmesinden önceki kesimde 3600'de zirve yaptı; sonrasında 1894'ten 155'e monoton olarak düştü. Bu satırlar o şeklin kendi birimlerindedir; bu kancanın ortalaması değil, pencere bölgesi üzerinde bir toplamdır. Dalga leğeninin açık sayfasında kanca dinlenmede 14.2 okur ve lamba geldikçe düşer, çünkü o sayfanın ışığı kâğıdı aydınlatır.
Rampa boyunca renk. Isınan ya da soğuyan her şey için, birkaç sıcaklıkta (ya da yavaşlatılmış bir çalıştırmanın birkaç sıcaklığa karşılık gelen anında) merkezde ve kenarda bir piksel okuması eval edin ve not edin. Sıra mat kırmızı → turuncu → sarı → beyaza yakın olmalı, kenar merkezden serin olmalı ve yolda somon ya da gri bir aşama olmamalıdır.
Kesitler. Bir alevin, bir jetin ya da bir akıntının boyunca bir mürekkep satırı okuyun. Eksende zirve yapar ve yarı saydam kenarlara düşer. Kenarı ağır bir profil, içi boş, dış hatlı bir alevdir.
8–16×'te konturlar. Mürekkebin bir SVG konturuyla buluştuğu her yeri (kesik yüzler, kenarlar, ağızlar, kıvrımlar, bir gövdenin girdiği tuval kenarı) açık temada 8–16×'te kırpın. Mürekkep ile çizgi arasında soluk bir boşluk, çizginin üzerinde mürekkep ya da mürekkebin temizlediği bir kontur arayın.
İki yol da, iç içe de. Her açık tema değişikliği uLight'a bağlı olduğu için koyu derleme kendi taban çizgisiyle eşleşmelidir. Açık bir sayfada koyu bir kart ve kendi başına açık bir kart çizin; her birini WebGL'li ve WebGL'siz: bir :not([data-theme="dark"]) kuralı sayfanın içinden koyu bir karta ulaşabilir.
Gözden geçirme kontrol listesi
Bir nesne
- Bir bakışta gerçek, iyi yapılmış tek bir şey olarak okunuyor ve ona bir ad verebiliyorsunuz.
- Mekanizması kavrama karşılık geliyor: neyin hareket ettiği ve bunun ne anlama geldiği tek cümleyle söylenebiliyor.
- Soyut plakalardan bir yığın değil ve tek, düz bir levha değil.
Parçalar ve hacim
- Satır içi bir şekil için 30–60 katı; gerçekten daha fazla parçası olan bir kahraman konu bunu çok aşabilir (Raptor'un yaklaşık 270'i var). Her parça başka birinin üzerinde duruyor ve bir işi var.
- Yanlar gölgeli ve üstler daha açık; ana levhalarda pahlar; tabanın ve kaldırılmış parçaların altında bir hale.
- Küçük ayrıntılar parçalara ait: plakaların köşelerinde vidalar, oluklar, cetveller, tırtıllar, etiket plakaları.
Çizgiler
- 4×'te her çizgi bir yüzde, başka bir çizgide ya da bir uç noktasında bitiyor. Hiçbir şey havada durmuyor.
- Kılavuz çizgileri, balonlar, ölçü okları ya da havada duran etiketler yok; en fazla bir kazınmış etiket.
- Ressamın sırası her yerde doğru: arkadaki hiçbir şey görünmüyor, yaylar ve çerçeveler bölünmüş.
- Denetim sıfır. Şekilde borular, kablolar ya da yuvarlak parçalar varsa
node build.mjs --auditaudit passedile bitiyor: monte, sökülmüş ve yeniden oynatılan patlatmanın her karesinde (açılış, kapanış ve geri dönüş) her başarısız satırda sıfır. Hiçbir kilitlenme bir anahtar sapmasıyla gizlenmedi ve mazur görülen her çifte (allow,crowd) 8×'te bakıldı. - Hiçbir boru ya da kablo başka bir borunun, kablonun ya da katının içinden geçmiyor ve her kesişme derinlik sırasıyla çiziliyor: yakın çizgi üstte, düzlüklerde kesişen, derinlikte birbirinden uzak.
- Yapının yanından geçebilecekken konunun yüzünün üzerinden geçen bir çizgi yok; ekranda bir V'ye sıkışan büküm yok; monte ya da sökülmüş halde başka bir çizginin dış hattına düşen büküm, uç ya da kelepçe yok.
- Her flanş portuna oturuyor (port eğriyse bir eyer pedinde); her bilezik, kelepçe, bant, körük ve valf sardığı boruyu boşluklu bırakıyor; her valf ve körük bir düzlükte duruyor; hiçbir yol ekranda geri dönmüyor; sökülmüşken de her uç bir flanş, kaplin, konektör ya da uç noktasında bitiyor.
- Birleşim yakın çekimleri. Her birleşim alanı iki temada, monte ve sökülmüş halde 4×'te çekildi ("Yakın çekimler"e bakın) ve her PNG okundu.
- Merdiven yok. Her eğri yüzey 4×'te pürüzsüz gölgeli: basamaklı ton blokları, oyuklu teraslar, soluk kama, düz bir kesimde biten bant, bir bant birleşiminde kırık yok; bel veren gövdeler gerçek dış hatlarını izliyor; dikişler dış hatla çentiksiz buluşuyor.
- Çizgi uçları sıfır.
node scripts/lines.mjsiki temada ve dinlenme pozlarının her birindeline ends: 0yazdırıyor; herfreeuç metni temsil eden bir çizgi, bir ibre kuyruğu ya da bir işaretçi ucu. - Şekiller gerçek. Vekil şekil yok: kaydedilen, kayan çubuklar dahil, çizilenin ta kendisi.
- Ani doku sonları yok. Her nervür, cıvata noktası, çizgi ya da oluk sırası gerçek bir kenarda bitiyor ya da sönüyor; hiçbiri, düz yüzler dahil, bir yüzeyin ortasında tam güçte durmuyor. Kutulardaki dikişler köşelerini sarıyor, nervür sıraları dikişlerinde bitiyor, çentikler bir cetvel şeridinde duruyor ve bir hortumdaki doku kesitini izleyip her parça birleşiminden geçiyor. Boru şeritleri uç kapaklarına uzanıyor ve kuvvetle eğri, sivrilen bir boruda da (bir salyangoz) hiçbir parça birleşiminde kılcal çizgi göstermiyor.
Ton ve renk
- Taban
lo, yapımid, konuhi, tam olarak birlitvurgu. - Renk konunun kendisi değilse tek renkli.
Kart ve sözcükler
-
Şekil n/ başlık / ipucu / canlı okuma köşelerde; lejant anahtarları ve bir açıklama kartın altında. - Her sayı doğru ve modelden geliyor. Okuma değeri şeyler hareket ettikçe değişiyor ve sözcükleri ile sayıları aynı andan geliyor: geride kalan bir manometreden gelen bir sayının yanındaki modelden gelen bir evre sözcüğü, valf açılmadan
tahliye 85 barokur. - Makinenin gösterdiği metin en geniş dizgisinde penceresine sığıyor ve ona kırpılıyor.
Hareket ve erişim
- Yumuşatılmış, sakin, yapışma yok; bir boşta tur; etkileşimde duruyor.
- Ekran dışında duruyor;
--reducedaltında durağan; konsol hatası yok (React key uyarıları dahil). - Klavye çalışıyor, odak halkası görünüyor ve
aria-valuetextdurumu sözcüklerle okuyor.
Shader'lar (şeklin bir tane varsa; references/webgl.md)
- Her geçiş boyunca (başlangıç, her evre değişikliği, kararlı durum, duruş)
["slow", 0.05]ile yavaşlatılmış bir temas sayfası (yüklemede başlayan bir efekt içinwindow.__driveSpeed=0.04ile--preload); böylece her çapraz geçişin her karesi görünüyor: ani renk değişimi yok, tek karelik çakma yok, kesilen bir şey yok ve parlaklık bir sönme sırasında asla artmıyor. - Efektin SVG ile buluştuğu yerlerde 2× ve 4× kırpımlar: dikiş, sert kenar, bantlaşma, koyu yaka ya da çift çizgi yok; bir düzlemdeki şeyler o düzlemin çizgileriyle hizalı.
- Tuvalin dış satırları ve sütunları her evrede alfa 0 okuyor.
- WebGL olmadan (
--no-webgl) yalnızca SVG hâlâ okunuyor; azaltılmış harekette tek, temsil edici bir durağan kare alıyorsunuz; döngü boştayken ve ekran dışındayken duruyor. - Açık tema (
webgl.md, bölüm 8; yukarıdaki "Açık tema shader'ları"):- Parlamalar doygunlukla okunuyor; doygun bir gövde, soluk bir çekirdek ve renkli bir kenarla; asla koyu ya da kahverengi mürekkep olarak değil.
- Işığın düştüğü şey renkleniyor ve ışığı tutan boşluk daha koyu fiziksel bir zemin.
- Sıcak gövdeler somon aşaması olmadan kara cisim sırasıyla ilerliyor.
- Duman ve buhar açık gri.
- Boş havada haleler yok.
- Kare başına mürekkep ilk ışık, her devir ve sönme boyunca ışığı monoton olarak izliyor.
- Mürekkep 8–16×'te her konturun iç kenarında duruyor.
- Yedek aynı mürekkepleri ve zemini gösteriyor ve shader'a çukur olmadan devrediyor.
- Koyu tema değişmedi ve açık bir sayfadaki koyu bir kart hâlâ çalışıyor.
Kompozisyon
- Ortalanmış, kartın yaklaşık %55–65'ini dolduruyor; köşe etiketlerine değmiyor.
- Yalnızca dinlenmede değil, bir parça seçiliyken ve bir yanma sırasında da 390 px'te yana kaydırma olmadan okunuyor: en uzun okuma değeri kontrollerin altına taşmamalı.
Yaygın hatalar ve çözümleri
| Gördüğünüz | Çözüm |
|---|---|
| Bir parça önündeki bir şeyin içinden görünüyor | Çok geç boyanıyor. Onu daha öne alın ya da öndeki parçayı bölün. |
| Bir direğin bir yüzle buluştuğu yerde boydan boya bir elips görünüyor | Devam eden bir silindirin üzerine çizilen tam bir ring arka yarısını gösterir. sideArc (yalnızca ön yarı) kullanın ya da kenarı silindirin kendi dış hattının yapmasına izin verin. |
| Bir direk içinden geçtiği bloğa yapıştırılmış gibi görünüyor | Onu altta ve üstte iki parça halinde, blok aralarında boyanarak çizin. |
| Bir kıvrım ya da pah bir köşeye varmadan duruyor | slabOf/cylinder üzerinde bevel kullanın. Zaten siluette biter. Kenar çizgilerini elle çizmeyin. |
| Düz, cansız yanlar | flat geçtiniz ya da katının yüksekliği 0. Ona kalınlık verin. |
| Fazla seyrek | Doku değil, yapı ekleyin: ayaklar, cetvelli ve son duraklı raylar, bir etiket plakası, vidalar, bir topuz, ikinci bir kademe. |
| Fazla kalabalık | Doku benzeri tekrarları çıkarın ve olukları faint'e indirin; tek bir aydınlatılmış vurgu tutun. |
| Şekil kartta minicik | Daha küçük bir pad ile sığdırın ya da fitProjection'a verilen noktaları sıkılaştırın. |
| Bir sekme yeniden odaklandığında sıçrıyor | dt'yi 1/30 s ile sınırlayın. |
| Key uyarıları yalnızca büyük sayfada | react.md'ye bakın: öğe prop'larının köklerine key verin. |
| Bir shader rengi bir evre değişikliğinde sıçrıyor | Renge kendi yavaş zarfını verin ve onu bir evre bayrağından değil, fiziksel nicelikten sürün. webgl.md, bölüm 7'ye bakın. |
| Parlamada, çoğu zaman tuval sınırında düz bir kenar | Bir terim bir sınırda sıfır değil. Her if'ten, sınırdan ve tuval kenarından önce onu sıfıra pencereleyin. |
| Bir parlama zeminin içinden ya da bir kolonun üzerinden geçiyor | Ekran uzayında. Onu ışın ve zemin isabetiyle dünya uzayında yeniden kurun ve shader'a basit parçaları örtücü olarak verin. |
| Parlayan bir kenarın altında koyu bir yaka | Kenar shader'ın üzerine normal karışımla çiziliyor. Onu mix-blend-mode: screen ile bir kaplama SVG'sine taşıyın. |
| Yumuşak parlamalarda düz bantlar | tonemap'ten sonra kapılı üçgen titreşim (dither) ekleyin. |
| Açık temada bir parlama koyu kırmızı ya da kahverengi duman gibi okunuyor | Koyulaştırılmış koyu tema rengi, alfası parlaklığa ayarlanmış. Mürekkebi doygun bir gövde, soluk bir çekirdek ve bir alfa tabanıyla bir kâğıt rampasından çözün (webgl.md, bölüm 8.1). |
| Açık temada ilk ışık önce soluklaşıp sonra koyulaşıyor ya da bir sönme griye dönüyor veya ağırlaşıyor | Terim başına sönmeler, yalnızca alfa sönmesi ya da sabit alfada kızaran bir renk tonu. Bitmiş mürekkebi bir kez söndürün, enerjiyi ve alfayı birlikte kısın ve renk tonunu sabit parlaklıkta alın (webgl.md, bölüm 8.2). |
| Açık temada bir kenar boyunca soluk bir saçak ya da beyaz bir dikiş | Mürekkep konturdan önce duruyor ya da kimsenin konturlamadığı bir kıvrımı temizliyor. Onu konturun iç kenarında (0.3 vb) bitirin ve kıvrımı mürekkeple çizin (webgl.md, bölüm 8.6). |
| Koyu bir kartın yedeği açık bir sayfada kayboluyor | Bir .iso:not([data-theme="dark"]) kuralı sayfanın içinden eşleşti. Koyu kuralı en sona koyun ya da kartın kendi temasına bağlayın (webgl.md, bölüm 8.5). |
| Bir boru ya da kablo yapıştırılmış gibi görünüyor ya da bir parçayı kesiyor | Parçaları tek bir katmanda. Her tubePieces parçasını mid'e göre derinlik sıralayın ve dokunduğu yerlerde daha kısa parçalar kullanın. Parçanın gerçekten içinden geçiyorsa yeniden yönlendirin; --audit her durumu listeler. |
| Kablolar ya da ölçüm hatları konunun yüzü boyunca ve bir ana kanalın üzerinden yelpaze gibi yayılıyor | Noktadan noktaya yönlendirildiler. Yapı boyunca yeniden yönlendirin: bir borunun yanından yukarı, gövdenin çevresinde kelepçeli şeritlerde, yandan uzak bir porta (craft.md, "Ara noktaları seçmek"). |
| Bir kesişmenin sırasını düzeltmek bir başkasını ya da sökülmüş pozu bozuyor | Elle ayarlanmış anahtarlar. Şekilleri kaydedin, anahtarları A.settle'ın ayarlamasına izin verin ve kilitlendiğini bildirdiği her şeyi geometride düzeltin. |
| Bir bilezik, bant ya da kelepçe borunun yakın tarafını gizliyor ya da boru bileziğin yüzünün üzerine boyanıyor | Boru onun içinden tek parça geçiyor. Boruyu bilezikte boşluklu bırakın (gaps); böylece her yüzde bir parça biter. |
| Bir gövdedeki halka arka yarısını gövdenin üzerinde gösteriyor | Gövde halkanın altında uzun tek bir bant. Onu halkada bölün. |
| Bir valf ya da körük uçlarında borusuna kesiyor | Bir bükümün üzerinde duruyor. Onu en az kendi uzunluğu artı iki fileto kesimi kadar bir düzlüğe taşıyın. |
| Bir çan, kubbe ya da konide basamaklı ton blokları | Faset gölgelendirme. Eğri düğümleri pürüzsüz işaretleyin ([s, r, 1], varsayılan olarak pürüzsüz gölgelenir) ya da smooth: true geçin; bir gövdeyi G.bandsOf ile bantlara kesin. |
| Bir boğaz, koni ya da diskteki ton bantları duraksayıp oyuklarla sarsılıyor | Elle yazılmış düğümlerden pürüzsüzleştirilmiş bir profil: eğimi her düğümde düzleşiyor. Profili analitik bir r(s) olarak yazın ve türevini smooth: { slope } olarak geçin (wobble bunları listeler). |
| Pürüzsüz gölgeli bir parçanın içinde kılcal dikişler | Ton levhaları yan yana. Kitin solidSvg'sini seamless yollarla (pürüzsüz torna parçaları ve sphereOf bunu ayarlar) ve ISO_CSS ile kullanın. |
| Bir nervür ya da cıvata noktası sırası bir yüzeyin ortasında duruyor | Sert bir least kesimi. ribsOf ya da dotsOf üzerinde fade: [lo, hi] kullanın. |
| Pürüzsüz gölgeli bir koni ya da çanda düz kenarlı soluk bir kama | Ton parçaları arasında çıplak dolgu: ters yönlerde sarılmış tek tonlu parçalar nonzero kuralı altında birbirini iptal ediyor ya da bir bant sivrilmeden bitmiş. Kit her ton çokgenini yönlendirir ve bantları sivriltir; ton yollarını kendiniz kuruyorsanız onları yönlendirin. |
| Daralan bir gövde soluk şeritli düz bir koni gibi görünüyor | Zarflanmış (hull). lathe'in fill: "auto"'yu seçmesine izin verin (ya da "surface" geçin). |
| Bir borunun parlaklık ya da gölge bandını kılcal bir çizgi kesiyor | Gövde ve şerit bir parça birleşiminde aynı çizgide kesilmiş. tubePieces şeritleri gövdenin ötesine uzatır; bunu değiştirirseniz koruyun. |
| Dikişlerin buluştuğu yerde dış hat kesikli | Dikişler katıdan sonra çizilmiş. Onları inner olarak geçin. |
| Bir borunun şeritleri ucuna varmadan duruyor | Kapaksız bir uç. tubePieces varsayılan olarak her ucu kapatır; görünen bir uç için caps: false geçmeyin. |
| Şekil sökülürken parçalar bağlantıları boyunca kayıyor | Bir grubun vektörüyle başka birinin yayında hareket ediyorlar. Öğeye o grubun ride'ını verin. |
| Uzun tornalanmış bir gövdenin bant birleşimlerinde kırık bir dış hattı var | Onu G.bandsOf ile kurun ve yanları sidesOf ile bir kez çizin (kit.md, bölüm 10). |
| Bir doku çizgisi bir yüzün ortasında duruyor | Onu gerçek bir kenarda bitirin ya da sönerek bitsin diye fadeLineSvg(points, { fade }) ile çizin. scripts/lines.mjs her birini listeler. |
| Bir kutudaki dikiş köşelerine varmadan duruyor | inner olarak k.sideSeam(plan, z, P, steps). |
| Düz sert kenarlı ya da parça birleşimlerinde kırık bir hortum örgüsü veya oluğu | tubePieces(…, { rings: { pitch, twist, cross: true } }). |
| Bir çubuğun dış hattı kayarken çentikleniyor | G.rodOut'tan tek bir çubuk, salmastrada kırpılmış, A.slide ile kaydedilmiş; asla üst üste binen kopyalar değil. |
| LCD ya da sayaç rakamları pencereyi aşıyor | Yazıyı pencerenin yüksekliğine ve en geniş dizgisine sığdırın ve kırpın. |
| Bir valf ya da şişkinlik boyunca başıboş dış hat üçgenleri | Eski bir kit kırık bir silueti birleştirdi; kit artık bir yanın siluetinde boşluklar olduğunda zarfa geri döner. Güncel lathe.mjs ile yeniden derleyin. |