endüstri mühendisi · ankaraindustrial engineer · ankara

Anıl Beter

veri. model. karar.data. model. decision.

Gerçek dünya kısıtlarını matematiksel modellere, modelleri yazılımla kararlara dönüştürüyorum. Veri bilimi ve optimizasyon odaklı endüstri mühendisi. I turn real-world constraints into mathematical models, and models into decisions through software. Focused on data science and optimization.

−10 m

HakkımdaAbout

Yöneylem araştırması disiplinini Python'da hayata geçiriyor, çıktıları veri analizi ile karar destek sistemlerine dönüştürüyorum. OSTİM Teknik Üniversitesi Endüstri Mühendisliği mezunuyum. I bring operations research to life in Python, turning outputs into decision support systems through data analysis. I'm a graduate of OSTİM Technical University's Industrial Engineering program.

Bitirme projemde otoyol ağlarında WIM sensör yerleşimi problemini 0-1 tamsayılı programlama ile modelledim; üç farklı bölge ölçeğinde GAMS ve Pyomo ile çözdüm. Şu anda bu temeli veri bilimi ve makine öğrenmesi ile derinleştiriyorum. In my thesis project, I modeled the WIM sensor placement problem on highway networks using 0-1 integer programming, solving it at three different regional scales with GAMS and Pyomo. I'm now deepening this foundation with data science and machine learning.

# 2021'den beri kod yazıyorum. Mühendislik disiplinini yazılım geliştirme ile birleştirmek - benim için hobi değil, çalışma biçimi. # I've been writing code since 2021. Combining engineering discipline with software development isn't a hobby for me, it's how I work.

[ 01 / ds-ml ]

Veri Bilimi & Makine ÖğrenmesiData Science & Machine Learning

Veri analizinden denetimli öğrenmeye uçtan uca akış: veriyi temizle, görselleştir, modelle, doğrula. Model seçimini metriklerle savun, his ile değil. An end-to-end flow from data analysis to supervised learning: clean the data, visualize it, model it, validate it. Justify model choice with metrics, not gut feeling.

PandasNumPyscikit-learn Tahmin ModelleriPredictive ModelsMatplotlib/SeabornSQLPower BIEDA
[ 02 / opt ]

Optimizasyon & Yöneylem AraştırmasıOptimization & Operations Research

Tesis yerleşiminden araç rotalamaya, çizelgelemeden kapsama problemlerine. Gerçek dünya kısıtlarını matematiksel modele döküp endüstriyel çözücülerle çözüyorum. From facility location to vehicle routing, from scheduling to covering problems. I translate real-world constraints into mathematical models and solve them with industrial solvers.

0-1 ILPSet CoveringCVRP PuLPPyomoOR-ToolsGAMS/CPLEX
−200 m

Seçili İşlerSelected Work

bitirme projesithesis project

WIM Sensör Yerleşimi OptimizasyonuWIM Sensor Placement Optimization

Problem: Otoyol ağında hareket halinde tartım (WIM) sensörleri nereye yerleştirilmeli ki tüm trafik akışları minimum sensörle kapsansın? Problem: Where should weigh-in-motion (WIM) sensors be placed on a highway network so that all traffic flows are covered with the minimum number of sensors?

Yaklaşım: Problemi Set Covering yapısında 0-1 tamsayılı doğrusal programlama modeli olarak formüle ettim. Üç farklı ölçekte otoyol ağı üzerinde modeli hem GAMS/CPLEX hem de Python/Pyomo ile çözerek sonuçları doğruladım. Approach: I formulated the problem as a 0-1 integer linear programming model with a set covering structure. I validated the results by solving the model on three highway networks of different scales with both GAMS/CPLEX and Python/Pyomo.

Sonuç: Küçük ve orta ölçekte 2 ve 4 sensörle tam kapsama sağlandı. Büyük ölçekte çözücü, bütçe ve kritik düğüm kısıtlarının birlikte sağlanamayacağını kanıtladı: tam kapsama 7 sensör ve bütçenin yaklaşık %30 üzerinde bir yatırım gerektiriyor. Çalışma akademik makale ve posterle jüriye sunuldu. Result: Full coverage with 2 and 4 sensors at the small and medium scales. At the large scale the solver proved that the budget and critical-node constraints cannot both hold: full coverage takes 7 sensors and an investment roughly 30% above the budget. Presented to the jury with an academic paper and poster.

GAMS, Python, Pyomo, 0-1 ILP, Set Covering

  • modelmodel0-1 Tamsayılı Programlama0-1 Integer Programming
  • problem sınıfıproblem classKüme Kapsama ProblemiSet Covering Problem
  • ölçekscale3 farklı otoyol ağı3 different highway networks
  • çözücülersolversGAMS ve PyomoGAMS and Pyomo
  • çıktıoutputAkademik makale + poster + jüri sunumuAcademic paper + poster + jury presentation
Büyük ölçek senaryosunun kapsama grafiği On iki ağır vasıta rotası solda, tam kapsama için seçilen yedi lokasyon sağda. Yedisinin toplam maliyeti 224,55 milyon TL; dördü kritik düğüm ve bunların toplamı tek başına 150,2 milyon TL. Avrupa–Asya (E80) Europe–Asia (E80) Ege İhracat Aegean Export Akdeniz Lojistik Mediterranean Logistics Karadeniz Sahil Black Sea Coast Güneydoğu Transit Southeast Transit Doğu Anadolu Eastern Anatolia İç Anadolu Central Anatolia Marmara Ring Marmara Ring Ücret Kaçışı Batı Toll Evasion West Ücret Kaçışı Güney Toll Evasion South İpek Yolu Silk Road Kuzey–Güney North–South Edirne Kapıkule 51,0 M TL · kritik 51.0 M TRY · critical Habur Sınır Kapısı 36,0 M TL · kritik 36.0 M TRY · critical Çanakkale 28,0 M TL · kritik 28.0 M TRY · critical Sertavul Geçidi 35,2 M TL · kritik 35.2 M TRY · critical Eskişehir 24,35 M TL 24.35 M TRY Samsun 25,0 M TL 25.0 M TRY Erzurum 25,0 M TL 25.0 M TRY ROTALAR · I ROUTES · I SEÇİLEN LOKASYONLAR SELECTED LOCATIONS
Büyük ölçek: on iki rota ve tam kapsama için seçilen yedi lokasyon. KGM'nin 172,5 M TL'lik bütçesiyle model olursuz; olurlu olması için bütçenin en az 224,55 M TL'ye, yani yaklaşık %30 artması gerekiyor. Bütçeyi her değiştirdiğinde bu yedi lokasyonun 128 alt kümesi yeniden taranıyor; her rotayı kapsayan, en az dört kritik düğüm içeren ve bütçeye sığan en ucuz küme aranıyor. Bir lokasyona tıklayınca kapanıyor; açıkta kalan rotalar mor yanıyor. Large scale: twelve routes and the seven locations chosen for full coverage. Under KGM's 172.5 M TRY budget the model is infeasible; it becomes feasible only once the budget reaches 224.55 M TRY, about 30% more. Every time the budget moves, all 128 subsets of these seven locations are searched again for the cheapest one that covers every route, includes at least four critical nodes and fits the budget. Click a location to switch it off; routes left uncovered turn violet.
matematiksel modelmathematical model

0-1 tamsayılı doğrusal program0-1 integer linear program

modeli göstershow modelmodeli gizlehide model

Amaç fonksiyonu, seçilen aday lokasyonların toplam kurulum maliyetini minimize eder. Beş kısıt vardır: her rota en az bir sensörle kapsanır; eğimi yüzde beşi aşan lokasyonlar elenir; kritik düğümlerden belirlenen asgari sayıda lokasyon seçilir; toplam maliyet bütçe üst sınırını aşamaz; karar değişkenleri ikilidir. The objective minimises the total installation cost of the selected candidate locations. Five constraints apply: every route is covered by at least one sensor; locations with a gradient above five percent are eliminated; a minimum number of critical nodes must be selected; total cost cannot exceed the budget ceiling; decision variables are binary.

min  Z = Σj∈J′ Cj · xj

K₁Σj∈J′ aij · xj ≥ 1∀i∈Itam kapsamafull coverage K₂xj = 0∀j : ⌀j > 0,05eğim kısıtıgradient filter K₃Σj∈J′kritik xj ≥ Kminkritik düğümcritical node K₄Σj∈J′ Cj · xj ≤ Bbütçe sınırıbudget ceiling K₅xj ∈ {0,1}∀j∈J′ikili kararbinary decision
I
ağır vasıta rotalarıheavy-vehicle routes
J′
eğim kısıtından geçen adaylarcandidates passing the filter
aij
kapsama matrisicoverage matrix
⌀j
lokasyonun yol eğimiroad gradient at the location
Cj
donanım + yol erişimi + altyapıhardware + road access + infrastructure
Kmin
minimum kritik düğüm sayısıminimum number of critical nodes
B
≈172,5 M TL bütçe üst sınırı≈172.5 M TRY budget ceiling
Orta ölçek senaryosunun kapsama grafiği Beş ağır vasıta rotası solda, seçilen dört sensör lokasyonu sağda. Çubukbeli Geçidi r1'i, Sertavul Geçidi r2'yi, Aksaray r3 ve r5'i, Konya Kavşağı r4 ve r5'i kapsıyor. Çubukbeli ve Sertavul kritik düğümdür. r₁ D650 Ank–Antalya r₂ D715 Ank–Mersin r₃ O-21 Ank–Adana r₄ Afyon–Beyşehir–Konya r₅ Konya–Aksaray Çubukbeli Geçidi 37 M TL · kritik 37 M TRY · critical Sertavul Geçidi 35 M TL · kritik 35 M TRY · critical Aksaray 27 M TL 27 M TRY Konya Kavşağı 27 M TL 27 M TRY ROTALAR · I ROUTES · I SEÇİLEN SENSÖRLER SELECTED SENSORS
Orta ölçek çözümü. 9 aday lokasyondan 4'ü seçildi, 5 rotanın tamamı kapsandı. Kenarlar kapsama matrisinin sıfırdan farklı elemanlarını gösterir. Medium-scale solution. 4 of 9 candidate locations selected, all 5 routes covered. Edges are the non-zero entries of the coverage matrix.
Üç ölçekte optimizasyon sonuçlarıOptimisation results at three scales
küçüksmall ortamedium büyüklarge
rotaroutes 3 5 12
aday lokasyoncandidates 4 9 21
seçilen sensörsensors selected 2 4 7
maliyetcost ~49 M ~126 M ~225 M
bütçe kullanımıbudget used ~%29~29% ~%73~73% aşıldıexceeded
kapsamacoverage %100100% %100100% %100100%

Bulgu. Büyük ölçekte kritik düğüm ve bütçe kısıtlarının eş zamanlı sağlanamayacağı çözücü tarafından kanıtlandı. Bütçe kısıtı kaldırıldığında tam kapsama 7 sensörle sağlanıyor. Mevcut bütçenin yaklaşık %30 üzerinde bir yatırım. Finding. At the large scale, the solver proved that the critical-node and budget constraints cannot both be satisfied. With the budget constraint lifted, full coverage takes 7 sensors, roughly 30% above the current budget.

kişisel projepersonal project

Kapasiteli Araç Rotalama ÇözücüsüCapacitated Vehicle Routing Solver

Problem: Aynı kapasitedeki araçlar bir depodan çıkıyor, her müşteriye tam bir kez uğrayıp depoya dönüyor. Hiçbir araç kapasitesini aşmadan toplam yol nasıl en kısa olur? Problem: Vehicles of equal capacity leave a depot, visit every customer exactly once and return. How can the total distance be as short as possible without any vehicle exceeding its capacity?

Yaklaşım: Modeli Google OR-Tools ile kurdum. Açgözlü bir başlangıç çözümünü süre dolana kadar yerel aramayla iyileştirdim. Çözücüyü optimumu bilinen örneklerde test ettim, sonra kapasite, araç sayısı ve süre limitini tek tek değiştirip sonuca etkisini ölçtüm. Approach: I built the model with Google OR-Tools: a greedy initial solution, improved by local search until the time limit runs out. I tested the solver on instances with known optima, then varied capacity, fleet size and time limit one at a time to measure their effect.

Sonuç: 31 müşterili örnekte bilinen optimum olan 784'ü buldu, rotalar yayımlanmış optimal çözümle birebir aynı. 392 müşteriye kadar büyüyen örneklerde ise 60 saniyenin sonunda optimuma fark %2 ile %16 arasında kaldı. Result: On the 31-customer instance it found the known optimum of 784, with routes identical to the published optimal solution. On instances growing to 392 customers, the gap to the optimum after 60 seconds stayed between 2% and 16%.

Python, OR-Tools, Guided Local Search, Matplotlib

  • problem sınıfıproblem classKapasiteli Araç RotalamaCapacitated Vehicle Routing
  • çözücüsolverGoogle OR-Tools
  • veridataCVRPLIB'den optimumu bilinen 6 örnek6 CVRPLIB instances with known optima
  • ölçekscale31 ile 392 müşteri arası31 to 392 customers
  • duyarlılık analizisensitivity analysisKapasite, araç sayısı, süre limitiCapacity, fleet size, time limit
31 müşterili örneğin optimal rotaları Sağ üstteki depodan beş araç çıkıyor. Rotalar 7, 4, 2, 10 ve 8 müşteriye uğruyor, araç yükleri 98, 72, 44, 98 ve 98. Toplam mesafe 784.

31 müşterili örnek. Kare depo, noktaların büyüklüğü müşterinin talebi. Harita açılınca OR-Tools'un ilk çözümden 784'e kadar bulduğu her iyileşme sırayla oynuyor. 100 dışındaki kapasitelerin bilinen bir optimumu yok; oradaki rotalar çözücünün 30 saniyede bulduğu en iyi çözümler. The 31-customer instance. The square is the depot, dot size is the customer's demand. When the map comes into view, every improvement OR-Tools found on its way from the first solution to 784 plays in order. Capacities other than 100 have no known optimum; those routes are the best the solver found in 30 seconds.

sonuçlarresults

Optimuma ne kadar yakın?How close to the optimum?

sonuçları göstershow resultssonuçları gizlehide results
CVRPLIB'den optimumu bilinen altı örnek. Her hücre, tek bir 60 saniyelik çalıştırmada o ana kadar bulunan en iyi çözümün optimuma farkı. Six CVRPLIB instances with known optima. Each cell is the gap between the optimum and the best solution found so far in a single 60-second run.
müştericustomers 1 sn1 s 10 sn10 s 60 sn60 s
31 %1,51.5% %00% %00%
79 %4,94.9% %3,53.5% %1,91.9%
100 %7,87.8% %4,54.5% %4,54.5%
199 %4,34.3% %3,73.7% %3,73.7%
297 %22,722.7% %16,716.7% %16,016.0%
392 %11,911.9% %8,88.8% %8,08.0%

Bulgu. 31 müşteride yakalanan optimum büyük örneklere taşınmıyor, ama fark boyutla düzenli de büyümüyor. En kötü sonuç en büyük örnekte değil, 297 müşterili örnekte çıkıyor. İlerlemenin çoğu ilk saniyelerde geliyor: 10 saniyeden 60 saniyeye fark çoğu örnekte bir puandan az kapanıyor, yani süreyi uzatmak tek başına farkı kapatmıyor. Finding. The optimum reached at 31 customers does not carry over to larger instances, yet the gap does not grow steadily with size either. The worst result comes at 297 customers, not at the largest instance. Most of the progress arrives in the first few seconds: from 10 to 60 seconds the gap shrinks by less than one point on most instances, so a longer time limit alone does not close the gap.

kişisel projepersonal project

Talep Tahmini & Stok OptimizasyonuDemand Forecasting & Inventory Optimization

Problem: Tahmin bir sayıdır, karar değil. Elde kalan ürün ucuz, karşılanamayan müşteri pahalıysa sipariş miktarı tahminin kendisi olmamalı. Peki ne kadar fazlası sipariş edilmeli? Problem: A forecast is a number, not a decision. When a leftover unit is cheap and an unmet customer is expensive, the order quantity should not be the forecast itself. So how much more should be ordered?

Yaklaşım: İlk katmanda günlük talebi takvim, hava durumu ve önceki günlerin talebinden tahmin ettim. İkinci katmanda tahmini ve hata payını gazeteci çocuk modeline verdim; model, elde tutma ve yok satma maliyetinin toplamını en aza indiren stok seviyesini seçiyor. Güvenlik payı varsayılmıyor, tahmin modelinin kendi hatalarından türetiliyor. Approach: In the first layer I forecast daily demand from the calendar, the weather and the demand of previous days. In the second layer I fed the forecast and its error spread into a newsvendor model, which picks the stock level that minimizes holding plus shortage cost. The safety buffer is not assumed; it is derived from the forecasting model's own errors.

Sonuç: Modelin hiç görmediği 145 günde, tahmini doğrudan sipariş etmeye kıyasla gerçekleşen maliyet yaklaşık %41 düştü. Tahmin modeli hiç değişmeden. Result: Over 145 days the model had never seen, realized cost fell by about 41% compared with ordering the forecast directly, with no change to the forecasting model.

Python, scikit-learn, PuLP, Pandas

  • veridataCapital Bikeshare günlük kiralama sayılarıCapital Bikeshare daily rental counts
  • tahminforecastDoğrusal regresyon, R² 0,73Linear regression, R² 0.73
  • karar modelidecision modelGazeteci çocuk problemi, doğrusal programNewsvendor problem, linear program
  • maliyet oranıcost ratioYok satma 4, elde tutma 1Shortage 4, holding 1
  • testtestEn son 145 gün, karıştırma yokMost recent 145 days, no shuffling
Test dönemindeki 145 günde talep, tahmin ve stok seviyesi Gerçekleşen talep, tahmin ve tahminin 596 birim üstündeki stok seviyesi, Ağustos 2012 ile Aralık 2012 arasında gün gün çizilmiş. Talep stok seviyesini 145 günün 37'sinde aşıyor. 0 3000 6000 9000 EYL SEP EKİ OCT KAS NOV ARA DEC gerçekleşen talep actual demand tahmin forecast stok seviyesi stock level stok yetmedi stock ran out
Test dönemindeki 145 gün. Stok seviyesi tahmin artı güvenlik payı; mor noktalar talebin stoku aştığı günler. Projede yok satma, elde tutmanın 4 katı alındı. The 145 hold-out days. The stock level is the forecast plus a safety buffer; violet dots mark the days demand exceeded the stock. The project assumed a shortage costs 4 times as much as holding.
sonuçlarresults

Tahminden kararaFrom forecast to decision

sonuçları göstershow resultssonuçları gizlehide results
Tahmin katmanı: test dönemindeki R². Önceki günlerin talebi eklenince iki model de iyileşiyor. Forecast layer: R² on the hold-out period. Adding the demand of previous days improves both models.
takvim + havacalendar + weather + önceki günler+ previous days
rastgele ormanrandom forest 0,570.57 0,650.65
doğrusal regresyonlinear regression 0,610.61 0,730.73
Karar katmanı: aynı tahminle iki sipariş politikası, 145 günün toplamı. Decision layer: two ordering policies on the same forecast, totals over the 145 days.
yalnızca tahminforecast only tahmin + güvenlik payıforecast + buffer
toplam maliyettotal cost 260.928260,928 154.835154,835
stokun yetmediği gündays stock ran out 89 37
karşılanamayan talepunmet demand 53.03453,034 14.52914,529
elde kalanleftover 48.79348,793 96.71896,718

Bulgu. Güvenlik payı elde kalan ürünü iki katına çıkarıyor, karşılanamayan talebi ise dörtte bire yakın bir düzeye indiriyor. Yok satma dört kat pahalı olduğu için bu takas toplam maliyeti düşürüyor. Tahmin tarafında ise önceki günlerin talebi eklendiğinde doğrusal regresyon rastgele ormanı geçti: iyi özellik, karmaşık modelden fazla kazandırdı. Finding. The safety buffer doubles the leftover stock but cuts unmet demand to roughly a quarter. Because a shortage costs four times as much, the trade lowers total cost. On the forecasting side, once the demand of previous days was added, linear regression beat random forest: good features paid off more than a complex model.

−1 km

Hobi ProjeleriSide Projects

Mühendislik kimliğimin yanında, 2021'den beri oyun ve web geliştiriyorum. Alongside my engineering identity, I've been developing games and web projects since 2021.

unity · amplify · tamamlandıunity · amplify · finished

Yıldızlı Gece & Kara DelikNight Sky & Black Hole

Amplify Shader Editor ile sıfırdan kurduğum, tamamen prosedürel bir gece gökyüzü: titreşen yıldızlar, samanyolu ve ışığı büken bir kara delik. A fully procedural night sky I built from scratch in Amplify Shader Editor: twinkling stars, a nebula, and a black hole that bends light.

tek shader · sıfır dokuone shader · zero textures

nasıl çalışıyorhow it works

dört teknik, tek graffour techniques, one graph

detayları göstershow detailsdetayları gizlehide details

Gökyüzünün tamamı her karede, hiç doku kullanmadan tek bir Amplify grafında hesaplanıyor. Graf altı shader function'a bölünmüş: ışın bükme, yıldız alanı, bulutsu, disk, galaksi bandı ve hash. The entire sky is computed every frame in a single Amplify graph, without a single texture. The graph is split into six shader functions: ray bending, star field, nebula, disk, galactic band and hash.

  • merceklenmelensing α ∝ 1/b

    Her pikselin ışını, kara deliğe açısal uzaklığı (b) küçüldükçe daha çok bükülüyor. Yıldız, samanyolu ve disk bu bükülmüş ışınla örneklendiği için bütün gök merceklenmiş görünüyor. Each pixel's ray bends more as its angular distance (b) to the black hole shrinks. Stars, nebula and disk are all sampled with the bent ray, so the whole sky is lensed.

  • yığılma diskiaccretion disk ω ∝ r−3/2

    Bükülmüş ışın disk düzlemiyle kesiştiriliyor. Dönüş Kepler'e uyuyor: iç halkalar dıştakilerden hızlı dönüyor, renk içte beyazdan dışta turuncuya iniyor. The bent ray is intersected with the disk plane. Rotation follows Kepler: inner rings spin faster than outer ones, and color cools from white inside to orange outside.

  • yıldızlarstars L = uk

    Gökyüzü üç yoğunlukta hücreye bölünüyor; her hücreye hash ile konum, renk sıcaklığı ve titreşim fazı veriliyor. Parlaklık rastgele bir sayının kuvveti olduğundan az sayıda parlak, çok sayıda sönük yıldız çıkıyor. The sky is split into cells at three densities; a hash gives each cell a position, color temperature and twinkle phase. Brightness is a power of a random number, so there are few bright stars and many faint ones.

  • samanyolunebula fbm(p + w·n(p))

    Dört oktav simplex gürültü, başka bir gürültüyle bükülmüş koordinatlarda örnekleniyor. Bir bant maskesi bulutsuyu ve en sönük yıldızları gökyüzünde tek bir şeritte topluyor. Four octaves of simplex noise are sampled on coordinates warped by another noise. A band mask gathers the nebula and the faintest stars into a single strip across the sky.

Unity'den alınmış kayıt.Captured in Unity.

Unity (URP), Amplify Shader Editor, C#, post-process: Bloom

unity · amplify · tamamlandıunity · amplify · finished

Stilize SuStylized Water

Işığa tepki veren bir gece denizi. Gökyüzü suya yansıyor, dalga tepeleri köpürüyor, yüzeyin altına inince görüş sisle kapanıyor. A night sea that answers the light. The sky reflects on it, wave crests break into foam, and below the surface the view closes into fog.

altı dalga katmanı · sıfır dokusix wave layers · zero textures

nasıl çalışıyorhow it works

dört teknik, tek graffour techniques, one graph

detayları göstershow detailsdetayları gizlehide details

Su tek bir Amplify grafı ve hiç doku kullanmıyor; örneklediği tek görüntü, aynalanmış bir kameranın her karede çizdiği yansıma. Graf on bir shader function'a bölünmüş: dalga, derinlik, köpük, kostik, yansıma, kırılma, ışıklandırma, detay normalleri, su altı yüzeyi, sis ve taban rengi. The water is a single Amplify graph and uses no textures; the only image it samples is the reflection a mirrored camera draws every frame. The graph is split into eleven shader functions: wave, depth, foam, caustics, reflection, refraction, lighting, detail normals, underside, fog and base color.

  • altı dalgasix waves λ = 23 … 4.1

    Altı Gerstner dalgası farklı yön, dalga boyu ve diklikle üst üste biniyor; en uzunu 23, en kısası 4.1 birim. Köşeler yalnızca yükselmiyor, tepelere doğru yatayda da kayıyor. Six Gerstner waves stack up with different directions, wavelengths and steepness, from 23 units down to 4.1. Vertices don't just rise: they also slide horizontally toward the crests.

  • yansımareflection F₀ = 0.02

    Sahne, su düzlemine göre aynalanmış ikinci bir kamerayla her karede yeniden çiziliyor. Yansıma dalga normaliyle bozuluyor ve bakış yüzeye yatıklaştıkça artıyor; oran suyun gerçek Fresnel değerinden geliyor. A second camera, mirrored across the water plane, redraws the scene every frame. The reflection is distorted by the wave normal and grows as the view grazes the surface, at the rate water's own Fresnel value gives.

  • tepe köpüğücrest foam y > 0.62

    Köpük, dalganın yüksekliği eşiği geçtiği yerde beliriyor; kayan bir gürültü kenarlarını parçalıyor. Sığ suda kıyı boyunca ayrıca köpürüyor. Foam appears where a wave's height passes a threshold, and scrolling noise breaks up its edges. In shallow water it foams along the shore as well.

  • snell penceresisnell's window θc ≈ 48.6°

    Su altında yukarıdaki her şey dairesel bir pencereye sıkışıyor, pencerenin dışında yüzey aynaya dönüyor. Uzaklık arttıkça görüş üstel bir sisle kapanıyor. Underwater, everything above squeezes into a circular window, and outside it the surface turns into a mirror. With distance the view closes into an exponential fog.

Yüzeyin altı: Snell penceresi ve sis.Below the surface: Snell's window and fog.

Unity (URP), Amplify Shader Editor, C#, gökyüzüsky: Enviro 3

unity · amplify · devam ediyorunity · amplify · in progress

VHS Korku OyunuVHS Horror Game

Yağmurlu bir gecede, eski bir kamera kaydının içinden izlenen birinci şahıs korku oyunu. Karanlık bir oda, cama vuran yağmur ve bir not. A first-person horror game seen through an old camcorder recording on a rainy night. A dark room, rain against the glass, and a note.

odada bulunan bir nota note found in the room Notta şöyle yazıyor: “Beni duyuyor musun? İçinde cılız bir ışık gibi umut, ona tutunup hala inanıyor musun?”The note is in Turkish and reads: “Beni duyuyor musun? İçinde cılız bir ışık gibi umut, ona tutunup hala inanıyor musun?”
−4 km · dip−4 km · the floor

Kahve?Coffee?

Veri bilimi, makine öğrenmesi, optimizasyon ve karar destek sistemleri rolleri için konuşmaya açığım. Ya da sadece Grim Dawn build'i tartışmak için de yazabilirsiniz. I'm open to talking about data science, machine learning, optimization, and decision support roles. Or you can just write to discuss a Grim Dawn build.