Zanaat
Bir şekil nasıl bir diyagram olarak değil de işlenmiş bir nesne olarak okunur hale gelir. Buradaki her kural, titiz bir gözden geçirenin reddettiği ya da onayladığı bir şekilden geldi.
İçindekiler
- "İşlenmiş" ne demek
- Anti-kalıplar
- Tarifleriyle parça sözlüğü
- Tonlar
- Ressamın sırası
- Kamera ve kompozisyon
- Temalar
- Yuvarlak parçalar ve borular
- Patlatılmış görünümler
- Ekranlar ve yüzlerdeki şeyler
- Shader'lar
1. "İşlenmiş" ne demek
Onaylanan şekillerin beş ortak niteliği vardır.
- İnşa edebileceğiniz gerçek bir nesne. Okuyucu ona bir bakışta ad verir: bir test düzeneği, bir komparatör, bir çekmeceli dolap, bir portal çizici, bir kilit. Konu için icat edilir, asla bir referanstan kopyalanmaz.
- Çok sayıda küçük, kesin parça. İyi bir satır içi şeklin 30–60 katısı ve 300–500 yolu vardır. Gerçekten daha fazla parçası olan bir kahraman konu çok daha fazlasını taşıyabilir: masaüstü bilgisayarın yaklaşık 85 katısı, Raptor'un 478 derinliğe göre sıralanmış öğede yaklaşık 270 katısı vardır. Her parça başka bir parçanın üzerinde durur, komşularıyla hizalanır ve bir işi vardır. Yoğunluk dokudan değil, yapıdan (ayaklar, raylar, duraklar, burçlar, topuzlar) gelir.
- Hacim. Parçaların gerçek kalınlığı, dört tonda gölgelenmiş yanları, daha açık üstleri, ışığı yakalayan pahları ve altında yumuşak bir halesi vardır.
- Sükûnet. İnce 0.6 px'lik çizgiler ve ölçülü bir palet. Tek bir aydınlatılmış vurgu göze nereye bakacağını söyler. Hareket yumuşatılmıştır ve izlenebilecek kadar yavaştır.
- Doğruluk. Okuma değeri canlı ve doğru sayıları gösterir ve hareket gerçek modeli izler: gerçek sertlikte yaylar, gerçek boyutlar ve eşikler.
2. Anti-kalıplar
Gözden geçirenler bunların her birini reddetti, bu yüzden yapmayın:
- Soyut yığınlar. "Katmanları" temsil eden havada duran plakalar, levhalar ya da karolar hiçbir şey olarak okunamayacak kadar soyuttur. Katmanlara ihtiyacınız varsa onları çekmeceler, bir raftaki tepsiler, kılavuz sütunlar üzerindeki plakalar ya da bir tutucudaki kartlar yapın.
- Tek büyük düz levha. Birkaç çizgili büyük bir yüzey fazla düz ve sıkıcıdır. Onu bir tabana, bir kızağa ve parçalara bölün; bir oluk, vidalar, bir cetvel ve bir etiket plakası ekleyin.
- Teknik resim mobilyası. Kılavuz çizgileri, numaralı balonlar, ölçü okları, tarama, kesikli gizli kenarlar ve havada duran etiketler çizime değil, lejanta ve açıklamaya aittir.
- Havada duran çizgiler. Kılavuz yelpazeleri, bir parçaya varmadan biten bağlantılar ya da siluet köşesinden önce duran bir kıvrım. Her çizgi bir şeye inmelidir.
- Tel kafesler. Arka kenarların göründüğü saydam kutular.
- Her yerde renk. Renk konunun kendisi değilse tek renkli tutun: tek bir aydınlatılmış vurgu ve yalnızca renk kanalları için gerçek RGB. Bir akışkan varsayılan olarak renk değildir: bir gözetleme camındaki yağ, bir tanktaki su ve bir borudaki soğutucu şeklin kendi mürekkeplerinin tonlarıdır ve
--no-webglyedeği shader'ın çizdiği tonun aynısını çizer. Kör testli bir tezgâh, yağını başka her yeri gri olan bir şekilde doygun turuncuya boyadı ve yedeğindeki yağ griydi. - Çizimde metin. En fazla bir küçük kazınmış etikete izin verin (bir yüzde
FaceText). Diğer her şey kart köşelerine, lejanta ya da açıklamaya gider. - Bir referansı kopyalamak. Bir referanstan havayı ve işçiliği alın, sonra nesneyi icat edin.
- Ham işaretçi sıçramaları. İmlece yapışan parçalar. Her şeyi yumuşatın.
- Boruların içinden geçen borular. İlk Raptor'da sahibi yakınlaştırıp ana kanalların ve birbirinin içinden geçen kablolar ve hatlar buldu: "bunun hiçbir anlamı yok". 1×'te iyi görünüyordu. Her boru ve kablo kendi bağlantısı dışındaki her şeyden uzak durur, her kesişme gerçek derinlik sırasıyla çizilir ve
kit/audit.mjsikisini de kanıtlar (bölüm 8, "Açıklık ve kesişmeler"). - Duran dokular. Aynı yakın çekimde yanma odasındaki cıvata noktası sıraları yüzeyin ortasında aniden duruyordu ve çan ile boğaz düz ton bloklarından bir merdiven gibi gölgelenmişti. İkisi de kırık gibi okundu. Sahibinin sözleriyle: bir dokunun bitmesi gerekiyorsa, "ani bir duruş yerine sonunda söndürmeyi tercih ederiz". Eğri yüzeyleri pürüzsüz gölgelendirin ve bir dokuyu gerçek bir kenarda bitirin ya da söndürün (bölüm 8, "Eğri yüzeylerde gölgelendirme ve dokular").
- Patlayan ya da kesilen shader'lar. İlk Raptor alevi evreleri arasında rengini anında değiştirdi, "kesilip yapıştırılmış gibi", ve bir parlama tuval kenarında düz bir çizgiyle bitti. Her shader terimi bir zarfa biner ve herhangi bir sınırdan önce sıfıra ulaşır (
webgl.md, bölüm 7). - Düz yüzlerde de duran dokular. Aynı hata daha sonraki bir şeklin kutularında, hiçbir eğri yüzey kuralının ulaşmadığı yerde geri geldi: her yuvarlatılmış köşeden 6 birim içeride bir tank kaynak dikişi, 4 birim içeride bir manifold yüz çizgisi, altında cetvel olmayan çıplak bir taban plakasında havada duran soluk çentik sırası, iki ucunda da dikiş yaylarına 2 birim kala duran soğutma nervürleri ve merkez çizgisi boyunca kesikli bir kontur olarak çizilen, hortum boyunca iki düz sert kenarla biten ve her parça birleşiminde kırılan bir hortum örgüsü. Bir kutudaki dikiş görünen köşeleri dolanarak kenardan kenara uzanır (
k.sideSeam), nervürler aynıs'deki dikişlerde biter (ribsOf(…, { seams: true })), çentikler bir cetvel şeridinin kenarından sarkar ve bir borudaki dokutubePieces(…, { rings })'ten gelir.node scripts/lines.mjs page.htmlhiçbir şeye değmeyen her çizgi ucunu başarısız sayar (verify.md, "Çizgi uçları"). - Vekil şekiller. Denetimi susturmak için bir yapımcı, üst üste binen beş çubuk kopyasının her birinin ucuna 0.45 kalınlığında bir disk ve silindir kafasına gömülü çizilmiş ikinci bir çubuk için bir şerit kaydetti. Denetim geçti ve iki çubuk hakkında da hiçbir şey söylemedi; aydınlatılmış çubuğun dış hattı hareket ederken her 12 birimde bir çentikleniyordu. Çizdiğinizin gerçek şeklini kaydedin; denetimin vekil kontrolü, kaydedilmiş şekilleri çiziminin %60'ından azını kaplayan bir öğeyi başarısız sayar. Bir salmastradan kayarak çıkan bir çubuk tek bir çubuktur (bölüm 3, "Bir salmastradan çıkan çubuk").
- Beyaza yapıştırılmış koyu tema parlamaları. Sahibi açık temayı her site şekli için yayınlanan tema yaptı ve koyu bir kart üzerine kurulmuş yedi shader şeklinin dönüştürülmesi gerekti. Koyu bir parlamayı alıp koyulaştırmak "kırmızı mürekkep dumanı" verdi (Raptor'un açık tema alevi). Ayrıca dış hat olarak çizilmiş alevler, kir gibi görünen kıvılcımlar, somon renkli soğuyan cam, gri sönmeler ve ateş söndükçe ağırlaşan boşluklar verdi. Kâğıt üzerinde ışık, doygunluk ve daha koyu fiziksel bir zeminle okunur (bölüm 7 ve
webgl.md, bölüm 8). - Bir yakın çekimi gözle düzeltmek. Bir ekran görüntüsü doğru görünene kadar bir ressam anahtarını ayarlamak ya da bir ara noktayı kaydırmak başka bir kareyi ya da başka bir temayı bozar. Raptor'un elle ayarlanmış anahtarları 1×'te doğru görünüyordu ve 323 derinlik sırası sorunu vardı. Ölçün (bölüm 8, "Açıklık ve kesişmeler"), sonra bakın.
3. Tarifleriyle parça sözlüğü
P izdüşüm ve k kittir; import * as k from "./iso-kit" gibi. Yükseklikler dünya birimlerindedir, z yukarı. Her tarifin katılarını listelenen sırayla çizin.
Ayaklar üzerinde taban plakası
const PLATE = { x: -128, y: -64, w: 262, d: 128, r: 8 };
halo: `<path class="iso-halo" d="${k.haloOf(PLATE, -17, 12, P)}"/>`
feet: for (const [x, y] of byDepth(k.corners(PLATE, 22))) {
k.cylinder(x, y, 7, -17, 1.6, P, 28) // flanş, ton lo
k.cylinder(x, y, 5.4, -15.4, 3.4, P, 28) // ayak, ton mid
}
slab: k.slabOf(PLATE, -12, 12, P, 8, 1.6) // ton mid, pah 1.6
groove: k.planOutline(k.insetPlan(PLATE, 5), 0, P) // çizgi lo
screws: k.corners(PLATE, 10) → k.ring(x, y, 2.2, 0, P, 16) (çizgi lo) + .5 boyutunda noktalar
Ayakları byDepth = (pts) => [...pts].sort((a, b) => k.depthOf([a[0], a[1], 0], P) - k.depthOf([b[0], b[1], 0], P)) ile sıralayın.
Cetvel şeridi ve etiket plakası
const strip = { x: -110, y: PLATE.y + PLATE.d - 15, w: 230, d: 7, r: 1 };
k.slabOf(strip, 0, 0.6, P, 3) // ton lo, kıvrım yok
const t = k.topTicks(strip.x + 4, strip.x + strip.w - 4, 4, 5, strip.y + 0.8, 0.6, [2, 3.6], P);
t.minor → çizgi lo, t.major → çizgi mid
etiket plakası: k.slabOf(plan, 0, 0.8, P, 4) + k.planOutline(k.insetPlan(plan, 1.6), 0.8, P) (faint)
+ farklı uzunlukta üç k.lineOnTop çizgisi (lo, { free: true }) + iki vida noktası
Çentikler yalnızca bir cetvel şeridinde ya da bir kadran yüzünde, kenarında kökleşmiş olarak yaşar: topTicks her çentiği edge'den büyütür, bu yüzden edge'i şeridin kenarına (ya da 1 birim içine) koyun; sideTicks onları top'tan sarkıtır, bu yüzden yüzün üst kenarını verin, onun 2 birim altını değil. Çıplak bir plakadaki işaret sırası, iki ucunda da havada duran bir dokudur. Etiket plakasının çizgileri basılı metni temsil eder; bu yüzden bir çizginin çıplak bir yüzde durabileceği tek yerdir: çizgi kontrolü bunun amaçlandığını bilsin diye free: true verin.
Bir kutudaki dikişler, kaynaklar ve trim çizgileri
const seam = k.sideSeam(TANK, 14, P, 6); // z = 14'te planın görünen yakın yarısı, köşeleri dolanarak
k.solidSvg(k.slabOf(TANK, 6, 98, P, 6, 1.2), { tone: "mid", inner: k.lineSvg(seam, { tone: "faint" }) })
Bir kutudaki dikiş, kaynak dikişi, bant ya da kapak çizgisi görünen köşeleri sarar ve tam olarak dikey siluet kenarlarında biter; bir silindirdeki sideArc gibi. Dikiş aynı fasetleri izlesin diye levhanın kendi steps'ini verin ve uçları dış hattın altına otursun diye onu inner olarak verin. Yalnızca tek bir yüze ait bir çizgi (bir takviye, bir panel birleşimi) yüzün tamamı boyunca, kenardan kenara uzanır: z0 ve z1 yüzün altı ve üstü olmak üzere segment([x, y, z0], [x, y, z1]), asla z0 + 3 değil. Yuvalar ve havalandırmalar kapalı dış hatlardır (ince yuvarlatılmış bir planın planOutline'ı ya da bir yüz düzleminde aynısı); bu yüzden hiç uçları yoktur. Bir çizgiyi asla köşelerinden birkaç birim içeriye çekmeyin: 4×'te duran bir doku gibi okunur.
Bir salmastradan çıkan çubuk
Görünen uzunluğu hareket ettikçe değişen bir piston çubuğu, bir dalıcı ya da bir sürgü tek bir çubuktur; bir kez tam uzunlukta (görünen artı strok) kurulur ve salmastranın içindeki kısım kırpılır:
const ROD = G.rodOut(F, gland, tip, r, P, { stroke }); // F.a salmastradan dışarı bakar
svg = `<clipPath id="rod"><path data-hold d="${ROD.clip}"/></clipPath><g clip-path="url(#rod)">${k.solidSvg(ROD.paths, { lit: true })}</g>`
R.put({ ..., move: G.mul3(F.a, stroke), svg, shapes: [R.solid(A.slide(F, gland, tip, r, { name: "rod" }))] })
live: el.setAttribute("transform", `translate(${dx} ${dy})`); holdStill(el, [dx, dy]) // dx, dy: öğenin bu karedeki ekran ötelemesi
rodOut, çubuğun gland − stroke'tan tip'e kadar olan yollarını ve onu salmastra yüzünden tip + stroke'a kadar kaplayan bir kırpmayı döndürür. Kırpma yolu data-hold taşır; öğeyi hareket ettiren her şey aynı ekran ötelemesiyle holdStill(el, [dx, dy])'i çağırır, bu da kırpmayı ters yöne taşır; böylece çubuk içinden kayarken salmastra yüzü yerinde kalır. Aynı yardımcı, öğesi ters yönde hareket ettiğinde bir çubuğu bir salmastranın içine geri çeker (bir yük silindiri). Salmastra üzerine soluk bir conta halkası çizin (salmastra yüzünde circleOf, yarıçap r + 0.4). Onu A.slide ile kaydedin; denetim onu ötelemek yerine çubuğu salmastra yüzünden gererek pozlar, böylece açıklık, derinlik ve katı kontrolleri her karede gerçek çubuğu görür. Uzamayı asla üst üste binen kopyalarla taklit etmeyin: her kopyanın aydınlatılmış kenarı bir sonrakinin dolgusunun başladığı yerde durur ve dış hat hareket ederken birkaç birimde bir çentiklenir.
Raylar, son duraklar ve bir kızak
rails: for y of [-20, 15]: k.slabOf({ x: 2, y, w: 122, d: 5, r: 1 }, 0, 3, P, 3, 0.4) // mid
stops: k.slabOf({ x, y: -23, w: 5, d: 46, r: 1.2 }, 0, 7, P, 3, 0.5) + üstte 2 vida noktası
kızak (x = 0'da kurulur, translateAlong ile hareket ettirilir):
k.slabOf({ x: -28, y: -24, w: 56, d: 48, r: 3 }, 3, 5, P, 5, 0.6)
burçlar: dört köşede plakadan daha uzun, vida noktalı küçük levhalar
perçinler: ön kenar boyunca bir sıra 0.4'lük nokta
sap: ön yüzde küçük bir boyun levhası ve tırtıllı bir silindir
Direk, bilezik, kelepçe ve kelebek vida
k.cylinder(px, py, 5, z0, 4, P, 28) // bilezik
k.cylinder(px, py, 3.2, z0 + 4, h, P, 28) // direk, kıvrım yok
k.sideArc(px, py, 3.2, z, P, 16) // direkteki soluk dikiş halkaları
k.slabOf({ x: px - 7, y: py - 7, w: 14, d: 14, r: 2.5 }, zc, 12, P, 4, 0.6) // kelepçe bloğu
kelebek vida: kelepçe yüzünden 2.8 × 3'lük bir boyun levhası + k.cylinder(r 2.6, h 6) + k.knurl(..., 18)
İşaretçili tırtıllı topuz
k.cylinder(cx, cy, 6, z, 4, P, 32) // mid
k.knurl(cx, cy, 6, z, z + 4, 36, P) // çizgi lo
k.lineOnTop([cx - 3, cy], [cx + 4.6, cy], z + 4, P) // işaretçi, çizgi hi
Bir mil etrafında helezon yay (ressamın sırası için bölünmüş)
const c = k.coil(xFrom, xTo, [rodY, rodZ], 4.2, 6, "x", P);
c.back → çizgi lo, milden ÖNCE çizilir
rod → k.slabOf({ x, y: rodY - 2, w, d: 4, r: 1.8 }, rodZ - 2, 4, P, 3)
c.front → çizgi mid, milden SONRA çizilir
Yay sıkıştığında xFrom/xTo'yu değiştirerek her karede yeniden kurun. Ucuzdur.
Komparatör saati (yüzü yukarı)
k.cylinder(x, y, R, z, 10, P, 64, 0.8) // disk, ton hi, kıvrım lo
k.knurl(x, y, R, top - 3.4, top, 84, P, 0.3) // tırtıllı bezel bandı, lo
k.sideArc(x, y, R, top - 3.4, P, 40) // bant dikişi, faint
k.ring(x, y, R - 2.2, top, P, 64) // bezel halkası, lo
const t = k.radialTicks(x, y, R - 3, 50, 5, top, [1.3, 2.8], P) // küçük lo, büyük mid
kurma kolu: +x tarafında iki küçük levha; kulak: kola bağlanan bir levha
ibre: k.lineOnTop(tail, tip, top + 0.2, P), ton lit, kontur genişliği 1.1, her karede yeniden kurulur
göbek: k.ring(x, y, 1.6, top, P, 16)
Kulplu ve etiket tutuculu çekmece
gövde: k.slabOf(casePlan, z, h, P, 4, 0.8)
ön: yakın yüzde ince bir levha; kulp: iki direk ve bir çubuk (küçük levhalar)
tutucu: önde içeri çekilmiş bir dış hat ve içinde bir kart levhası; 0.45'lik noktalar olarak perçinler
açık: çekmeceyi translateAlong ile ekseni boyunca öteleyin; kutusu (taban ve 3 duvar)
önden önce çizilir ve içeriği tabana kazınır
Derece çentikli döner tabla
k.cylinder(cx, cy, R, z, 4, P, 72, 0.8)
k.radialTicks(cx, cy, R - 1, 72, 6, z + 4, [1.2, 2.6], P)
döndürme: her karede yalnızca dönen şeyi (ya da üstündeki nesneyi) yeni açıda yeniden kurun
Delikler, havalandırmalar ve nabız atan bir nokta ızgarası
k.dotGrid(x, y, cols, rows, gap, zTop, P) → dotsSvg(points, { size: .45, tone: "lo" })
// "etkin" bir parçada yavaşça nabız atan bir ızgara için { pulse: true } ekleyin
Lamba, prob ve parmak
Bunlar silindir yığınlarıdır: gövde, kapak halkası, bilezik, gövde mili, ped. Dikiş halkaları sideArc'tan gelir ve kilit vidası yanda küçük bir levha ve bir silindir başlıktır.
4. Tonlar
| Öğe | Ton |
|---|---|
| Taban, ayaklar, zeminler | lo |
| Yapı: direkler, raylar, çerçeve, kızak, gövde | mid |
| Konu: anlatılan şey | hi |
| Okuyucunun şimdi izlemesi gereken parça | lit (yalnızca bir) |
| Oluklar, içeri çekilmiş dış hatlar, zemin ızgarası | faint |
| Küçük çentikler | lo |
| Büyük çentikler | mid |
| Sıfır işareti, işaretçi çizgisi | hi |
| Vidalar ve perçinler | 0.4–0.55'te mid noktalar |
| Kıvrım (üst/yan birleşimi) | faint (varsayılan), hi parçalarda lo |
lit'li bir Solid beyaz bir kenar ve daha açık bir üst alır. Onu hareket eden konu, dalıcı ya da seçilmiş bir çekmece için kullanın.
5. Ressamın sırası
- Önce tabanı, sonra onun üzerinde duran her şeyi çizin.
- Bir düzey içinde
depthOf(centre, P)'ye göre artan sırada sıralayın: uzak olan yakından önce. - Saran parçaları bölün. Bir kızağın etrafındaki bir yay ya da çerçeve için arka yarıyı, sonra içteki parçayı, sonra ön yarıyı çizin. Test düzeneğinde: arka çerçeve çubukları → arka bobin yarılarıyla miller → kızak → cam → ön bobin yarıları → ön çubuklar → saat.
- Hareket eden parçalar sıradaki yuvalarında, onları hareket ettiren bir
<g transform>içinde çizilir. Hareket eden bir parça aynı komşunun hem önünden hem arkasından geçebiliyorsa, komşuyu bölün ya da sıra hiç değişmeyecek şekilde hareketi sınırlayın. - Basamaklı bir yüzeyde duran şeyler. Basamakları uzun olanlar daha arkada olacak şekilde sıralayın. Böylece alçak bir basamakta duran bir prob, önündeki daha uzun bir basamak tarafından gizlenemez.
- Yatay bir parçanın içinden geçen dikey parçalar (bir kelepçenin içinden geçen bir direk) yatay parçanın etrafında, altta ve üstte iki parça halinde çizilir.
- Bir kırpma kesimi bir kenardır. Bir kırpmanın bir parçayı başka birine karşı bitirdiği yerde (döngüsüne giren bir kablo zinciri uzunluğu, bir salmastradaki çubuk) kırpmanın kesitini birleşim düzlemiyle aynı hizada yapın ve kesim boyunca kırpmayla birlikte hareket eden konturlu bir kenar çizin (
data-clip). Plazma kesicide bir uzunluğun kırpma kesiti birleşimin ötesine uzanıyordu. Uzunluğun üst yüzü ve yuva çubukları döngünün boşluğuna 26 birim içeri çizilmiş ve konturu olmayan dikey bir kesimde bitmişti; bu, havada duran bir çizgidir. Ressamın anahtarlarını yeniden sıralamak bunu düzeltmezdi: döngü bağlantısının uç yüzü gerçekten uzunluğun arkasındadır. - Yoğun şekiller anahtarlarını geometriden oturtur. Birkaç düzine örtüşen parçayı geçince elle ayarlanmış sapmalar birbiriyle savaşır. Her öğeye gerçek şeklini verin ve iki öğenin örtüştüğü her yerde hangi yüzeyin daha yakın olduğunu
kit/audit.mjs'in ölçmesine izin verin; ardındanorderKeysher anahtarı her çifti karşılayacak kadar yükseltir (kit.md, bölüm 12). Karşılayamadığı şey kilitlenen bir çifttir; bu bir bölme gerektirir. İlk Raptor'un elle ayarlanmış anahtarları monte halde 190, sökülmüş halde 133 çifti ters çizdi; ölçülmüş anahtarlar ikisini de sıfıra indirdi. - Kesişmeler parça başına sıralanır. Bir boru ya da kablo, her biri kendi derinliğinde kendi öğesi olan
tubePiecesparçaları olarak çizilir; böylece bir hat bir parçanın önünden ve bir sonrakinin arkasından geçebilir. İki hattın ekranda kesiştiği yerde kameraya yakın parça daha sonra çizilir; bir kesişme ancak iki parçadan hiçbiri başka bir yerde diğerinin arkasından da geçmiyorsa sıralanabilir; bu yüzden uzun parçaları bir kesişmede bölün (breaks).
6. Kamera ve kompozisyon
- Varsayılan kamera: azimut 45°, yükseklik 30°. Mekanizmayı taşıyan yüz izleyiciye baksın diye azimutu döndürün (35–60°). Test düzeneği uzun kenarı göstermek için 57° kullanır. Açık bir şeyin içine bakmak için yüksekliği artırın: dalga leğeni su yüzeyi ve leğenin altındaki kâğıt ikisi de okunsun diye 44° kullanır.
fitProjection(boxCorners(...) ∪ en yüksek noktalar, width, height, { pad: 24–34, azimuth })ile sığdırın. Tipik viewBox'lar 600 × 340–380'dir.- Nesne kartın yaklaşık %55–65'ini doldurur. Çevresinde hava bırakın, köşe etiketlerine değmesine izin vermeyin ve bir şekil dizisinde boyutları tutarlı tutun.
- Telefonlarda (390 px) hâlâ okunduğunu kontrol edin. Parçalar çok küçülürse, test düzeneği örneğindeki
stretch.css'in yaptığı gibi SVG'yioverflow: hiddenve negatif kenar boşluklu bir kart içinde yaklaşık %110–118'e büyütün.
7. Temalar
ISO_CSS, varsayılan koyu ve açık için .iso[data-theme="light"] olmak üzere .iso üzerinde belirteçler tanımlar. Her dolgu ve kontur bir belirteç okur; bu yüzden bir tema yalnızca bir belirteç kümesidir. Birini ayarlamak için:
- Kâğıt (
--anatomy-paper) kart rengine eşittir; böylece dolgular arkadakini yama gibi görünmeden gizler. - Gölgeler. En koyudan (0, ışıktan uzağa bakan) en açığa (3) dört adım. Onları yakın tutun: parlaklıkta yaklaşık %3 aralıkla.
- Çizgiler. Koyu modda
hibeyaza yakın vefaintkâğıdın ancak biraz üstündedir. Açık mod bunu tersine çevirir. - Hale. Tabanın altında bulanık koyu bir dolgu: koyu modda güçlü, açıkta yaklaşık %30.
Açık tema yayınlanır. İzometrik sitedeki her şekil açıktır ve buna shader'ları da dahildir. Önce açık temayı tasarlayın ve koyu temayı ucuz olduğu yerde çalışır tutun. Yedi shader dönüşümünün çizim hakkında öğrettikleri:
- Her renk bir belirteçtir. Bir şeklin CSS'ine ya da shader'ına yazılmış bir renk, gerçekleşmeyi bekleyen bir tema hatasıdır. Ona bir açık değer ve bir koyu geçersiz kılma verin (
.x { --x: … }, sonra.iso[data-theme="dark"] .x { --x: … }). Shader'ın aynı renge ihtiyacı olduğu yerde onu belirteçten okuyun (webgl.md, bölüm 8.3). - Boşluklar kendi belirteç kümelerini alır. Bir fırın ağzının, bir potanın, bir kesitten görülen bir kabın, bir su sütununun ya da bir kanal penceresinin içi bir nedenle daha koyudur: kurum, refrakter, derinlik, gölge. Grubuna
--anatomy-paper,--anatomy-face,--anatomy-top, dört gölge ve çizgi tonlarını daha koyu, daha sıcak ya da daha mavi grilere yeniden tanımlayan bir sınıf verin. Biçimi korunsun diye tüm tonları tutun, onu canlı kodun yazdığı bir değişkenle ışığın renk tonuna doğru karıştırın ve koyu temada belirteçleriinherityapın. Parlamaların böylece siyah bir kutu olmadan bir zemini olur. - İç içe temalara dikkat edin. Koyu bir kart açık bir sayfada durabilir.
.iso:not([data-theme="dark"]) .xolarak yazılmış bir kural çevresindeki sayfa üzerinden de eşleşir. Koyu kuralı açık olandan sonra sıralayın ya da kartın kendi temasına bağlayın. - Opaklık soluk bir rengi griye söndürür. Açık temada opaklıkla sönen her şey (bir yedek parlama, aydınlatılmış bir vurgu) doygun bir belirteç alır ve renk tonları, altındaki çizgiler görünür kalsın diye multiply ile karıştırılır.
8. Yuvarlak parçalar ve borular
Motorlar, pompalar, valfler, lambalar ve aletler çoğunlukla tornalanmış parçalar ve borulardır. kit/lathe.mjs ve kit/tube.mjs bunları herhangi bir eksen boyunca kurar (references/kit.md, bölüm 10 ve 11). examples/raptor-engine/build.mjs'te aşağıdaki her tarif çalışır halde bulunur.
Tornalanmış parçalar: meridyenlerle düşünün
Bir parçayı yarım kesiti olarak yazın: bir uçtan diğerine [s, r] listesi; ve onu G.solidOf(profile, F, P) ile döndürün.
- Basamaklar ve omuzlar yarıçapın tek bir
s'de sıçradığı yerlerdir:[6, 12], [6, 9]. İşleme izi gibi okunan kıvrım çizgilerini yaparlar. - Eğriler pürüzsüz işaretlenmiş birçok noktadır (
[s, r, 1]); böylece üzerlerinden kıvrım çizilmez: bir çan, bir kubbe, bir flanşa geçen bir fileto. Kit pürüzsüz köşesi olan her profili kendiliğinden pürüzsüz gölgelendirir (smooth: "auto"); böylece gölgelendirme faset faset basamaklanmak yerine eğriyi izler; yalnızca vazgeçmek içinsmooth: falseverin. - Bel veren bir gövde asla zarflanmaz. Ortada daralan bir profilin (bir boğaz, bir makara) içbükey bir dış hattı vardır.
lathe, gerçek siluetinin halkalarının zarfının yarım pikselden fazla içinde kaldığını fark eder ve onu bunun yerine siluet ve görünen uç yaylarıyla doldurur ve dış hatlar (fill: "auto"ya da zorlamak için"surface"). Zarf olarak çizilen Raptor boğazı, soluk gölgesiz bir şeritli ve dış hatta 8 px kala duran bir dikişli düz bir koniydi. - Eğri bir yüzeydeki dikişler ve kaynak çizgileri, o halkadaki profil eğimiyle
G.arcOf(F, s, r, P, { slope })'tur;faintçizilir ve katınıninner'ı olarak verilir (solidSvg(paths, { inner: lineSvg(arcOf(…), { tone: "faint" }) }); Raptor'unSveLn'i bunlar üzerine tek satırlık sarmalayıcılardır); böylece dış hattın altına otururlar. Tam olarak kenarda (limb) biterler, ona biraz kala. Katıdan sonra eklendiğinde her dikişin yuvarlak ucu kenar konturuna düştü ve Raptor'un eyleyici gövdelerinin koyu tema dış hattı 4×'te kesikli göründü. - Uzun bir gövde (bir lüle, bir namlu)
G.bandsOf(profile, cuts, F, P, { radius, slope })ile bantlara kesilir; böylece her bant onu saran borulara karşı derinlik sıralanır. Bantlar tek birsteps, tek bir normal alanı ve tek bir yüzey paylaşır, kendi dış hatları temizlenmiş gelir vesidesOftüm gövde için tek, sürekli bir dış hat çizer (kit.md, bölüm 10); böylece ton eğrileri her birleşimden basamaksız geçer ve yanlar kırılmaz. Analitik birradiusveslopeolmadan tüm profilden tek bir eğri geçirir, asla bant başına bir tane değil. - Bir bandın etrafındaki halka (bir yanma odasındaki takviye halkası, bir bilezik) bandı böler: bant, halka, bant. Üstünde halka olan uzun tek bir bant olarak çizildiğinde halkanın arka yarısı bandın üzerine boyanır (ya da bant halkanın önünü gizler); bölündüğünde her parça kendini sıralar. Raptor yanma odası ceketi iki halkası arasında üç banttır.
- Açık bir uç, içerideki karanlık için dolu bir boşluk (
circleOf) vearcOf(..., { inward: true, least: -1 })'dan iç yayla birringBanddudağıdır. Cıvata noktaları dudağın çevresine gider.
Yuvarlak bir gövdedeki parçalar
- Flanş: arka yüzü yol ucuna oturur; böylece yol tam olarak bağlantının yüzeyinde biter ve disk oradan boru boyunca geriye uzanır (
centre = end − tangent · t/2).disc(-t/2, t/2, r, frameAlong(centre, axis), P); izleyiciye bakan yüzde bir cıvata çemberidotsOf(F, faceS, 0.74r, 8, P, { all: true }). Yüz kenardan görünüyorsa (|dot(a, V)| < 0.12) cıvataları atlayın. - Eğri bir duvardaki göbek ya da port: dış normal boyunca kısa bir
disc; size baktığındafaintbir yüz halkası (circleOf) ile. Bir ölçüm hattı, ateşleyici ya da tıpa buraya iner. Onu üzerine inen flanş kadar geniş yapın; göbeğinden taşan bir flanş kenarında havada kalır. - Eyer pedi. Eğri bir gövde üzerindeki düz bir flanş kenarında bir boşluk bırakır (sehim,
R − √(R² − a²)): 18.4'lük bir pompa gövdesindeki 11.6'lık bir flanş yanlarda 4 birim açıkta duruyordu. Bu boşluğun yaklaşık 0.15'ten fazla olacağı her yerde flanşı bir pede oturtun: tabanı ev sahibi yüzeyini izleyen kısa bir silindir (G.saddleOf(F, a, start, h, P);start(angle)ev sahibinin şeklinden bulunur; Raptor'unpadOn/boss(..., { host })'u). Onu ev sahibi tarafındancutedilmiş veseatedişaretli bir disk olarak kaydedin; böylece denetim gerçek şeklini görür. Pedi ev sahibinin tek bir bandının içinde tutun (bir basamağın altındaki çıkıntı, onu gizleyen bandın önünde çizilir; kenarı alttaki basamağa değene kadar indirilen bir Raptor pedi her karede bir kilitlenmeye dönüştü) ve ev sahibinin siluetinden uzak tutun: siluetin üzerine binen bir ped yarı ev sahibinin önünde yarı arkasındadır ve hiçbir ressam sırası onu çizemez. Raptor'un LOX kanalı bu nedenle 130°'den 150°'ye taşındı. Bir eyer ev sahibinin grubuna aittir. Tabanı ev sahibinin eğrisine göre kesilmiştir; bu yüzden boruyla birlikte uçarsa kesik taban sökülmüşken görünür: metan pompasının türbinine ve halkasına göre kesilen Raptor'un sıcak gaz pedi sivri kuyruklu pürüzlü bir kırığa dönüştü. Pedi ev sahibinin parçasına verin (boss("ftp", …, { host: FTP_TURBINE })) ve hareket eden borunun flanşının düz üstünden ayrılmasına izin verin; denetiminseats'i, ev sahibi başka bir grupla hareket eden her oturtulmuş şekli listeler. - Ateşleyici tıpa, tek uç. Bir tıpa ya ateşleyici hattını (dış yüzünden ekseni boyunca ayrılan) ya da uyarıcı kablosunu taşır, asla ikisini birden değil. Kablo yanındaki kendi küçük göbeğine iner.
- Bir borudaki valf:
frameAlong(point, tangent)üzerindesmooth: trueile döndürülmüş şişkin birlatheprofili; iki uç yüzünde cıvata noktaları, yuvarlak bir boyun ve kapak dış hatlı ve iki vidalı bir eyleyici kutusuyla. Düz bir bacakta durur (gövde uzunluğu artı iki fileto kesimi), boru gövdesinin altında boşluklu bırakılır ve eyleyici boruya dik durur: yatay bir boruda yukarı, dikey bir boruda yana doğru (yuvarlak bir kutu), asla boru boyunca değil. - Salyangoz: büyüyen bir yarıçapla
tubePieces'e verilenspiral(F, s, r0, r1, a0, a1). Merkez çizgisini gövde yarıçapı artı boru yarıçapı artı 0.3'te tutun; böylece gövdeyi teğet olarak sarar; gövdeye gömülü bir salyangoz bir katının içinden geçen bir borudur. - Rotiller ve T'ler kürelerdir (
sphereOf): bir eyleyicideki çubuk ucu yatağı, bir kolun bir manifoldla buluştuğu dökme bir T. - Eğik bir eksende tırtıllar, nervürler ve kanatçıklar:
ribsOf. Bir yüzdeki kanatlar:sweep'lispokesOf.
Borular
- Bir yolu gerçek portlar arasında birkaç düz bacak olarak yerleştirin, sonra onu boru yarıçapının yaklaşık 2.6 katı bir bükümle
filletyapın. Borular bükülür; kırılmazlar. - Her boruyu flanşlı bir portta ya da uç noktalı bir blokta bitirin. Havada duran bir boru, havada duran bir çizgidir.
- Gerçek bir hattın sahip olduğu parçaları ekleyin: kelepçelendiği ya da kaynaklandığı yerde bantlar (
bands: [0.5]), esnemesi gereken yerde bir körük (incedisc'lerden bir dizi,bellows: [from, to, count]) ve akışın kontrol edildiği yerde bir valf. Bunlar Raptorpipe()yardımcısının seçenekleridir (kit.md, bölüm 11). - Hepsi birbirinden ayırt edilecek kadar büyük, az sayıda boyut kullanın: ana kanallar (r 5–8), besleme hatları (r 2–4), ölçüm hatları (r 0.9–1.5), kablolar (r 0.5–0.65).
Ara noktaları seçmek
Önce büyük hatları (kanallar, iniş boruları, manifoldlar), sonra besleme hatlarını, sonra ölçüm hatlarını, sonra kabloları yönlendirin; böylece her küçük hat zaten orada olanın çevresinden yönlenir. Her yol için:
- Portun normalinde başlayın. İlk bacak porttan yüzey normali boyunca dümdüz çıkar, flanş için yeterince uzun; sonra büküm:
filletdaha kısa bacağın en fazla 0.48'ini alır; bu yüzden büküm yarıçapının yaklaşık iki katından kısa bir bacak sıkı bir büküm verir ve izleyiciye bakan bir portta hemen yapılan bir dönüş sıkışır ("Açıklık ve kesişmeler", adım 5). - Yapıyı izleyin. Bacaklar izledikleri gövdeye paralel uzanır (bir yanma odası boyunca, bir iniş borusu yukarı) ya da sabit bir yarıçaptaki bir halkada onun çevresinden dolanır (
arcPoints); gövdenin kendi açıklığı kadar, yani deri yarıçapı artı hattın yarıçapının yaklaşık 1.5 katı kadar derisinden uzakta. Sahibinin yakın çekimi, bloklarına ulaşmak için yanma odasının yüzü boyunca ve ana kanalın üzerinden yelpaze gibi yayılan ölçüm hatlarını gösterdi; yeni derlemede lüle manifoldundan gelen uzun hat sol yandan yukarı çıkar, yakıt valfi kablosu iniş borusunun yanından yukarı çıkar ve kablo demeti kontrolcüden paralel inişlerle kelepçeli şeritlere iner. - Konunun kendi tarafınızda kalın. Uzak taraftaki bir porta hizmet eden bir hat arkadan ya da bir halkada yandan dolanır, asla anlatılan şeyin önünden çapraz geçmez.
- Ekran boyunca uzanan bacakları tercih edin. Doğrudan izleyiciye doğru ya da ondan uzağa uzanan bir bacak kısa izdüşer ve uçlarındaki her dönüşü bir sivri uca ya da bir V'ye çevirir ("Açıklık ve kesişmeler", adım 4 ve 5).
- Bağlantı parçalarına yer bırakın. Bir valf, körük ya da kelepçe en az gövdesi artı iki büküm payı (her biri
r_bend · tan(turn / 2)) kadar düz bir bacak gerektirir. Bir bükümde düz gövde boruya keser; Raptor'un iniş borusu valfi düz bir uzunlukta dursun diye yeniden yönlendirildi ve oksijen kanalı valfi için dikey bir düzlük kazandı. - Bir çubuğa inmeyin. Bir borunun son bacağı ekranda bir çubuk, gergi çubuğu, direk ya da ray boyunca uzanmamalı ve uç bağlantı parçası birinin dış hattında oturmamalıdır: kör testli tezgâhın hortumu son bacağını bir gergi çubuğuna paralel, onun 2 px üstünde uzattı; bu yüzden çubuk hortum bağlantısına takılmış gibi okundu. Porta çubukların karşısından yaklaşın ya da dirseği bacak ekran boyunca uzanacak şekilde döndürün. Denetimin
crowding'i her ince katıyı (uzunluğu yarıçapının ya da yarı genişliğinin 4 katından fazla) bir çizgi olarak ele alır; bu yüzden bunları başarısız sayar. Her pozu da kontrol edin: strokun sonunda hareketli bir plakanın kenarında oturan bir rakor ona değiyormuş gibi okunur. - Kasıtlı kesişin. İki hattın ekranda kesişmesi gerekiyorsa bir kez, düzlüklerde, net bir açıyla ve açıklık kontrolünün bolca payla geçeceği kadar derinlikte birbirinden uzak kesişirler. Bir bükümün ya da bir ucun yakınındaki bir kesişme bir birleşim gibi okunur ("Açıklık ve kesişmeler", adım 6).
- Örtüşmeyin, bölün. Bir şeyin bir boruyu sardığı yerde (flanş, bant, körük diski, kelepçe, valf gövdesi) boru orada boşluklu bırakılır ve her yüzde bir parça biter (
tubePiecesgaps, kelepçeler içincrossingsOf). İçinden tek parça geçerse boru bileziğin hem arkasında hem önündedir ve hiçbir anahtar onu sıralayamaz. Raptor yanma odası ceketi aynı nedenle iki halkasında bölündü.
Temaslar ve birleşimler
İki parçanın buluştuğu her yer ya düz bir yüz üzerinde düz bir yüz, ya teğet bir temas ya da yuvarlak bir gövdeye inen bir kenardır. Hiçbir şey hiçbir şeye gömülü değildir: gömülü bir parça ev sahibinin hem önünde hem arkasındadır ve hiçbir ressam sırası onu çizemez.
- Aynı hizada. Bir çubuk çatalının yüzünde biter; bir göbek üzerinde durduğu yüzeyde başlar; bir kulak gövdeden bilyeye kısa bir pimdir.
- Yuvarlak bir gövde üzerinde kenar.
Ryarıçaplı bir küre ya da boruyla buluşanayarıçaplı bir silindir, kenarının yüzeyde durduğu yerde, merkezdensqrt(R² − a²)uzakta biter. Uç yüzü böylece ev sahibinin içinde gizlenir ve hiçbir şey içinden görünmez. Raptor'un eyleyici çubukları rotilleriyle ve manifold borusu ve iniş borusu T'leriyle böyle buluşur. - T'ler. Bir boruya giren bir kol, ikisinden de biraz büyük bir küre bağlantı parçasıdır: ana hat kenarının küreyle buluştuğu yerde boşluklu bırakılır ve kol kürede biter. Küreyi hiçbir borunun kenarı diğerine batmayacak şekilde boyutlandırın:
ayarıçaplı bir ana hatta girenbyarıçaplı bir kol içinR ≥ sqrt(a² + b²). - Ayaklıklar. Değmek için eğri bir gövdeye gömülmesi gerekecek bir halka (bir çanın çevresindeki bir manifold), küçük radyal pedler üzerinde en az boru yarıçapının yarısı kadar açıkta durur.
- Düzlüklerde valfler ve körükler. Eğri bir borudaki düz bir torna parçası iki ucunda da ona keser. Onları yolun tüm uzunlukları boyunca düz olduğu yere koyun.
- İki flanş, tek birleşim. Bir kanalın bir pompa çıkış flanşına cıvatalandığı yerde kanalın kendi flanşı çıkış flanşıyla yüz yüze buluşur; aynı yerdeki iki flanş kilitlenir. Her parça böylece şekil söküldüğünde bir flanşını korur.
- Kolların bağlantı parçaları vardır. Bir kol ana hattından bir T'den (ana hattın altında boşluklu bırakıldığı bir bilye, kol kenarının bilyeyle buluştuğu yerde başlar) ya da ana hat üzerindeki bir eyer pedinden ayrılır, asla ana hattın derisindeki çıplak bir noktadan değil.
- Dikmeler rotillerde biter. Eğik bir eksen boyunca yatırılmış bir dikmenin göz diski karşılaştığı her şeye gömülür. Her uca ev sahibinin normali boyunca kısa bir gövde, gövde üzerinde bir bilye ve bilyeler arasında çubuk verin (dört birleşimin hepsinde küre üzerinde kenar).
- Hareket eden birleşimler için düzlüklü bilyeler. 3B bir şekilde bir küreye inen kenar her açıda sıralanamaz. Bilyeye bir düzlük verin (
T.ball({ flats: [{ n, d }] }),A.ball(c, r, { flats })olarak kaydedilir) ve kenarı düzlüğe indirin ya da eş eksenli mafsal diskleri kullanın.references/3d.md, bölüm 5. - Her şey tutulur. Her katı temaslar yoluyla sehpaya bağlıdır: braketler kutuları taşır, saplamalar kablo demeti kelepçelerini taşır, bir dişli kutusu plakası bir motoru eyleyicisine birleştirir. Yalnızca tuttuğu kabloya değen bir kelepçe havada kalır.
Açıklık ve kesişmeler
Bir boru merkez çizgisi ile kendi bağlantısı dışındaki her şey arasında yaklaşık 1.5 yarıçap tutar; böylece 0.6'lık bir kablo bir kanalın derisinden 0.3 açıkta geçer ve bir kanal komşularından yarıçapının yarısı kadar uzak durur. İki hattın ekranda kesişmesi gerektiği yerde derinlikte kesişirler, biri diğerinin epey önünde, ve parça anahtarları onları sıralar; bir boru bir bilezik, kelepçe ya da valfin içinden geçtiği yerde orada boşluklu bırakılır (kit.md, bölüm 11). Gözle değil, kanıtlayarak:
- İnşa ederken her öğe ve her boru için bir şekli tek bir
A.recorder(P, { order, spring })'a kaydedin (kit.md, bölüm 12):shapes'leriyle çizilen öğeler içinR.put, her şekil içinR.solid, her boru ve kablo içinR.route. Hiçbir şey kaçmasın diye yardımcıların bunu yapmasını sağlayın. Kitin çizdiği her şey için kaydedilmiş bir şekil vardır: zemin prizmaları içinA.slab,A.extrudedveA.cylinder, tornalanmış parçalar içinA.solid,A.latheveA.disc(çizimin kullandığı aynı eğri boyunca izlenir),prismOfiçinA.prism,A.ballve borular. - Her derlemede ressamın anahtarlarını
A.settle(R, P)ile oturtun: şeklin dinlendiği her durumda (monte ve sökülmüş) ve gerçek patlatmasının her karesinde (explodeStatescanlı yayları ve kademeyi yeniden oynatır) örtüşmeleri ölçer veorderKeys'i çalıştırır. - Derlemeyi
A.auditOrExit(R, P)ile bitirin ve her başarısız satır sıfır yazana kadarnode build.mjs --auditçalıştırın. Kilitlenmiş bir çift bir geometri hatasıdır (bir bölme, bir boşluk ya da teğet bir temas onu düzeltir); onu bir sapmayla gizlemeyin. - Hatlar ekranda geri dönmez. İzleyiciden uzağa uzanan yatay bir bacak yukarı gidiyormuş gibi okunur; bu yüzden uzağa uzanıp sonra inen bir boru bir sivri uç, havada biten bir boru gibi okunur. Bacağı önce ekranda yana doğru yönlendirin (denetimin
folds'u her durumu bulur: gerçek dönüş 110°'nin altındayken 4 yarıçap içinde 140°'yi aşan bir ekran dönüşü). - Hiçbir dış hat kendi üzerine katlanmaz ve hiçbir büküm ekranda bir noktaya sıkışmaz. İzleyiciye bakan ve sonra dönen bir bacak (bir ceket göbeğinden radyal olarak çıkıp bir bloğa tırmanan bir ölçüm hattı, bir transdüser ucundan çıkıp geri kıvrılan bir domuz kuyruğu) filetosunu kenardan izdüşürür ve iki bacak görünür bir yarıçap olmadan bir V'de buluşur.
folds, 90°'yi aşan her görünür bükümün ekran yarıçapını ölçer ve borunun ekran yarıçapının iki katının altında kalınca başarısız sayar. Tercih sırasıyla çözümler: dönüşün bir bağlantı parçasının içinde olmasına izin verin (göbek üzerinde bir bilyeli T, hat ondan bir sonraki noktasına doğru ayrılır: sense0, sense2, sense5 ve yakıtça zengin ateşleyici hattının kullandığı Raptor'unelbow'u); izleyiciye bakan bir düzlemde bükün (Raptor'un domuz kuyrukları transdüserin kameraya bakan kendi radyal düzleminde döner; yerel yardımcısısideOn(d) = unit3(cross3(unit3(V − d·(V·d)), d)),V = G.viewOf(P)ile,dboyunca bir bacaktan ekran boyunca yönü verir; böylecedvesideOn(d)düzlemindeki bir büküm izleyiciye bakar); portu normali ekran boyunca uzanacak yere taşıyın. Normali görüşlef = |n·V|yapan bir düzlemdeki büküm yaklaşıkR·f²ekran yarıçapına izdüşer; bu, borunun ekran yarı genişliğinin altına inince tek bir parçanın iç kenarı geriye doğru akar ve dış hat küçük bir düğümle kendini keser (denetiminselfOverlaps'i).fillet(…, { P, tube })her köşenin yarıçapını bunu aşacak kadar, ama yalnızca bacakların izin verdiği ölçüde yükseltir; bu yüzden bir portun yanındaki dönüşe en azR + 3rdüz bacak verin. İzleyiciye tam olarak bakan bir port (Raptor'un metan pompasındaki hız sensörü) her yaklaşımı bir saç tokası kıvrımına çevirir: onu taşıyın. - Kesişmeler düzlüklerde, net biçimde olur. Bir hattın bükümünün ya da ucunun ekranda başka birinin dış hattına düştüğü yerde (değerek ya da herhangi bir miktar örtüşerek), gerçek derinlik ne olursa olsun göz bir birleşim ya da diğerinin içinden geçen bir hat okur: bir ölçüm hattı dirseğinin arkasından görünen bir domuz kuyruğu kancası, sökülmüş pozda başka bir hattın bandına inen bir flanş, ekranda kısa bir kanal boyunca ve uç flanşının üzerinden uzanan bir kablo. Bir bağlantı parçası da sayılır: dış hattı başka bir hatta inen bir kablo demeti kelepçesi, o hat kelepçeden çıkıyormuş gibi okunur; Raptor'un kelepçesi sökülmüşken oksijenden ön yakıcıya giden hatta böyle yaptı. Denetimin
crowding'i monte ve sökülmüş her görünür durumu listeler; buluşma iki düzlüğün net bir kesişmesi ya da en az bir piksellik (bir kelepçe için iki) görünür bir boşluk olsun diye bir hattı yeniden yönlendirin. Bir çifti ancak 8×'te baktıktan sonra mazur görün (CROWD_OK).
İlk Raptor'un 54 açıklık sorunu (39 içinden geçme) ve 323 derinlik sırası sorunu vardı; bu bölümdeki yollar ikisini de sıfıra indirdi.
Eğri yüzeylerde gölgelendirme ve dokular
- Pürüzsüz gölgelendirme (pürüzsüz düğümü olan her profilde otomatik; analitik bir eğri için
smooth: { slope }ya da{ slope, radius }; bantlara bölünmüş bir gövde içinbandsOf; toplar içinsphereOf) her eğri yüzeyde: çanlar, boğazlar, kubbeler, koniler, valf şişkinlikleri, toplar. Satır başına düz bir faset tonu yalnızca bir silindirde doğrudur. Her ton, bölge sayısı korunduğu sürece tüm gövde üzerinde tek bir çokgendir; bu yüzden hiçbir satır dikişi görünmez. - Bir doku eksen boyunca da bir kenarda biter ya da söner. Her nervürün
s0ves1'i tam olarak aynıs'deki çizilmiş bir basamağa, kıvrıma ya da dikiş yayına iner:seams: trueverin veribsOfnervürlerle birlikte iki dikiş yayını döndürsün; böylece birbirlerinden kayamazlar (kör testli motor nervürlerini 24 ve 90'daki dikişlerle 26'dan 88'e uzattı ve her nervür iki ucunda da 2 birim kala durdu). Bir nervür sırasının dikişi olmadığı yerde bandı bitiren yüze uzanmasına izin verin (s0,s1bandın uçlarına eşit) ya da söndürün. - Bir borudaki doku kesitini izler. Örgü, oluk, bant sargısı ve zırh
tubePieces(route, r, P, { rings: { pitch, twist, cross, fade } })'ten gelir: tüm yol boyunca 3B yay uzunluğuyla yerleştirilen halkalar (ya datwistile sarmallar vecross: trueile iki yönlü bir örgü); her biri kesitinin görünen ön yayı olarak çizilir, iki kenara doğru söner ve rakor ve boşluk yüzlerinde biter. Asla bir parçanın merkez çizgisi boyunca birstroke-dasharraydeğil: hortum boyunca düz sert kenarlarla biter, yuvarlak kesiti sarmaz, bükümlerin iç tarafında yığılır ve her parça birleşiminde yeniden başlar. - Dokular bir kenarda biter ya da söner. Size bakan tarafla sınırlanan nervürler ve cıvata çemberleri kesimin düştüğü her yerde, yüzeyin ortasında durur: sahibinin yakın çekiminde Raptor'un yanma odası halkalarındaki cıvata çemberleri böyle yaptı. Dönüşe doğru sönsünler diye
fadedSvgileribsOf(..., { fade })vedotsOf(..., { fade })kullanın (Raptor cıvata noktaları içinfade: [0.04, 0.42]ve nervürler için[0.1, 0.55]kullanır). Dikiş yayları ve bant çizgileri zaten siluette biter. Bir yüzün ortasında durması gereken tek bir doku çizgisi (biten bir oluk, bir köşeye varmayan bir kaynak dikişi), çizgi boyunca bir gradyanla birkaç px'te sönmesini sağlayanfadeLineSvg(points, { fade: [start, end] })ile çizilir; asla çıplak bir kesimde bitmesine izin vermeyin. Kesimi özelliğin oturduğu halkadan değil, özelliğin baktığı yönden seçin: bir su püskürtme halkasının üstündeki püskürtme delikleri yukarı bakar ve her yönden görülür; bu yüzdenall: truealırlar. Halkanın dış normaliyle ayıklandığında (least: -0.2) Raptor'un sırası halkanın yanlarının hemen ötesinde tam güçte durdu, halka ise arkadan çıplak dolanmaya devam etti. Yukarı bakan bir özellikteki bir sırayı asla radyal birleastile kesmeyin; bir kısmı gerçekten gizliyse dönüşe doğrufadeuygulayın. - Pürüzsüz tonlar incelir. Bir ton bandının eğri bir profil boyunca belirdiği ya da kaybolduğu yerde, sıfır genişlikte doğar ve büyür (
smooth, her sınır 0.35 px içinde kalana ve bant sayısındaki her değişiklik bir şeritte olana kadar satırları ekran hatasına göre inceltir). Yüzey boyunca düz bir kesimde biten bir bant ya da çıplak dolgudan soluk bir kama, gözden geçirenin ilk bulduğu hatadır. - Şekil ve gölgelendirme tek bir eğriyi tanımlar. Bir profilin pürüzsüz kısımları monoton kübik Hermite eğrisiyle (Fritsch–Carlson) enterpole edilir ve kit aynı eğriyi normaller, ton levhaları, siluet ve zarf için kullanır. Doğal bir spline bir tepenin yakınında aşar: Raptor'un valflerinde bir kez yükselip alçalan bir gövdeye üç eğim işareti değişikliği koydu ve dış hat her profil noktasında bir çıkıntılı çoklu çizgi olarak kalırken ton bantları şişkinlik boyunca ahşap damarı gibi zikzak çizdi. Monoton bir eğri yalnızca profilin döndüğü yerde dönebilir.
- Monoton Hermite yalnızca C1'dir.
dr/ds'si parçalı bir ikinci derece fonksiyondur: elle yazılmış düğümlerle her düğümde düzleşir ve aralarında aşar; eğimi izleyen ton bantları duraksar ve sonra sarsılır: oyuklu bir merdiven. Raptor boğazının tek yöne bükülen bir profilde beş yerde eğim ekstremumu vardı; platform konisi daha hafif dalgalandı. Bir bağlantı parçasından büyük her eğri gövdenin analitik bir profiler(s)ve türevininsmooth: { slope }olarak verilmesine ihtiyacı vardır, 20–30 düğümde örneklenmiş: boğaz√(24.2² + (c·(s − 146))²)'dir, koni ucunda dikey bir teğetler = 0'a kapanan48·(1 − x)^0.8'dir; böylece dış hat düz bir uç diskinin üstünde sivrilmek yerine ucun üzerinden yuvarlanır. Denetiminwobble'ı,slopeolmadan pürüzsüzleştirilen vedr/ds'si uçları arasında dönen her profili başarısız sayar. - Dış hatlar faset çokgenleri değil, elipslerdir. Faset sayıları yalnızca ton dolguları içindir (ekranda faset başına yaklaşık 3 px,
stepsFor(r, 32, 160, scale)); her siluet, kenar ve kıvrım analitik daireden yaklaşık 1.5 px'te örneklenir ve kıvrımlar ve pahlar tam olarak yüzlerin döndüğü yerde biter. 96 örnekli bir torusun yanındaki 20 kenarlı bir flanş dış hattı 4×'te bir çentik gibi okunur. - Boru şeritleri. Parlaklık ve gölge bantları parça birleşimlerinden sürekli olarak ve en uca kadar uzanır: her kapaklı uçta uç elipsinin dış yarısını izlerler ve size dönük bir uç yüzünde çizilen iç kenarında dururlar. Bir birleşimde şeritler gövdeden 0.5 daha taşar (gövdeler 0.5, şeritler 1 örtüşür) ve her kare tüm yoldan hesaplanır; böylece sonraki parçanın şeridi kendi gövdesinin kenar yumuşatmalı kesimini örter ve özdeş bir şeritte biter. Gövde ve şerit tek bir çizgide kesildiğinde, salyangozun gölge bandını her birleşimde açık temada açık, koyu temada koyu kılcal bir çizgi kesti. Bunları her büküm, T, körük ve flanşta ve kuvvetle eğri, sivrilen bir boruda 4×'te kontrol edin. Bir parçaya kendiniz çizdiğiniz her şey (bir doku, akış işaretleri) aynı kuralı izler: onu tüm yoldan hesaplayın, yolun başından 3B yay uzunluğuyla fazlayın ve parçanın şerit taşmasının üzerine (her birleşimin 1 birim ötesine) uzatın; yoksa birleşim yarım bir kesik, çift bir işaret ya da bir çentik olarak görünür.
ringsseçeneği bunu sizin için yapar.
Kablo demeti yönlendirme
Kablolar bir şekli mahvetmenin en kolay yoludur: konunun yüzü boyunca çizilen bir kablo bir karalama gibi okunur. Onları gerçek bir kablo demeti gibi yönlendirin:
- Şeritler. Kabloları gövdenin çevresindeki bir halkada paralel şeritlerde uzatın (sabit bir
s'dearcPoints; r 0.62'lik kablolar için her şerit 1.4 birim dışa ve 0.2 boyuna kaydırılır). Şeritten yalnızca tıpalarına dallanmak için ayrılırlar. - Sırayla girin. Kablolar konektörlerden paralel inişlerle iner ve inişlerinin şeritleriyle buluştuğu yerde (
acos(x / laneR)'de) halkaya katılır; böylece en içteki şeridi öne en yakın konektör besler ve hiçbir iniş bir başkasını kesmez. - Sırayla çıkın. En dıştaki şerit halkadan önce ayrılır; dış şeritler hâlâ yanında uzanırken dışa dönen bir iç kablo onları kesmek zorunda kalır.
- Yapıyı izleyin. Tırmanması gereken bir kablo motorun önündeki açık alanı geçmek yerine bir borunun yanından yukarı çıkar (Raptor'un valf kablosu iniş borusundan yukarı çıkar).
- Kısa dallar. Şeritten doğrudan porta gidin. Konunun yüzü boyunca çapraz uzanmayın.
- Kelepçeler (
disc(-0.9, 0.9, r, frameAlong(point, tangent)), tonmid) şeritleri gövdeye düzenli açılarla tutar. Her kabloyu bir kelepçeden geçtiği yerde boşluklu bırakın (crossingsOf); yoksa kelepçe ve kablo kilitlenir. - Uçlar iner. Her kablo kontrolcüdeki ya da bir bağlantı kutusundaki bir konektörde başlar ve bir tıpada, sensör ucunda, valf kapağında ya da bölme konektöründe biter, asla bir kelepçede ya da demetin yanında havada değil. Kendi grubunda kalan bir uç bir uç noktası alır; başka bir gruptaki bir uç, kabloyla birlikte hareket eden bir konektör kabuğu alır (
cable(..., { shells: [false, true] })). - Çizdiğinizi sayın. Her yolu bir listeye (
CABLES) itin ve okuma değerini onun uzunluğundan kurun. İlk Raptor okuma değeri 11 kablo çizilmişken 8 kablo iddia ediyordu.
9. Patlatılmış görünümler
Patlatılmış bir görünüm, parçaların kendisi açıklama olduğunda (neyin neyi, hangi sırayla beslediği) yerini hak eder:
- Tek tek katıları değil, gerçek şeyin ayrıldığı montaj gruplarını seçin (Raptor'un 11'i vardır).
- Her grubu gerçek sökme yönü boyunca, silueti komşularından ayrılacak kadar uzağa taşıyın: üst üste kademeler için eksen boyunca aşağı, yan birimler için radyal olarak dışa.
- Her parçanın bir yuvası vardır. İki grubu birleştiren parçalar (eyleyiciler, kablolar) bağlı kaldıkları grupla gider ve sökülmüşken yine kendilerine ait bir şeyde biter: bir flanş, hızlı ayrılan bir bağlantıda bir rakor somunu, bir kablodaki konektör kabuğu. Dikme uçları ev sahiplerindeki bilyeli saplamalardır, çubuk kendi grubuyla ayrılır ve eyer pedleri ev sahiplerinde kalır. Sökülmüşken bağlantısından çıkan her ucu işaretleyin (
free: [true, false]); denetiminlooseEnds'i, sökülmüş durumda başka bir sahibe ait hiçbir şeye değmeyen diğer her ucu başarısız sayar ve serbest olanları listeler; böylece her biri bir tercih olur. - Vurgulama ve hareket ayrıdır. Yanma odasına cıvatalı bir sensör boru tesisatıyla birlikte vurgulanır ama yanma odasının yayıyla hareket eder (
ride,data-rideolarak yayılır). Başka bir grubun vektörüyle kendi yayında hareket ettirilirse bağlantısı boyunca kayar ve uçuş ortasında ona gömülür. - Patlatma vektörlerini ve kademeyi, hiçbir karede hiçbir şey hiçbir şeyin içinden geçmeyecek şekilde seçin:
references/motion.md("Kademe sırasını, hiçbir şeyin bir şeyin içinden geçmesi gerekmeyecek şekilde belirleyin") kuralları içerir ve denetim gerçek yayların açılan, kapanan ve yarı yolda geri dönen her karesini yeniden oynatır ve herhangi bir içinden geçmede başarısız olur. - Grupları lejantta, üzerine gelmenin yaptığı gibi seçen numaralı düğmeler olarak listeleyin (
01 Yalpa mafsalı ve itki diski…). - Yaylar, kademelendirme ve kare başına derinlik yeniden sıralaması
references/motion.md'dedir.
10. Ekranlar ve yüzlerdeki şeyler
Bir ekran, bir kadran yüzü ya da bir gösterge oturduğu yüzün düzleminde çizilir (examples/desk-computer/):
- Yüz düzlemi.
sideMatrix([0, y], 0, P, "left"), bir grubun yerel(x, −z)koordinatlarınıy'deki dikey yüze eşler. Ekrandaki her şeyi (parlama, tarama çizgileri, bir işaret,<text>ve bir imleç) o<g transform>içinde bu düz koordinatlarda çizin. - Bir girinti. Ekranı aynı düzlemdeki bir
clipPathile yuvarlatılmış dış hattına kırpın ve girintinin iç yanlarını yüz iledepthkadar geriye taşınmış yüz arasında dörtgenler olarak çizin. Yanları yönlerine göre gölgelendirin (üstleriso-top, yanlar gölgeyle). Dış hattı yüzdelo, arkadafaintçizin. - Yüzdeki hareket yüz koordinatlarında bir dönüşümdür. CRT kapanışı görüntüyü ekran merkezi etrafında önce bir çizgiye, sonra bir noktaya ölçekler; bir ışın çizgisi ve sönen bir noktayla.
- Makinenin gösterdiği metin (yazılan bir satır, bir sayacın rakamları) bir etiket değil, nesnenin bir parçasıdır; bu yüzden tek etiket kuralı geçerli değildir. Onu ekranın kendi yazı tipinde ve boyutunda tutun ve sığdırın: büyük harf yüksekliği pencere yüksekliğinin yaklaşık 0.55'idir ve göstereceğiniz en geniş dizgi (
8.88, en uzun birim) genişliğine yüksekliğin yaklaşık onda biri kadar bir payla sığmalıdır. Onu herhangi bir ekran gibi pencereye kırpın. Kör testli bir debimetre 12.8 × 8'lik bir pencereye 5.6 px'lik rakamlar koydu; bu yüzden baştaki rakam pencerenin sol kenarını aştı ve rakam üstleri birim etiketine girdi. - Bir açıklıktan görülen içerik (bir gözetleme camı, bir gösterge penceresi, bir girinti) yüzün arkasında durur; bu yüzden açıklığın iç duvarlarını yüz ile arka düzlem arasında, yönlerine göre gölgelendirerek çizin ve içeriği kendi düzleminin yanı sıra yüz düzlemindeki açıklığa da kırpın. Açıklığın içindeki çıplak yüz şeridi yüzeye çizilmiş bir delik gibi okunur. Bir açıklığın arkasındaki bir shader için
webgl.md, bölüm 5.
11. Shader'lar
Bazı konular çizgilerle çizilemez: ateş, egzoz, su, kostikler, gerçek lamba ışığı, buhar. Bunlar çizimin içinde, dünya uzayında ve aynı kamerada, bir arka SVG ile bir ön SVG arasındaki bir WebGL katmanına gider. references/webgl.md katman yığınını, kamera sözleşmesini, zanaat kurallarını (hiçbir şey patlamaz, sert kesimler yok, tonemap ve titreşim, temaya göre karıştırma) ve nasıl doğrulanacaklarını içerir. Bu sayfadaki her şey efektin çevresindeki SVG için hâlâ geçerlidir. Bölüm 8 yayınlanan açık temayı kapsar: kâğıdın göstermesi gereken renkten çözülen mürekkepler, ışıkla büyüyen mürekkep, her parlama için koyu fiziksel bir zemin, sıcak metal, cam, kıvılcımlar, alev, buhar, plazma ve Cherenkov ışığı için tarifler ve shader'la eşleşen WebGL'siz bir yedek.