{"id":36203,"date":"2025-12-10T11:01:17","date_gmt":"2025-12-10T08:01:17","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/python-pangolin-api-kapsamli-rehber-gercek-dunya-projeleri\/"},"modified":"2025-12-10T11:01:17","modified_gmt":"2025-12-10T08:01:17","slug":"python-pangolin-api-kapsamli-rehber-gercek-dunya-projeleri","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/python-pangolin-api-kapsamli-rehber-gercek-dunya-projeleri\/","title":{"rendered":"Python Pangolin API: Kapsaml\u0131 Rehber &#038; Ger\u00e7ek D\u00fcnya Projeleri"},"content":{"rendered":"<p><body><\/p>\n<p>Karma\u015f\u0131k 3D verileri h\u0131zl\u0131 ve etkile\u015fimli bir \u015fekilde g\u00f6rselle\u015ftirmek mi istiyorsunuz? \u00d6zellikle robotik, otonom sistemler veya bilgisayar g\u00f6r\u00fc\u015f\u00fc alan\u0131nda \u00e7al\u0131\u015f\u0131yorsan\u0131z, bu s\u00fcrekli bir m\u00fccadeledir. Python Pangolin API, bu zorlu\u011fa g\u00fc\u00e7l\u00fc ve esnek bir \u00e7\u00f6z\u00fcm sunarak, geli\u015ftiricilerin ger\u00e7ek zamanl\u0131 3D g\u00f6rselle\u015ftirmeler ve zengin kullan\u0131c\u0131 aray\u00fczleri olu\u015fturmas\u0131na olanak tan\u0131r. Bu rehberde, Pangolin&#8217;in temel kavramlar\u0131ndan ba\u015flayarak, 15&#8217;ten fazla kod \u00f6rne\u011fi ve iki ger\u00e7ek d\u00fcnya projesiyle bu g\u00fc\u00e7l\u00fc k\u00fct\u00fcphaneyi nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m \u00f6\u011freneceksiniz.<\/p>\n<p>Modern m\u00fchendislik ve bilimsel ara\u015ft\u0131rmalar, giderek artan karma\u015f\u0131k 3D veri setleriyle bo\u011fu\u015fuyor. Otonom ara\u00e7lar\u0131n \u00e7evreyi alg\u0131lamas\u0131ndan, robotlar\u0131n hareket planlamas\u0131na, hatta art\u0131r\u0131lm\u0131\u015f ger\u00e7eklik uygulamalar\u0131na kadar bir\u00e7ok alanda, bu verilerin ger\u00e7ek zamanl\u0131 ve etkile\u015fimli bir \u015fekilde g\u00f6rselle\u015ftirilmesi kritik bir \u00f6neme sahiptir. \u0130\u015fte tam da bu noktada Python Pangolin API devreye giriyor. Pangolin, temel olarak C++ ile yaz\u0131lm\u0131\u015f y\u00fcksek performansl\u0131 bir grafik ve kullan\u0131c\u0131 aray\u00fcz\u00fc k\u00fct\u00fcphanesidir. Ancak Python ba\u011flamalar\u0131 sayesinde, bu g\u00fcc\u00fc Python&#8217;\u0131n basitli\u011fi ve geni\u015f ekosistemiyle birle\u015ftirebilirsiniz.<\/p>\n<p>Pangolin&#8217;i bu kadar \u00f6nemli k\u0131lan ba\u015fl\u0131ca \u00f6zellikler \u015funlard\u0131r:<\/p>\n<ul>\n<li><b>Y\u00fcksek Performans:<\/b> OpenGL&#8217;den tam olarak yararlanarak, b\u00fcy\u00fck 3D veri setlerini (nokta bulutlar\u0131, meshler, kameralar) bile ak\u0131c\u0131 bir \u015fekilde g\u00f6rselle\u015ftirebilir. Bu, \u00f6zellikle SLAM (Simultaneous Localization and Mapping) algoritmalar\u0131 veya dinamik robotik sim\u00fclasyonlar\u0131 gibi ger\u00e7ek zamanl\u0131 uygulamalar i\u00e7in vazge\u00e7ilmezdir.<\/li>\n<li><b>Esnek Kullan\u0131c\u0131 Aray\u00fcz\u00fc (GUI):<\/b> Sadece 3D g\u00f6rselle\u015ftirme yapmakla kalmaz, ayn\u0131 zamanda butonlar, kayd\u0131r\u0131c\u0131lar (sliders), metin giri\u015f alanlar\u0131 gibi etkile\u015fimli GUI bile\u015fenlerini kolayca olu\u015fturman\u0131z\u0131 sa\u011flar. Bu sayede, algoritmalar\u0131n\u0131z\u0131n parametrelerini \u00e7al\u0131\u015fma zaman\u0131nda de\u011fi\u015ftirebilir, g\u00f6rselle\u015ftirmeyi dinamik olarak kontrol edebilirsiniz.<\/li>\n<li><b>\u00c7oklu G\u00f6r\u00fcn\u00fcm Deste\u011fi:<\/b> Tek bir pencere i\u00e7inde birden fazla 2D veya 3D g\u00f6r\u00fcn\u00fcm (viewport) tan\u0131mlayabilirsiniz. Bu \u00f6zellik, farkl\u0131 perspektiflerden verileri incelemek veya ayn\u0131 anda hem ham veriyi hem de i\u015flenmi\u015f sonu\u00e7lar\u0131 g\u00f6stermek i\u00e7in idealdir.<\/li>\n<li><b>Sens\u00f6r Verisi G\u00f6rselle\u015ftirmesi \u0130\u00e7in \u0130deal:<\/b> LiDAR, kamera, IMU gibi \u00e7e\u015fitli sens\u00f6rlerden gelen verileri bir araya getirerek anlaml\u0131 g\u00f6rselle\u015ftirmeler olu\u015fturabilir. Bu, otonom sistemlerin geli\u015ftirilmesinde b\u00fcy\u00fck kolayl\u0131k sa\u011flar.<\/li>\n<\/ul>\n<p>Pangolin, \u00f6zellikle Python&#8217;daki di\u011fer genel ama\u00e7l\u0131 g\u00f6rselle\u015ftirme k\u00fct\u00fcphanelerine k\u0131yasla, 3D bilgisayar g\u00f6r\u00fc\u015f\u00fc ve robotik alan\u0131ndaki spesifik ihtiya\u00e7lara y\u00f6nelik olarak tasarlanm\u0131\u015ft\u0131r. \u00d6rne\u011fin, Matplotlib gibi k\u00fct\u00fcphaneler 2D \u00e7izimler i\u00e7in harikayken, Pangolin&#8217;in g\u00fcc\u00fc, binlerce veya milyonlarca noktan\u0131n yer ald\u0131\u011f\u0131 dinamik 3D ortamlar\u0131 saniyede onlarca kare h\u0131z\u0131nda g\u00f6sterebilmesinde yatar. Ayr\u0131ca, geli\u015fmi\u015f kamera modelleri ve d\u00f6n\u00fc\u015ft\u00fcrme matrisleriyle do\u011frudan \u00e7al\u0131\u015fma yetene\u011fi, bu alandaki geli\u015ftiriciler i\u00e7in onu vazge\u00e7ilmez bir ara\u00e7 haline getirir. Bu makale boyunca, bu \u00f6zelliklerin her birini derinlemesine inceleyecek ve pratik kod \u00f6rnekleriyle nas\u0131l uygulayaca\u011f\u0131n\u0131z\u0131 g\u00f6sterece\u011fiz. B\u00f6ylece, Python projelerinize etkile\u015fimli ve y\u00fcksek performansl\u0131 3D g\u00f6rselle\u015ftirme yetenekleri kazand\u0131rabileceksiniz.<\/p>\n<h2>Python Pangolin API Temellerini Anlamak: Ba\u015flang\u0131\u00e7 Noktan\u0131z Neresi Olmal\u0131?<\/h2>\n<p>Python Pangolin d\u00fcnyas\u0131na ad\u0131m atman\u0131n ilk ad\u0131m\u0131, temel kurulum ve ilk basit g\u00f6rselle\u015ftirme \u00f6rne\u011fini anlamakt\u0131r. Pangolin, \u00f6zellikle grafik kart\u0131n\u0131z\u0131n g\u00fcc\u00fcn\u00fc kullanan OpenGL tabanl\u0131 bir k\u00fct\u00fcphane oldu\u011fu i\u00e7in, do\u011fru kurulum ad\u0131mlar\u0131 hayati \u00f6neme sahiptir. Genellikle C++ s\u00fcr\u00fcm\u00fcn\u00fcn derlenmesi gereklidir, ancak Python ba\u011flamalar\u0131 (<code>pypangolin<\/code>) kurulumu olduk\u00e7a basittir.<\/p>\n<h3>Pangolin&#8217;i Python Ortam\u0131n\u0131za Nas\u0131l Kurabilirsiniz?<\/h3>\n<p>Kurulum s\u00fcreci, i\u015fletim sisteminize g\u00f6re baz\u0131 farkl\u0131l\u0131klar g\u00f6sterebilir, ancak genel olarak a\u015fa\u011f\u0131daki ad\u0131mlar\u0131 izleyerek <code>pypangolin<\/code>&#8216;i kurabilirsiniz:<\/p>\n<ol>\n<li>\u00d6ncelikle, sisteminizde C++ derleyicisi (GCC veya Clang) ve OpenGL geli\u015ftirme k\u00fct\u00fcphanelerinin y\u00fckl\u00fc oldu\u011fundan emin olun.<\/li>\n<li>Ard\u0131ndan, Python paket y\u00f6neticisi pip arac\u0131l\u0131\u011f\u0131yla <code>pypangolin<\/code>&#8216;i y\u00fckleyebilirsiniz:<\/li>\n<\/ol>\n<pre><code>\n  pip install pypangolin\n<\/pre>\n<p><\/code><\/p>\n<p>E\u011fer bu komut ba\u015far\u0131s\u0131z olursa veya sisteminize \u00f6zg\u00fc ba\u011f\u0131ml\u0131l\u0131k sorunlar\u0131 ya\u015farsan\u0131z, Pangolin'in resmi GitHub sayfas\u0131ndaki kurulum talimatlar\u0131na ba\u015fvurman\u0131z gerekebilir. \u00d6zellikle Ubuntu\/Debian tabanl\u0131 sistemlerde <code>sudo apt install libgl-dev libglew-dev libglfw3-dev<\/code> gibi paketleri y\u00fcklemeniz gerekebilir.<\/p>\n<h3>\u0130lk Pangolin Pencerenizi ve Temel \u00c7iziminizi Nas\u0131l Yapars\u0131n\u0131z?<\/h3>\n<p>Kurulum tamamland\u0131ktan sonra, Pangolin'in g\u00fcc\u00fcn\u00fc g\u00f6steren ilk basit \u00f6rne\u011fimize ge\u00e7ebiliriz. Bu \u00f6rnek, bo\u015f bir pencere a\u00e7acak ve \u00fczerine basit bir \u00fc\u00e7gen \u00e7izecektir. Bu, Pangolin'in temel ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc anlaman\u0131z i\u00e7in kritik bir ba\u015flang\u0131\u00e7 noktas\u0131d\u0131r.<\/p>\n<pre><code>\nimport pangolin\nimport OpenGL.GL as gl\n\ndef main():\n    # 640x480 boyutlar\u0131nda bir pencere olu\u015ftur\n    pangolin.CreateWindowAndBind('\u0130lk Pangolin Penceresi', 640, 480)\n\n    # Temel OpenGL durumlar\u0131n\u0131 ayarla\n    gl.glEnable(gl.GL_DEPTH_TEST) # Derinlik testi etkinle\u015ftir\n\n    # Bir 'View' veya 'Viewport' olu\u015ftur. Bu, pencere i\u00e7inde \u00e7izim yapaca\u011f\u0131m\u0131z aland\u0131r.\n    # Bu g\u00f6r\u00fcn\u00fcm, t\u00fcm pencere alan\u0131n\u0131 kaplayacak ve basit bir ortografik projeksiyon kullanacak.\n    # Genellikle 3D uygulamalar i\u00e7in bir 'Handler' (\u00f6rne\u011fin pangolin.Handler3D) kullan\u0131r\u0131z,\n    # ancak burada sadece basit bir \u00e7izim yap\u0131yoruz.\n    dcam = pangolin.CreateDisplay()\n    dcam.SetBounds(0.0, 1.0, 0.0, 1.0, -640.0\/480.0, 640.0\/480.0) # Tam ekran\u0131 kapla\n    dcam.Activate()\n\n    # Pencere kapanana kadar d\u00f6ng\u00fcde kal\n    while not pangolin.ShouldQuit():\n        # Arka plan\u0131 temizle (RGBA de\u011ferleri ile siyah ve tam opak)\n        gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT)\n        gl.glClearColor(0.0, 0.0, 0.0, 1.0) # Siyah arka plan\n\n        # Birim matrisini y\u00fckle\n        gl.glMatrixMode(gl.GL_PROJECTION)\n        gl.glLoadIdentity()\n        gl.glOrtho(-1, 1, -1, 1, -1, 1) # Ortografik projeksiyon\n\n        gl.glMatrixMode(gl.GL_MODELVIEW)\n        gl.glLoadIdentity()\n\n        # Basit bir k\u0131rm\u0131z\u0131 \u00fc\u00e7gen \u00e7iz\n        gl.glColor3f(1.0, 0.0, 0.0) # K\u0131rm\u0131z\u0131 renk\n        gl.glBegin(gl.GL_TRIANGLES)\n        gl.glVertex3f(-0.5, -0.5, 0.0)\n        gl.glVertex3f(0.5, -0.5, 0.0)\n        gl.glVertex3f(0.0, 0.5, 0.0)\n        gl.glEnd()\n\n        # Tamponlar\u0131 de\u011fi\u015ftir ve olaylar\u0131 i\u015fle (fare, klavye vb.)\n        pangolin.FinishFrame()\n\nif __name__ == '__main__':\n    main()\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki kod blo\u011fu, Pangolin ile bir 3D g\u00f6rselle\u015ftirme uygulamas\u0131n\u0131n temel iskeletini olu\u015fturur. <code>pangolin.CreateWindowAndBind<\/code> ile pencere olu\u015fturulur. <code>gl.glEnable(gl.GL_DEPTH_TEST)<\/code> 3D nesnelerin do\u011fru \u015fekilde \u00fcst \u00fcste binmesini sa\u011flar. Ana d\u00f6ng\u00fc i\u00e7erisinde, her karede ekran temizlenir, projeksiyon ve modelview matrisleri ayarlan\u0131r, nesneler \u00e7izilir ve <code>pangolin.FinishFrame()<\/code> ile \u00e7izilen her \u015fey ekranda g\u00f6sterilirken, kullan\u0131c\u0131 girdileri de i\u015flenir. Bu d\u00f6ng\u00fc, kullan\u0131c\u0131 pencereyi kapatana kadar devam eder. Bu temel yap\u0131y\u0131 anlamak, daha karma\u015f\u0131k 3D g\u00f6rselle\u015ftirmelere ge\u00e7erken size sa\u011flam bir temel sa\u011flayacakt\u0131r.<\/p>\n<p class=\"expert-tip\">Uzman \u0130pucu: Pangolin'in C++ k\u00f6kenli oldu\u011funu unutmay\u0131n. Bu, OpenGL komutlar\u0131n\u0131 do\u011frudan kullanabilece\u011finiz anlam\u0131na gelir, bu da size inan\u0131lmaz bir esneklik ve performans sunar. Python'da <code>OpenGL.GL<\/code> mod\u00fcl\u00fc, bu komutlara eri\u015fmenizi sa\u011flar.<\/p>\n<h2>Pangolin ile 3D Veri G\u00f6rselle\u015ftirmesi Nas\u0131l Yap\u0131l\u0131r? Temel \u00c7izim Fonksiyonlar\u0131 ve Kamera Kontrol\u00fc<\/h2>\n<p>Pangolin'in ger\u00e7ek g\u00fcc\u00fc, karma\u015f\u0131k 3D verileri etkili bir \u015fekilde g\u00f6rselle\u015ftirme yetene\u011finde yatar. Nokta bulutlar\u0131ndan \u00e7izgilere, \u00fc\u00e7gen a\u011flara kadar \u00e7e\u015fitli 3D elementleri \u00e7izmek ve bunlar\u0131 interaktif bir kamera ile kontrol etmek, Pangolin'in temel yeteneklerindendir. Bu b\u00f6l\u00fcmde, bu \u00e7izim tekniklerini ve kamera y\u00f6netimini derinlemesine inceleyece\u011fiz.<\/p>\n<h3>Nokta Bulutlar\u0131, \u00c7izgiler ve \u00dc\u00e7genler Nas\u0131l \u00c7izilir?<\/h3>\n<p>3D d\u00fcnyada g\u00f6rselle\u015ftirdi\u011fimiz \u00e7o\u011fu veri, noktalar, \u00e7izgiler ve \u00fc\u00e7genlerden olu\u015fur. \u00d6rne\u011fin, bir LiDAR sens\u00f6r\u00fcnden gelen ham veri bir nokta bulutudur; bir robotun yolu \u00e7izgilerle temsil edilebilir; ve bir 3D model, \u00fc\u00e7gen a\u011flar\u0131ndan (mesh) olu\u015fur. Pangolin, bu temel geometrik primitifleri \u00e7izmek i\u00e7in OpenGL'in yerle\u015fik i\u015flevlerini Python arac\u0131l\u0131\u011f\u0131yla kullan\u0131r.<\/p>\n<pre><code>\nimport pangolin\nimport OpenGL.GL as gl\nimport numpy as np\n\ndef draw_3d_objects():\n    pangolin.CreateWindowAndBind('3D Nesne G\u00f6rselle\u015ftirme', 640, 480)\n    gl.glEnable(gl.GL_DEPTH_TEST)\n\n    # 3D kamera g\u00f6r\u00fcn\u00fcm\u00fc i\u00e7in Display (dcam) ve Handler (handler) olu\u015ftur\n    scam = pangolin.OpenGlRenderState(\n        pangolin.ProjectionMatrix(640, 480, 420, 420, 320, 240, 0.1, 1000), # Projeksiyon matrisi\n        pangolin.ModelViewLookAt(-2, 2, -2, 0, 0, 0, pangolin.AxisDirection.AxisY)) # Kamera pozisyonu\n    handler = pangolin.Handler3D(scam)\n\n    # Tam pencereyi kaplayan bir Display olu\u015ftur ve Handler'\u0131 ata\n    dcam = pangolin.CreateDisplay()\n    dcam.SetBounds(0.0, 1.0, 0.0, 1.0, -640.0\/480.0) # Oran koruyucu\n    dcam.SetHandler(handler)\n\n    # \u00d6rnek veri olu\u015ftur\n    # Nokta bulutu: Rasgele 1000 nokta\n    point_cloud = np.random.rand(1000, 3) * 5 - 2.5 # -2.5 ile 2.5 aras\u0131nda\n\n    # \u00c7izgiler: Bir k\u00fcp\u00fcn kenarlar\u0131\n    lines = np.array([\n        [-1,-1,-1], [ 1,-1,-1],\n        [ 1,-1,-1], [ 1, 1,-1],\n        [ 1, 1,-1], [-1, 1,-1],\n        [-1, 1,-1], [-1,-1,-1],\n\n        [-1,-1, 1], [ 1,-1, 1],\n        [ 1,-1, 1], [ 1, 1, 1],\n        [ 1, 1, 1], [-1, 1, 1],\n        [-1, 1, 1], [-1,-1, 1],\n\n        [-1,-1,-1], [-1,-1, 1],\n        [ 1,-1,-1], [ 1,-1, 1],\n        [ 1, 1,-1], [ 1, 1, 1],\n        [-1, 1,-1], [-1, 1, 1]\n    ], dtype=np.float32)\n\n    # \u00dc\u00e7gen: Basit bir piramit taban\u0131\n    triangle_strip = np.array([\n        [0,0,0], [1,0,0], [0,1,0], # \u00dc\u00e7gen 1\n        [1,0,0], [1,1,0], [0,1,0]  # \u00dc\u00e7gen 2\n    ], dtype=np.float32)\n\n\n    while not pangolin.ShouldQuit():\n        gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT)\n        gl.glClearColor(0.1, 0.1, 0.1, 1.0) # Koyu gri arka plan\n\n        dcam.Activate(scam) # Kamera g\u00f6r\u00fcn\u00fcm\u00fcn\u00fc etkinle\u015ftir\n\n        # \u00c7izimler\n        # 1. Nokta Bulutu (Ye\u015fil)\n        gl.glPointSize(3) # Nokta boyutu\n        gl.glColor3f(0.0, 1.0, 0.0) # Ye\u015fil\n        pangolin.RenderCloud(point_cloud) # Optimize edilmi\u015f nokta bulutu \u00e7izimi\n\n        # 2. \u00c7izgiler (Mavi)\n        gl.glLineWidth(2) # \u00c7izgi kal\u0131nl\u0131\u011f\u0131\n        gl.glColor3f(0.0, 0.0, 1.0) # Mavi\n        gl.glBegin(gl.GL_LINES)\n        for i in range(0, len(lines), 2):\n            gl.glVertex3fv(lines[i])\n            gl.glVertex3fv(lines[i+1])\n        gl.glEnd()\n\n        # 3. \u00dc\u00e7genler (Mor)\n        gl.glColor3f(1.0, 0.0, 1.0) # Mor\n        gl.glBegin(gl.GL_TRIANGLES)\n        for tri in triangle_strip:\n            gl.glVertex3fv(tri)\n        gl.glEnd()\n\n        pangolin.FinishFrame()\n\nif __name__ == '__main__':\n    draw_3d_objects()\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki kodda, <code>pangolin.OpenGlRenderState<\/code> ile bir 3D kamera durumu tan\u0131ml\u0131yoruz ve <code>pangolin.Handler3D<\/code> ile bu kameray\u0131 fare ve klavye etkile\u015fimlerine a\u00e7\u0131yoruz. <code>pangolin.RenderCloud(point_cloud)<\/code> fonksiyonu, NumPy dizisi olarak verilen bir nokta bulutunu do\u011frudan ve optimize edilmi\u015f bir \u015fekilde \u00e7izebilir. Di\u011fer geometrik primitifler i\u00e7in, do\u011frudan <code>OpenGL.GL<\/code> fonksiyonlar\u0131n\u0131 (<code>gl.glBegin(gl.GL_LINES)<\/code>, <code>gl.glVertex3fv<\/code> vb.) kullan\u0131yoruz. <code>gl.glPointSize<\/code> ve <code>gl.glLineWidth<\/code> ile \u00e7izimlerin boyutlar\u0131n\u0131 ayarlayabilirsiniz.<\/p>\n<h3>Kamera Kontrol\u00fc ve Etkile\u015fim Nas\u0131l Y\u00f6netilir?<\/h3>\n<p>Pangolin'in en g\u00fc\u00e7l\u00fc yanlar\u0131ndan biri, 3D sahnelerinizde gezinmeyi sa\u011flayan kolay kamera kontrol\u00fcd\u00fcr. <code>pangolin.Handler3D<\/code> s\u0131n\u0131f\u0131, fare ve klavye girdilerini otomatik olarak i\u015fleyerek, sahneyi d\u00f6nd\u00fcrme, yak\u0131nla\u015ft\u0131rma\/uzakla\u015ft\u0131rma ve kayd\u0131rma gibi standart 3D gezinti i\u015flevlerini sunar. <code>pangolin.ModelViewLookAt<\/code> fonksiyonu, kameran\u0131n konumunu, bakt\u0131\u011f\u0131 noktay\u0131 ve yukar\u0131 y\u00f6n vekt\u00f6r\u00fcn\u00fc ayarlaman\u0131za olanak tan\u0131r.<\/p>\n<p class=\"expert-tip\">Uzman \u0130pucu: Daha performansl\u0131 3D \u00e7izimler i\u00e7in, OpenGL'in VBO'lar\u0131n\u0131 (Vertex Buffer Objects) kullanmay\u0131 d\u00fc\u015f\u00fcnebilirsiniz. Pangolin, <code>pangolin.GlBuffer<\/code> gibi s\u0131n\u0131flar arac\u0131l\u0131\u011f\u0131yla bu t\u00fcr geli\u015fmi\u015f \u00f6zellikleri de destekler. \u00d6zellikle milyonlarca noktal\u0131k bulutlar\u0131 g\u00f6rselle\u015ftirirken VBO'lar hayati \u00f6nem ta\u015f\u0131r.<\/p>\n<p>Bu b\u00f6l\u00fcmde \u00f6\u011frendiklerinizle, Pangolin ile temel 3D nesneleri \u00e7izebilir ve sahnenizde etkile\u015fimli olarak gezinebilirsiniz. Bu, daha karma\u015f\u0131k 3D uygulamalar\u0131n temelini olu\u015fturur ve ger\u00e7ek d\u00fcnya projelerine ge\u00e7meden \u00f6nce sa\u011flam bir kavray\u0131\u015f edinmenizi sa\u011flar.<\/p>\n<h2>Pangolin Aray\u00fcz\u00fc ile Etkile\u015fim: Dinamik Kullan\u0131c\u0131 Kontrolleri Nas\u0131l Eklenir?<\/h2>\n<p>Pangolin sadece 3D g\u00f6rselle\u015ftirme k\u00fct\u00fcphanesi olmaktan \u00f6te, ayn\u0131 zamanda g\u00fc\u00e7l\u00fc ve \u00f6zelle\u015ftirilebilir bir kullan\u0131c\u0131 aray\u00fcz\u00fc (GUI) olu\u015fturma yetene\u011fine de sahiptir. Bu \u00f6zellik, algoritmalar\u0131n\u0131z\u0131n parametrelerini ger\u00e7ek zamanl\u0131 olarak ayarlaman\u0131za, farkl\u0131 g\u00f6rselle\u015ftirme modlar\u0131 aras\u0131nda ge\u00e7i\u015f yapman\u0131za veya kullan\u0131c\u0131dan girdi alman\u0131za olanak tan\u0131r. Bu b\u00f6l\u00fcmde, Pangolin'in GUI bile\u015fenlerini nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ve dinamik etkile\u015fimleri nas\u0131l y\u00f6netece\u011finizi \u00f6\u011frenece\u011fiz.<\/p>\n<h3>Butonlar, Kayd\u0131r\u0131c\u0131lar (Sliders) ve De\u011fi\u015fkenler Nas\u0131l Olu\u015fturulur?<\/h3>\n<p>Pangolin, GUI elemanlar\u0131n\u0131 bir panel (<code>pangolin.CreatePanel<\/code>) i\u00e7inde d\u00fczenleyerek sunar. Her bir GUI eleman\u0131, genellikle bir <code>pangolin.Var<\/code> objesine ba\u011fl\u0131d\u0131r. Bu <code>pangolin.Var<\/code> objeleri, Python de\u011fi\u015fkenleri gibi davran\u0131r, ancak de\u011ferleri GUI \u00fczerinden de\u011fi\u015ftirilebilir ve bu de\u011fi\u015fiklikler an\u0131nda uygulaman\u0131za yans\u0131r.<\/p>\n<pre><code>\nimport pangolin\nimport OpenGL.GL as gl\nimport numpy as np\n\ndef interactive_gui_example():\n    pangolin.CreateWindowAndBind('Etkile\u015fimli GUI \u00d6rne\u011fi', 800, 600)\n    gl.glEnable(gl.GL_DEPTH_TEST)\n\n    # 3D kamera g\u00f6r\u00fcn\u00fcm\u00fc i\u00e7in OpenGlRenderState ve Handler olu\u015ftur\n    scam = pangolin.OpenGlRenderState(\n        pangolin.ProjectionMatrix(640, 480, 420, 420, 320, 240, 0.1, 1000),\n        pangolin.ModelViewLookAt(-2, 2, -2, 0, 0, 0, pangolin.AxisDirection.AxisY))\n    handler = pangolin.Handler3D(scam)\n\n    # Panel i\u00e7in ayr\u0131 bir Display olu\u015ftur\n    dpanel = pangolin.CreatePanel('control_panel')\n    dpanel.SetBounds(0.0, 1.0, 0.0, pangolin.Attach.Pix(200)) # Sol tarafta 200px geni\u015fli\u011finde\n\n    # 3D g\u00f6r\u00fcn\u00fcm i\u00e7in ayr\u0131 bir Display olu\u015ftur\n    dcam = pangolin.CreateDisplay()\n    dcam.SetBounds(0.0, 1.0, pangolin.Attach.Pix(200), 1.0, -640.0\/480.0) # Panelin sa\u011f\u0131nda\n    dcam.SetHandler(handler)\n\n    # GUI De\u011fi\u015fkenleri ve Kontrolleri\n    # Bir boolean de\u011fi\u015fkeni ve bir onay kutusu\n    pangolin.VarBool('control_panel.Show Points', True, True)\n    # Bir float de\u011fi\u015fkeni ve bir kayd\u0131r\u0131c\u0131\n    pangolin.VarFloat('control_panel.Point Size', 3.0, 1.0, 10.0)\n    # Bir integer de\u011fi\u015fkeni ve bir kayd\u0131r\u0131c\u0131\n    pangolin.VarInt('control_panel.Num Points', 1000, 100, 5000)\n    # Bir buton\n    pangolin.Var('control_panel.Reset Camera', lambda: scam.SetModelViewMatrix(\n        pangolin.ModelViewLookAt(-2, 2, -2, 0, 0, 0, pangolin.AxisDirection.AxisY)), False)\n\n    # Global olarak eri\u015filebilen Pangolin de\u011fi\u015fkenlerini al\n    show_points = pangolin.VarBool('control_panel.Show Points')\n    point_size = pangolin.VarFloat('control_panel.Point Size')\n    num_points = pangolin.VarInt('control_panel.Num Points')\n\n    # \u0130lk nokta bulutunu olu\u015ftur\n    point_cloud = np.random.rand(num_points.Get(), 3) * 5 - 2.5\n\n    while not pangolin.ShouldQuit():\n        gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT)\n        gl.glClearColor(0.15, 0.15, 0.15, 1.0) # Biraz daha a\u00e7\u0131k gri arka plan\n\n        # Paneli etkinle\u015ftir ve \u00e7iz (Pangolin otomatik yapar)\n        dpanel.Activate() # Bu \u00e7a\u011fr\u0131 asl\u0131nda gerekmez, CreatePanel kendi Display'ini y\u00f6netir.\n\n        # 3D G\u00f6r\u00fcn\u00fcm\u00fc etkinle\u015ftir\n        dcam.Activate(scam)\n\n        # Nokta bulutu say\u0131s\u0131nda de\u011fi\u015fiklik olup olmad\u0131\u011f\u0131n\u0131 kontrol et\n        if num_points.Get() != len(point_cloud):\n            point_cloud = np.random.rand(num_points.Get(), 3) * 5 - 2.5\n\n        if show_points.Get():\n            gl.glPointSize(point_size.Get())\n            gl.glColor3f(0.0, 1.0, 0.0) # Ye\u015fil\n            pangolin.RenderCloud(point_cloud)\n\n        pangolin.FinishFrame()\n\nif __name__ == '__main__':\n    interactive_gui_example()\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, sol tarafta bir kontrol paneli (<code>dpanel<\/code>) olu\u015fturulmu\u015ftur. Panelin i\u00e7inde \u00fc\u00e7 farkl\u0131 tipte GUI eleman\u0131 tan\u0131mlanm\u0131\u015ft\u0131r:<\/p>\n<ul>\n<li><code>pangolin.VarBool('control_panel.Show Points', True, True)<\/code>: Bir onay kutusu (checkbox) olu\u015fturur. \u0130lk <code>True<\/code> ba\u015flang\u0131\u00e7 de\u011ferini, ikinci <code>True<\/code> ise GUI'nin ba\u015flat\u0131ld\u0131\u011f\u0131nda g\u00f6r\u00fcn\u00fcr olup olmayaca\u011f\u0131n\u0131 belirtir.<\/li>\n<li><code>pangolin.VarFloat('control_panel.Point Size', 3.0, 1.0, 10.0)<\/code>: Bir kayd\u0131r\u0131c\u0131 (slider) olu\u015fturur. <code>3.0<\/code> ba\u015flang\u0131\u00e7 de\u011feri, <code>1.0<\/code> minimum ve <code>10.0<\/code> maksimum de\u011ferini temsil eder.<\/li>\n<li><code>pangolin.VarInt('control_panel.Num Points', 1000, 100, 5000)<\/code>: Ba\u015fka bir kayd\u0131r\u0131c\u0131, bu kez integer de\u011ferler i\u00e7in.<\/li>\n<li><code>pangolin.Var('control_panel.Reset Camera', lambda: ..., False)<\/code>: Bir buton olu\u015fturur. Lambda fonksiyonu, butona t\u0131kland\u0131\u011f\u0131nda \u00e7al\u0131\u015facak kodu tan\u0131mlar.<\/li>\n<\/ul>\n<p>Bu de\u011fi\u015fkenlere ana d\u00f6ng\u00fc i\u00e7inde <code>show_points.Get()<\/code>, <code>point_size.Get()<\/code> gibi metodlarla eri\u015febiliriz. Butonlar i\u00e7in ise do\u011frudan bir <code>Get()<\/code> metodu \u00e7a\u011f\u0131rmaya gerek yoktur; Pangolin, butona t\u0131kland\u0131\u011f\u0131nda lambda fonksiyonunu otomatik olarak tetikler. Bu yap\u0131 sayesinde, uygulaman\u0131z\u0131n davran\u0131\u015f\u0131n\u0131 ve g\u00f6rselle\u015ftirmesini an\u0131nda kullan\u0131c\u0131 girdilerine g\u00f6re de\u011fi\u015ftirebilirsiniz, bu da hata ay\u0131klama ve parametre ayarlama s\u00fcre\u00e7lerini \u00f6nemli \u00f6l\u00e7\u00fcde h\u0131zland\u0131r\u0131r.<\/p>\n<p class=\"expert-tip\">Uzman \u0130pucu: Pangolin'in GUI de\u011fi\u015fkenleri, kaydedilebilir ve y\u00fcklenebilir. Yani, bir uygulama kapat\u0131l\u0131p tekrar a\u00e7\u0131ld\u0131\u011f\u0131nda, en son ayarlar\u0131 geri y\u00fckleyebilir. Bu, uzun s\u00fcreli geli\u015ftirme ve test s\u00fcre\u00e7lerinde b\u00fcy\u00fck kolayl\u0131k sa\u011flar.<\/p>\n<p>Kontrol panelleri ve GUI elemanlar\u0131, karma\u015f\u0131k 3D uygulamalar\u0131 daha kullan\u0131c\u0131 dostu ve interaktif hale getirmenin anahtar\u0131d\u0131r. Bu sayede, geli\u015ftiriciler algoritmalar\u0131yla daha rahat deney yapabilir ve sonu\u00e7lar\u0131 an\u0131nda g\u00f6rebilirler.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Projesi 1: SLAM Algoritmas\u0131 Sonu\u00e7lar\u0131n\u0131 Pangolin ile G\u00f6rselle\u015ftirme<\/h2>\n<p>SLAM (Simultaneous Localization and Mapping) algoritmalar\u0131, robotik ve otonom sistemlerin temel ta\u015flar\u0131ndan biridir. Bir robotun bilmedi\u011fi bir ortamda hem kendi konumunu belirlemesini hem de ortam\u0131n bir haritas\u0131n\u0131 \u00e7\u0131karmas\u0131n\u0131 sa\u011flarlar. SLAM algoritmalar\u0131n\u0131n \u00e7\u0131kt\u0131s\u0131n\u0131 etkili bir \u015fekilde g\u00f6rselle\u015ftirmek, performanslar\u0131n\u0131 anlamak ve hatalar\u0131 ay\u0131klamak i\u00e7in hayati \u00f6neme sahiptir. Pangolin, bu t\u00fcr dinamik 3D verilerin ger\u00e7ek zamanl\u0131 g\u00f6rselle\u015ftirilmesi i\u00e7in m\u00fckemmel bir ara\u00e7t\u0131r.<\/p>\n<h3>Vaka Analizi: Otonom Ara\u00e7ta SLAM Verisi G\u00f6rselle\u015ftirmesi<\/h3>\n<p>Bir otonom arac\u0131n, kameralar\u0131ndan ve LiDAR sens\u00f6rlerinden elde etti\u011fi verileri kullanarak \u00e7evresini haritalad\u0131\u011f\u0131n\u0131 ve kendi konumunu izledi\u011fini hayal edin. Bir SLAM algoritmas\u0131 tipik olarak \u015fu \u00e7\u0131kt\u0131lar\u0131 \u00fcretir:<\/p>\n<ul>\n<li><b>Kamera Pozlar\u0131:<\/b> Arac\u0131n zaman i\u00e7indeki konumlar\u0131 ve y\u00f6nelimleri (genellikle bir dizi d\u00f6n\u00fc\u015f\u00fcm matrisi olarak).<\/li>\n<li><b>Nokta Bulutu Haritas\u0131:<\/b> Ortam\u0131n 3D noktalar\u0131ndan olu\u015fan seyrek veya yo\u011fun bir harita.<\/li>\n<li><b>Anahtar Kareler (Keyframes):<\/b> SLAM algoritmas\u0131n\u0131n harita olu\u015fturmak i\u00e7in kulland\u0131\u011f\u0131 kritik kamera pozlar\u0131.<\/li>\n<\/ul>\n<p>Pangolin ile bu verileri ayn\u0131 3D sahnede, arac\u0131n hareketini ve haritan\u0131n olu\u015fumunu g\u00f6zlemleyerek g\u00f6rselle\u015ftirebiliriz. Bu, algoritman\u0131n ne kadar do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131, nerede hatalar yapt\u0131\u011f\u0131n\u0131 ve iyile\u015ftirme alanlar\u0131n\u0131 tespit etmemize yard\u0131mc\u0131 olur.<\/p>\n<h3>SLAM Verilerini Pangolin ile Ad\u0131m Ad\u0131m Nas\u0131l G\u00f6rselle\u015ftirirsiniz?<\/h3>\n<p>A\u015fa\u011f\u0131daki \u00f6rnekte, basit bir SLAM senaryosunu sim\u00fcle ederek kamera pozlar\u0131n\u0131 (robotun izledi\u011fi yol), harita noktalar\u0131n\u0131 ve anahtar kareleri nas\u0131l g\u00f6rselle\u015ftirece\u011fimizi g\u00f6sterece\u011fiz. Ger\u00e7ek bir SLAM \u00e7\u0131kt\u0131s\u0131 yerine, bu verileri programatik olarak \u00fcretece\u011fiz.<\/p>\n<pre><code>\nimport pangolin\nimport OpenGL.GL as gl\nimport numpy as np\nimport time\n\ndef visualize_slam_data():\n    pangolin.CreateWindowAndBind('SLAM G\u00f6rselle\u015ftirme', 1024, 768)\n    gl.glEnable(gl.GL_DEPTH_TEST)\n    gl.glEnable(gl.GL_BLEND) # Saydaml\u0131k i\u00e7in\n    gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA)\n\n    # 3D kamera g\u00f6r\u00fcn\u00fcm\u00fc ve etkile\u015fimi\n    scam = pangolin.OpenGlRenderState(\n        pangolin.ProjectionMatrix(1024, 768, 900, 900, 512, 384, 0.1, 10000),\n        pangolin.ModelViewLookAt(-10, 5, -10, 0, 0, 0, pangolin.AxisDirection.AxisY))\n    handler = pangolin.Handler3D(scam)\n\n    dcam = pangolin.CreateDisplay()\n    dcam.SetBounds(0.0, 1.0, 0.0, 1.0, -1024.0\/768.0)\n    dcam.SetHandler(handler)\n\n    # SLAM verilerini sim\u00fcle et\n    camera_path = [] # Kamera pozlar\u0131\n    map_points = []  # Harita nokta bulutu\n    keyframes = []   # Anahtar kare pozlar\u0131\n\n    # Ortam\u0131 sim\u00fcle eden statik noktalar\n    initial_map_points = np.random.rand(5000, 3) * 20 - 10 # -10 ile 10 aras\u0131nda rastgele noktalar\n    \n    frame_count = 0\n    while not pangolin.ShouldQuit():\n        gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT)\n        gl.glClearColor(0.05, 0.05, 0.1, 1.0) # Koyu mavi arka plan\n\n        dcam.Activate(scam)\n\n        # Yeni kamera pozu sim\u00fcle et (spiral hareket)\n        t = time.time() * 0.5\n        x = 5 * np.cos(t)\n        y = 1 * np.sin(t \/ 2)\n        z = 5 * np.sin(t)\n        current_pose = np.eye(4, dtype=np.float32)\n        current_pose[:3, 3] = [x, y, z]\n        \n        # Basit bir rotasyon ekleyelim (y ekseni etraf\u0131nda)\n        rot_y = np.array([\n            [np.cos(t\/2), 0, np.sin(t\/2)],\n            [0, 1, 0],\n            [-np.sin(t\/2), 0, np.cos(t\/2)]\n        ])\n        current_pose[:3,:3] = rot_y\n\n        camera_path.append(current_pose[:3, 3])\n\n        # Her 20 karede bir anahtar kare ekle\n        if frame_count % 20 == 0:\n            keyframes.append(current_pose)\n            # Anahtar kare eklerken yeni harita noktalar\u0131 da sim\u00fcle edelim\n            new_map_points = (np.random.rand(100, 3) * 2 - 1) + current_pose[:3, 3]\n            map_points.extend(new_map_points)\n\n        # Statik ortam noktalar\u0131n\u0131 \u00e7iz (gri)\n        gl.glPointSize(1)\n        gl.glColor3f(0.5, 0.5, 0.5)\n        if len(initial_map_points) > 0:\n            pangolin.RenderCloud(initial_map_points)\n\n        # Olu\u015fan harita noktalar\u0131n\u0131 \u00e7iz (sar\u0131)\n        gl.glPointSize(2)\n        gl.glColor3f(1.0, 1.0, 0.0)\n        if len(map_points) > 0:\n            pangolin.RenderCloud(np.array(map_points))\n\n        # Kamera yolunu \u00e7iz (beyaz \u00e7izgi)\n        gl.glLineWidth(2)\n        gl.glColor3f(1.0, 1.0, 1.0)\n        pangolin.RenderLineStrip(np.array(camera_path))\n\n        # Anahtar kareleri \u00e7iz (k\u0131rm\u0131z\u0131 piramitler olarak)\n        for pose in keyframes:\n            gl.glPushMatrix() # Mevcut matris y\u0131\u011f\u0131n\u0131n\u0131 kaydet\n            gl.glMultMatrixf(pose.T.flatten()) # Pose matrisini uygula (transpose unutma)\n            pangolin.DrawCameras(1.0) # Kameray\u0131 1.0 \u00f6l\u00e7ekle \u00e7iz\n            gl.glPopMatrix() # Matris y\u0131\u011f\u0131n\u0131n\u0131 geri y\u00fckle\n\n        pangolin.FinishFrame()\n        frame_count += 1\n\nif __name__ == '__main__':\n    visualize_slam_data()\n<\/pre>\n<p><\/code><\/p>\n<p>Bu kodda, zamanla de\u011fi\u015fen bir <code>current_pose<\/code> (4x4 d\u00f6n\u00fc\u015f\u00fcm matrisi) olu\u015fturarak bir robotun hareketini sim\u00fcle ediyoruz. Bu pozdan arac\u0131n konumunu (<code>camera_path<\/code>) ve anahtar kareleri \u00e7\u0131kar\u0131yoruz. Ayr\u0131ca, her anahtar kare eklendi\u011finde etrafa yeni harita noktalar\u0131 (<code>map_points<\/code>) ekleyerek harita olu\u015fumunu taklit ediyoruz.<\/p>\n<ul>\n<li><code>pangolin.RenderCloud()<\/code>: B\u00fcy\u00fck nokta bulutlar\u0131n\u0131 verimli bir \u015fekilde \u00e7izmek i\u00e7in kullan\u0131l\u0131r.<\/li>\n<li><code>pangolin.RenderLineStrip()<\/code>: Bir dizi noktadan olu\u015fan bir yolu bir \u00e7izgi \u015feridi olarak \u00e7izer.<\/li>\n<li><code>pangolin.DrawCameras()<\/code>: Kamera frustumunu (g\u00f6r\u00fc\u015f alan\u0131n\u0131) g\u00f6rselle\u015ftirmek i\u00e7in kullan\u0131\u015fl\u0131 bir fonksiyondur. <code>gl.glMultMatrixf(pose.T.flatten())<\/code> ile kamera pozunu OpenGL matris y\u0131\u011f\u0131n\u0131na uygulayarak, kameray\u0131 kendi koordinat sisteminde \u00e7izilmesini sa\u011fl\u0131yoruz.<\/li>\n<\/ul>\n<p>Bu t\u00fcr bir g\u00f6rselle\u015ftirme, SLAM algoritmas\u0131n\u0131n hem yerelle\u015ftirme (<code>camera_path<\/code>) hem de haritalama (<code>map_points<\/code>) bile\u015fenlerini ayn\u0131 anda izlemenize olanak tan\u0131r. Otonom sistemler geli\u015ftirirken veya robotik ara\u015ft\u0131rmalar\u0131 yaparken, bu seviyede bir g\u00f6rsel geri bildirim paha bi\u00e7ilmezdir.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Projesi 2: Robotik Sim\u00fclasyonu ve Sens\u00f6r Verisi Ak\u0131\u015f\u0131n\u0131 G\u00f6rselle\u015ftirme<\/h2>\n<p>Robotik uygulamalar, genellikle sens\u00f6rlerden (IMU, LiDAR, kamera vb.) gelen ger\u00e7ek zamanl\u0131 veri ak\u0131\u015f\u0131n\u0131 ve robotun kendi yap\u0131sal modelini (iskelet veya kinetik model) g\u00f6rselle\u015ftirmeyi gerektirir. Python Pangolin, bu karma\u015f\u0131k senaryolar\u0131 ele almak i\u00e7in gereken esnekli\u011fi ve performans\u0131 sunar. Bu proje, bir robotun basit bir modelini ve sens\u00f6r verisi ak\u0131\u015f\u0131n\u0131 nas\u0131l g\u00f6rselle\u015ftirebilece\u011finizi g\u00f6sterecektir.<\/p>\n<h3>Vaka Analizi: End\u00fcstriyel Robotun Durum \u0130zlemesi<\/h3>\n<p>Bir end\u00fcstriyel robot kolunun, bir \u00fcretim hatt\u0131nda hareket etti\u011fini d\u00fc\u015f\u00fcn\u00fcn. Robotun eklemlerinin pozisyonlar\u0131n\u0131, tutucusunun (end-effector) konumunu ve belki de \u00e7evresindeki nesnelerden gelen sens\u00f6r verilerini (\u00f6rne\u011fin, \u00e7arp\u0131\u015fmadan ka\u00e7\u0131nmak i\u00e7in bir derinlik kameras\u0131) ger\u00e7ek zamanl\u0131 olarak izlemek isteyebiliriz. Pangolin, bu bilgileri tek bir interaktif 3D ortamda birle\u015ftirmemizi sa\u011flar.<\/p>\n<h3>Robot Modeli ve Sens\u00f6r Verilerini Nas\u0131l G\u00f6rselle\u015ftirebilirsiniz?<\/h3>\n<p>Bu \u00f6rnekte, basit bir iki eklemli (2-DOF) robot kolunu sim\u00fcle edece\u011fiz. Her eklemin a\u00e7\u0131lar\u0131n\u0131 de\u011fi\u015ftirece\u011fiz ve robotun tutucusunun hedefe do\u011fru nas\u0131l hareket etti\u011fini g\u00f6sterece\u011fiz. Ayr\u0131ca, robotun etraf\u0131ndaki basit bir sanal engelleyiciyi de g\u00f6rselle\u015ftirece\u011fiz.<\/p>\n<pre><code>\nimport pangolin\nimport OpenGL.GL as gl\nimport numpy as np\nimport time\n\n# Robot kolu parametreleri\nLINK_LENGTHS = [2.0, 1.5] # Eklemlerin uzunluklar\u0131\n\ndef draw_robot_arm(angle1, angle2):\n    gl.glPushMatrix() # Mevcut modelview matrisini kaydet\n\n    # Eklemler aras\u0131 ba\u011flant\u0131lar\u0131 (kollar\u0131) \u00e7iz\n    gl.glLineWidth(5)\n    gl.glColor3f(0.8, 0.2, 0.2) # K\u0131rm\u0131z\u0131ms\u0131 renk\n\n    # Eksen 1 etraf\u0131nda rotasyon\n    gl.glRotatef(np.degrees(angle1), 0.0, 0.0, 1.0) # Z ekseni etraf\u0131nda d\u00f6n\n    \n    # \u0130lk kolu \u00e7iz\n    gl.glBegin(gl.GL_LINES)\n    gl.glVertex3f(0.0, 0.0, 0.0)\n    gl.glVertex3f(LINK_LENGTHS[0], 0.0, 0.0)\n    gl.glEnd()\n\n    # \u0130kinci ekleme git\n    gl.glTranslatef(LINK_LENGTHS[0], 0.0, 0.0)\n    \n    # Eksen 2 etraf\u0131nda rotasyon (\u00f6nceki rotasyona g\u00f6re)\n    gl.glRotatef(np.degrees(angle2), 0.0, 0.0, 1.0) # Z ekseni etraf\u0131nda d\u00f6n\n\n    # \u0130kinci kolu \u00e7iz\n    gl.glBegin(gl.GL_LINES)\n    gl.glVertex3f(0.0, 0.0, 0.0)\n    gl.glVertex3f(LINK_LENGTHS[1], 0.0, 0.0)\n    gl.glEnd()\n\n    # Tutucuyu (end-effector) bir nokta olarak \u00e7iz\n    gl.glPointSize(10)\n    gl.glColor3f(0.2, 0.8, 0.2) # Ye\u015fil\n    gl.glBegin(gl.GL_POINTS)\n    gl.glVertex3f(LINK_LENGTHS[1], 0.0, 0.0)\n    gl.glEnd()\n\n    gl.glPopMatrix() # Kaydedilen matrisi geri y\u00fckle\n\ndef visualize_robot_simulation():\n    pangolin.CreateWindowAndBind('Robot Sim\u00fclasyonu', 1024, 768)\n    gl.glEnable(gl.GL_DEPTH_TEST)\n\n    scam = pangolin.OpenGlRenderState(\n        pangolin.ProjectionMatrix(1024, 768, 900, 900, 512, 384, 0.1, 1000),\n        pangolin.ModelViewLookAt(-5, 5, -5, 0, 0, 0, pangolin.AxisDirection.AxisY))\n    handler = pangolin.Handler3D(scam)\n\n    dcam = pangolin.CreateDisplay()\n    dcam.SetBounds(0.0, 1.0, 0.0, 1.0, -1024.0\/768.0)\n    dcam.SetHandler(handler)\n\n    # Robot eklem a\u00e7\u0131lar\u0131 (ba\u015flang\u0131\u00e7)\n    angle1 = 0.0\n    angle2 = 0.0\n\n    # Sanal engelleyici (k\u00fcre)\n    obstacle_pos = np.array([2.0, 1.0, 0.0])\n    obstacle_radius = 0.5\n\n    while not pangolin.ShouldQuit():\n        gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT)\n        gl.glClearColor(0.1, 0.1, 0.15, 1.0) # Koyu morumsu arka plan\n\n        dcam.Activate(scam)\n\n        # Robot eklem a\u00e7\u0131lar\u0131n\u0131 dinamik olarak de\u011fi\u015ftir\n        angle1 = np.sin(time.time() * 0.5) * np.pi \/ 2 # -90 ile +90 derece aras\u0131nda\n        angle2 = np.cos(time.time() * 0.7) * np.pi \/ 3 # -60 ile +60 derece aras\u0131nda\n\n        # Robot kolunu \u00e7iz\n        draw_robot_arm(angle1, angle2)\n\n        # Sanal engelleyiciyi \u00e7iz\n        gl.glColor3f(0.8, 0.8, 0.0) # Sar\u0131\n        pangolin.DrawSphere(obstacle_pos, obstacle_radius)\n\n        # Koordinat eksenlerini \u00e7iz\n        pangolin.DrawAxis(1.0) # 1 birim uzunlu\u011funda eksenler\n\n        pangolin.FinishFrame()\n\nif __name__ == '__main__':\n    visualize_robot_simulation()\n<\/pre>\n<p><\/code><\/p>\n<p>Bu projede, <code>draw_robot_arm<\/code> fonksiyonu, verilen eklem a\u00e7\u0131lar\u0131na g\u00f6re robot kolunu \u00e7izer. Her <code>gl.glRotatef()<\/code> ve <code>gl.glTranslatef()<\/code> \u00e7a\u011fr\u0131s\u0131, OpenGL'in matris y\u0131\u011f\u0131n\u0131na bir d\u00f6n\u00fc\u015f\u00fcm ekleyerek, bir sonraki \u00e7izim komutlar\u0131n\u0131n bu yeni koordinat sisteminde ger\u00e7ekle\u015fmesini sa\u011flar. <code>gl.glPushMatrix()<\/code> ve <code>gl.glPopMatrix()<\/code>, d\u00f6n\u00fc\u015f\u00fcmlerin belirli bir nesneye \u00f6zel kalmas\u0131n\u0131 sa\u011flar, b\u00f6ylece sahnedeki di\u011fer nesneler etkilenmez.<\/p>\n<ul>\n<li><b>Robot Modeli:<\/b> Basit \u00e7izgilerle g\u00f6sterilen iki eklemli kol. Ger\u00e7ek uygulamalarda, bu URDF (Unified Robot Description Format) gibi dosyalardan y\u00fcklenen karma\u015f\u0131k mesh modelleri olabilir.<\/li>\n<li><b>Sens\u00f6r Verisi (Sim\u00fcle Edilmi\u015f):<\/b> Burada bir engelleyici k\u00fcre (<code>pangolin.DrawSphere<\/code>) olarak sim\u00fcle edilmi\u015ftir. Ger\u00e7ek senaryolarda bu, LiDAR taramalar\u0131ndan gelen nokta bulutlar\u0131, derinlik kameras\u0131 g\u00f6r\u00fcnt\u00fcleri veya IMU'dan gelen oryantasyon verileri olabilir.<\/li>\n<li><b>Dinamik Hareket:<\/b> <code>time.time()<\/code> kullan\u0131larak eklem a\u00e7\u0131lar\u0131 s\u00fcrekli de\u011fi\u015ftirilir, bu da robot kolunun hareket etmesini sa\u011flar.<\/li>\n<\/ul>\n<p>Bu g\u00f6rselle\u015ftirme, robotik kontrol algoritmalar\u0131 geli\u015ftirirken robotun hareketini, \u00e7al\u0131\u015fma alan\u0131n\u0131 ve potansiyel \u00e7arp\u0131\u015fmalar\u0131 izlemek i\u00e7in temel bir ara\u00e7t\u0131r. \u00d6zellikle inverse kinematics (ters kinematik) \u00e7\u00f6z\u00fcmlerini test ederken veya robotun yol planlamas\u0131n\u0131 yaparken, bu t\u00fcr ger\u00e7ek zamanl\u0131 g\u00f6rsel geri bildirimler b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r.<\/p>\n<p class=\"expert-tip\">Uzman \u0130pucu: Karma\u015f\u0131k robot modelleri i\u00e7in, robotun eklemlerini ve ba\u011flant\u0131lar\u0131n\u0131 temsil eden bir \"iskelet\" yap\u0131s\u0131 tan\u0131mlayabilirsiniz. Pangolin, bu iskeleti \u00e7izmek i\u00e7in \u00e7izgiler ve k\u00fcreler gibi temel primitifleri kullanabilece\u011finiz gibi, daha detayl\u0131 modeller i\u00e7in harici dosyalardan (\u00f6rne\u011fin OBJ, STL) 3D meshleri de y\u00fcklemenize olanak tan\u0131r.<\/p>\n<h2>\u0130leri D\u00fczey Pangolin Kullan\u0131m\u0131 ve Performans Optimizasyonu \u0130pu\u00e7lar\u0131 Nelerdir?<\/h2>\n<p>Pangolin, kutudan \u00e7\u0131kt\u0131\u011f\u0131 haliyle zaten olduk\u00e7a performansl\u0131d\u0131r, ancak b\u00fcy\u00fck veri setleri veya \u00e7ok karma\u015f\u0131k sahnelerle \u00e7al\u0131\u015f\u0131rken performans\u0131 daha da art\u0131rmak i\u00e7in baz\u0131 ileri d\u00fczey teknikler ve optimizasyon stratejileri mevcuttur. Bu b\u00f6l\u00fcmde, Pangolin uygulamalar\u0131n\u0131z\u0131n potansiyelini maksimize etmek i\u00e7in kullanabilece\u011finiz baz\u0131 ipu\u00e7lar\u0131na de\u011finece\u011fiz.<\/p>\n<h3>GPU H\u0131zland\u0131rma ve Vertex Buffer Objects (VBO'lar) Nas\u0131l Kullan\u0131l\u0131r?<\/h3>\n<p>OpenGL'in en \u00f6nemli performans \u00f6zelliklerinden biri, verileri do\u011frudan grafik kart\u0131n\u0131n belle\u011fine (GPU) y\u00fckleyerek CPU-GPU aras\u0131ndaki veri transferini minimize eden Vertex Buffer Objects (VBO'lar) kullan\u0131m\u0131d\u0131r. \u00d6zellikle b\u00fcy\u00fck nokta bulutlar\u0131 veya meshler \u00e7izerken, her karede CPU'dan GPU'ya veri g\u00f6ndermek yerine, veriyi bir kez GPU'ya y\u00fckleyip sonra sadece referansla \u00e7izmek \u00e7ok daha h\u0131zl\u0131d\u0131r.<\/p>\n<p>Pangolin, bu soyutlamay\u0131 <code>pangolin.GlBuffer<\/code> s\u0131n\u0131f\u0131 arac\u0131l\u0131\u011f\u0131yla sa\u011flar. A\u015fa\u011f\u0131daki \u00f6rnek, bir nokta bulutunu VBO kullanarak nas\u0131l \u00e7izece\u011finizi g\u00f6sterir:<\/p>\n<pre><code>\nimport pangolin\nimport OpenGL.GL as gl\nimport numpy as np\n\ndef draw_with_vbo():\n    pangolin.CreateWindowAndBind('VBO ile \u00c7izim', 640, 480)\n    gl.glEnable(gl.GL_DEPTH_TEST)\n\n    scam = pangolin.OpenGlRenderState(\n        pangolin.ProjectionMatrix(640, 480, 420, 420, 320, 240, 0.1, 1000),\n        pangolin.ModelViewLookAt(-2, 2, -2, 0, 0, 0, pangolin.AxisDirection.AxisY))\n    handler = pangolin.Handler3D(scam)\n\n    dcam = pangolin.CreateDisplay()\n    dcam.SetBounds(0.0, 1.0, 0.0, 1.0, -640.0\/480.0)\n    dcam.SetHandler(handler)\n\n    # 1 milyon rastgele nokta olu\u015ftur\n    points = np.random.rand(1_000_000, 3).astype(np.float32) * 5 - 2.5\n    colors = np.random.rand(1_000_000, 3).astype(np.float32) # Her noktaya rastgele renk\n\n    # Noktalar\u0131 ve renkleri VBO'lara y\u00fckle\n    point_vbo = pangolin.GlBuffer(gl.GL_ARRAY_BUFFER, points, gl.GL_STATIC_DRAW)\n    color_vbo = pangolin.GlBuffer(gl.GL_ARRAY_BUFFER, colors, gl.GL_STATIC_DRAW)\n\n    while not pangolin.ShouldQuit():\n        gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT)\n        gl.glClearColor(0.1, 0.1, 0.1, 1.0)\n\n        dcam.Activate(scam)\n\n        gl.glPointSize(1)\n\n        # VBO'lar\u0131 ba\u011fla ve \u00e7iz\n        gl.glEnableClientState(gl.GL_VERTEX_ARRAY)\n        gl.glEnableClientState(gl.GL_COLOR_ARRAY)\n\n        point_vbo.Bind()\n        gl.glVertexPointer(3, gl.GL_FLOAT, 0, None) # 3 bile\u015fenli float koordinatlar\n\n        color_vbo.Bind()\n        gl.glColorPointer(3, gl.GL_FLOAT, 0, None) # 3 bile\u015fenli float renkler\n\n        gl.glDrawArrays(gl.GL_POINTS, 0, points.shape[0]) # T\u00fcm noktalar\u0131 \u00e7iz\n\n        point_vbo.Unbind()\n        color_vbo.Unbind()\n\n        gl.glDisableClientState(gl.GL_COLOR_ARRAY)\n        gl.glDisableClientState(gl.GL_VERTEX_ARRAY)\n\n        pangolin.FinishFrame()\n\nif __name__ == '__main__':\n    draw_with_vbo()\n<\/pre>\n<p><\/code><\/p>\n<p>Bu kodda, <code>pangolin.GlBuffer<\/code> ile NumPy dizilerini do\u011frudan GPU'ya y\u00fckl\u00fcyoruz. <code>gl.GL_STATIC_DRAW<\/code>, verinin genellikle de\u011fi\u015fmeyece\u011fini belirtir, bu da OpenGL'in belle\u011fi buna g\u00f6re optimize etmesine olanak tan\u0131r. Daha sonra <code>gl.glVertexPointer<\/code> ve <code>gl.glColorPointer<\/code> ile VBO'daki verilerin nas\u0131l yorumlanaca\u011f\u0131n\u0131 belirtip, <code>gl.glDrawArrays<\/code> ile t\u00fcm noktalar\u0131 tek bir OpenGL \u00e7a\u011fr\u0131s\u0131yla \u00e7iziyoruz. Bu y\u00f6ntem, \u00f6zellikle dinamik olmayan ancak \u00e7ok b\u00fcy\u00fck veri setleri i\u00e7in CPU y\u00fck\u00fcn\u00fc \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r.<\/p>\n<h3>Asenkron G\u00f6rselle\u015ftirme ve \u00c7oklu \u0130\u015f Par\u00e7ac\u0131klar\u0131 (Multithreading)<\/h3>\n<p>Karma\u015f\u0131k uygulamalarda, 3D g\u00f6rselle\u015ftirme mant\u0131\u011f\u0131 genellikle veri i\u015fleme veya algoritmalar\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 ana i\u015f par\u00e7ac\u0131\u011f\u0131ndan ayr\u0131lmal\u0131d\u0131r. Pangolin, <code>pangolin.Set.SetDrawFunction<\/code> veya bir callback fonksiyonu kullanarak bu ayr\u0131m\u0131 kolayla\u015ft\u0131rabilir. Daha ileri d\u00fczey senaryolarda, ayr\u0131 bir i\u015f par\u00e7ac\u0131\u011f\u0131nda g\u00f6rselle\u015ftirme penceresini ba\u015flatarak, ana program\u0131n kendi h\u0131z\u0131nda \u00e7al\u0131\u015fmas\u0131na devam etmesini sa\u011flayabilirsiniz.<\/p>\n<p class=\"expert-tip\">Uzman \u0130pucu: \u00c7oklu i\u015f par\u00e7ac\u0131\u011f\u0131 kullan\u0131rken, payla\u015f\u0131lan verilere (\u00f6rne\u011fin, g\u00fcncellenen nokta bulutlar\u0131) eri\u015firken kilitleme (locking) mekanizmalar\u0131n\u0131 kullanmay\u0131 unutmay\u0131n. Aksi takdirde, veri tutars\u0131zl\u0131klar\u0131 veya \u00e7\u00f6klemeler meydana gelebilir.<\/p>\n<h3>C++ Entegrasyonuna K\u0131sa Bir Bak\u0131\u015f (Performans Darbo\u011fazlar\u0131 \u0130\u00e7in)<\/h3>\n<p>Python Pangolin ba\u011flamalar\u0131 genellikle \u00e7o\u011fu senaryo i\u00e7in yeterli performans\u0131 sunar. Ancak, e\u011fer \u00e7ok y\u00fcksek frekansl\u0131 veri ak\u0131\u015flar\u0131, karma\u015f\u0131k g\u00f6lgelendiriciler (shaders) veya \u00f6zel OpenGL uzant\u0131lar\u0131na ihtiya\u00e7 duyuyorsan\u0131z, Pangolin'in temel C++ k\u00fct\u00fcphanesini kullanmay\u0131 d\u00fc\u015f\u00fcnebilirsiniz. Python, bu C++ bile\u015fenleriyle entegre olabilir (\u00f6rne\u011fin, Pybind11 veya CFFI gibi ara\u00e7larla), b\u00f6ylece performans kritik k\u0131s\u0131mlar C++'da yaz\u0131l\u0131rken, uygulaman\u0131n geri kalan\u0131 Python'da kalabilir. Bu hibrit yakla\u015f\u0131m, hem geli\u015ftirme h\u0131z\u0131 hem de nihai performans a\u00e7\u0131s\u0131ndan en iyiye ula\u015fman\u0131z\u0131 sa\u011flayabilir.<\/p>\n<p>Bu ileri d\u00fczey teknikler, Pangolin uygulamalar\u0131n\u0131z\u0131n sadece i\u015flevsel de\u011fil, ayn\u0131 zamanda en talepkar senaryolarda bile h\u0131zl\u0131 ve ak\u0131c\u0131 olmas\u0131n\u0131 sa\u011flar. Do\u011fru optimizasyon stratejileriyle, Pangolin'in potansiyelini tam olarak kullanabilir ve ola\u011fan\u00fcst\u00fc 3D g\u00f6rselle\u015ftirme deneyimleri yaratabilirsiniz.<\/p>\n<h2>Sonu\u00e7: Python Pangolin API'nin Gelece\u011fi ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Python Pangolin API, robotik, otonom sistemler ve bilgisayar g\u00f6r\u00fc\u015f\u00fc gibi alanlarda 3D g\u00f6rselle\u015ftirme ve kullan\u0131c\u0131 aray\u00fcz\u00fc ihtiya\u00e7lar\u0131n\u0131 kar\u015f\u0131lamak i\u00e7in g\u00fc\u00e7l\u00fc, esnek ve y\u00fcksek performansl\u0131 bir \u00e7\u00f6z\u00fcm sunar. Bu kapsaml\u0131 rehber boyunca, Pangolin'in temel kurulumundan ba\u015flayarak, karma\u015f\u0131k 3D nesneleri \u00e7izmeye, interaktif GUI elemanlar\u0131 olu\u015fturmaya ve iki ger\u00e7ek d\u00fcnya projesiyle SLAM \u00e7\u0131kt\u0131s\u0131 ve robotik sim\u00fclasyonlar\u0131n\u0131 g\u00f6rselle\u015ftirmeye kadar bir\u00e7ok konuyu ele ald\u0131k. Ayr\u0131ca, performans optimizasyonu i\u00e7in ileri d\u00fczey ipu\u00e7lar\u0131 ve VBO'lar gibi teknikleri de inceledik. Pangolin'in OpenGL tabanl\u0131 yap\u0131s\u0131 ve C++'dan gelen performans\u0131, Python'\u0131n kullan\u0131m kolayl\u0131\u011f\u0131yla birle\u015ferek geli\u015ftiricilere benzersiz bir ara\u00e7 seti sunar.<\/p>\n<p>Pangolin'in gelece\u011fi, \u00f6zellikle ger\u00e7ek zamanl\u0131 3D uygulamalar\u0131n artan talebiyle parlak g\u00f6r\u00fcnmektedir. Sanal ve art\u0131r\u0131lm\u0131\u015f ger\u00e7eklik, daha karma\u015f\u0131k robotik g\u00f6revler ve daha b\u00fcy\u00fck sens\u00f6r veri setleri, Pangolin gibi y\u00fcksek performansl\u0131 g\u00f6rselle\u015ftirme k\u00fct\u00fcphanelerine olan ihtiyac\u0131 daha da art\u0131racakt\u0131r. A\u00e7\u0131k kaynak yap\u0131s\u0131, aktif toplulu\u011fu ve s\u00fcrekli geli\u015fimi sayesinde Pangolin, bu alanlarda lider bir ara\u00e7 olarak konumunu koruyacakt\u0131r. Bu rehberin, Python projelerinize 3D g\u00f6rselle\u015ftirme g\u00fcc\u00fc katman\u0131z i\u00e7in size ilham verdi\u011fini ve yol g\u00f6sterdi\u011fini umuyoruz.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<h4>Pangolin API hangi t\u00fcr projeler i\u00e7in en uygunudur?<\/h4>\n<p>Pangolin, \u00f6zellikle robotik, otonom ara\u00e7lar, SLAM (Simultaneous Localization and Mapping), bilgisayar g\u00f6r\u00fc\u015f\u00fc ve 3D sens\u00f6r verisi (LiDAR, derinlik kameralar\u0131) g\u00f6rselle\u015ftirme gibi ger\u00e7ek zamanl\u0131 ve y\u00fcksek performansl\u0131 3D uygulamalar i\u00e7in en uygunudur. Ayr\u0131ca, algoritmalar\u0131n parametrelerini dinamik olarak ayarlamak i\u00e7in interaktif kullan\u0131c\u0131 aray\u00fczleri gerektiren projelerde de olduk\u00e7a etkilidir.<\/p>\n<h4>Pangolin, Python'daki di\u011fer 3D g\u00f6rselle\u015ftirme k\u00fct\u00fcphanelerinden (\u00f6rne\u011fin Mayavi, pyqtgraph) nas\u0131l farkl\u0131la\u015f\u0131r?<\/h4>\n<p>Pangolin, do\u011frudan OpenGL \u00fczerinde \u00e7al\u0131\u015fmas\u0131 ve C++ k\u00f6kenli olmas\u0131 nedeniyle genellikle daha y\u00fcksek performans sunar, bu da onu b\u00fcy\u00fck 3D veri setleri ve ger\u00e7ek zamanl\u0131 uygulamalar i\u00e7in ideal k\u0131lar. Odak noktas\u0131 daha \u00e7ok bilgisayar g\u00f6r\u00fc\u015f\u00fc ve robotik alan\u0131ndaki spesifik ihtiya\u00e7lara y\u00f6neliktir (\u00f6rn. kamera frustumlar\u0131, d\u00f6n\u00fc\u015f\u00fcm matrisleriyle do\u011frudan \u00e7al\u0131\u015fma). Di\u011fer k\u00fct\u00fcphaneler daha genel ama\u00e7l\u0131 olabilirken, Pangolin'in optimize edilmi\u015f yap\u0131s\u0131 bu \u00f6zel alanlarda \u00fcst\u00fcnl\u00fck sa\u011flar.<\/p>\n<h4>Pangolin ile web tabanl\u0131 3D g\u00f6rselle\u015ftirme yapmak m\u00fcmk\u00fcn m\u00fcd\u00fcr?<\/h4>\n<p>Hay\u0131r, Pangolin do\u011frudan web tabanl\u0131 bir k\u00fct\u00fcphane de\u011fildir. Masa\u00fcst\u00fc uygulamalar\u0131 i\u00e7in tasarlanm\u0131\u015ft\u0131r ve OpenGL grafik ba\u011flam\u0131na ihtiya\u00e7 duyar. Web tabanl\u0131 3D g\u00f6rselle\u015ftirmeler i\u00e7in Three.js veya Babylon.js gibi JavaScript k\u00fct\u00fcphaneleri, ya da Python taraf\u0131nda Dash\/Plotly gibi ara\u00e7lar\u0131n WebGL entegrasyonlar\u0131 kullan\u0131lmal\u0131d\u0131r. Pangolin'i bir sunucu taraf\u0131nda \u00e7al\u0131\u015ft\u0131r\u0131p g\u00f6r\u00fcnt\u00fcleri ak\u0131\u015fla g\u00f6ndermek gibi dolayl\u0131 y\u00f6ntemler teorik olarak m\u00fcmk\u00fcn olsa da, k\u00fct\u00fcphanenin as\u0131l kullan\u0131m amac\u0131 bu de\u011fildir.<\/p>\n<h4>Pangolin uygulamalar\u0131m\u0131n performans\u0131n\u0131 nas\u0131l optimize edebilirim?<\/h4>\n<p>Performans optimizasyonu i\u00e7in birka\u00e7 y\u00f6ntem bulunmaktad\u0131r:<\/p>\n<ol>\n<li><b>Vertex Buffer Objects (VBO'lar) kullan\u0131n:<\/b> B\u00fcy\u00fck statik veya nadiren de\u011fi\u015fen 3D verileri (nokta bulutlar\u0131, meshler) do\u011frudan GPU belle\u011fine y\u00fckleyerek CPU-GPU transferini minimize edin.<\/li>\n<li><b>Gereksiz \u00e7izimlerden ka\u00e7\u0131n\u0131n:<\/b> Sadece g\u00f6r\u00fcn\u00fcr veya \u00f6nemli olan nesneleri \u00e7izin.<\/li>\n<li><b>\u00c7oklu i\u015f par\u00e7ac\u0131\u011f\u0131 kullan\u0131n:<\/b> 3D g\u00f6rselle\u015ftirme mant\u0131\u011f\u0131n\u0131, veri i\u015fleme veya algoritma hesaplamalar\u0131n\u0131n yap\u0131ld\u0131\u011f\u0131 ana i\u015f par\u00e7ac\u0131\u011f\u0131ndan ay\u0131r\u0131n.<\/li>\n<li><b>OpenGL durum de\u011fi\u015fikliklerini minimize edin:<\/b> Renk veya \u00e7izim modu gibi OpenGL durumlar\u0131n\u0131 s\u0131k s\u0131k de\u011fi\u015ftirmek performans\u0131 etkileyebilir. Benzer durumdaki nesneleri birlikte \u00e7izin.<\/li>\n<\/ol>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Karma\u015f\u0131k 3D verileri h\u0131zl\u0131 ve etkile\u015fimli bir \u015fekilde g\u00f6rselle\u015ftirmek mi istiyorsunuz? \u00d6zellikle robotik, otonom sistemler veya bilgisayar g\u00f6r\u00fc\u015f\u00fc&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1403],"tags":[],"class_list":{"0":"post-36203","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-python","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Python Pangolin API: Kapsaml\u0131 Rehber &amp; Ger\u00e7ek D\u00fcnya Projeleri<\/title>\n<meta name=\"description\" content=\"Karma\u015f\u0131k 3D verileri h\u0131zl\u0131 ve etkile\u015fimli bir \u015fekilde g\u00f6rselle\u015ftirmek mi istiyorsunuz? \u00d6zellikle robotik, otonom sistemler veya bilgisayar g\u00f6r\u00fc\u015f\u00fc alan\u0131nda \u00e7al\u0131\u015f\u0131yorsan\u0131z, bu s\u00fcrekli bir m\u00fccadeledir. Python Pangolin API, bu zorlu\u011fa g\u00fc\u00e7l\u00fc ve esnek bir \u00e7\u00f6z\u00fcm sunarak, geli\u015ftiricilerin ger\u00e7ek zamanl\u0131 3D g\u00f6rselle\u015ftirmeler ve zengin kullan\u0131c\u0131 aray\u00fczleri olu\u015fturmas\u0131na olanak tan\u0131r. Bu rehberde, Pangolin&#039;in temel kavramlar\u0131ndan ba\u015flayarak, 15&#039;ten fazla kod \u00f6rne\u011fi ve iki ger\u00e7ek d\u00fcnya projesiyle bu g\u00fc\u00e7l\u00fc k\u00fct\u00fcphaneyi nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m \u00f6\u011freneceksiniz.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/python-pangolin-api-kapsamli-rehber-gercek-dunya-projeleri\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Python Pangolin API: Kapsaml\u0131 Rehber &amp; Ger\u00e7ek D\u00fcnya Projeleri\" \/>\n<meta property=\"og:description\" content=\"Karma\u015f\u0131k 3D verileri h\u0131zl\u0131 ve etkile\u015fimli bir \u015fekilde g\u00f6rselle\u015ftirmek mi istiyorsunuz? \u00d6zellikle robotik, otonom sistemler veya bilgisayar g\u00f6r\u00fc\u015f\u00fc alan\u0131nda \u00e7al\u0131\u015f\u0131yorsan\u0131z, bu s\u00fcrekli bir m\u00fccadeledir. Python Pangolin API, bu zorlu\u011fa g\u00fc\u00e7l\u00fc ve esnek bir \u00e7\u00f6z\u00fcm sunarak, geli\u015ftiricilerin ger\u00e7ek zamanl\u0131 3D g\u00f6rselle\u015ftirmeler ve zengin kullan\u0131c\u0131 aray\u00fczleri olu\u015fturmas\u0131na olanak tan\u0131r. Bu rehberde, Pangolin&#039;in temel kavramlar\u0131ndan ba\u015flayarak, 15&#039;ten fazla kod \u00f6rne\u011fi ve iki ger\u00e7ek d\u00fcnya projesiyle bu g\u00fc\u00e7l\u00fc k\u00fct\u00fcphaneyi nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m \u00f6\u011freneceksiniz.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/python-pangolin-api-kapsamli-rehber-gercek-dunya-projeleri\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-10T08:01:17+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"29 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-pangolin-api-kapsamli-rehber-gercek-dunya-projeleri\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-pangolin-api-kapsamli-rehber-gercek-dunya-projeleri\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Python Pangolin API: Kapsaml\u0131 Rehber &#038; Ger\u00e7ek D\u00fcnya Projeleri\",\"datePublished\":\"2025-12-10T08:01:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-pangolin-api-kapsamli-rehber-gercek-dunya-projeleri\/\"},\"wordCount\":3896,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Python\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/python-pangolin-api-kapsamli-rehber-gercek-dunya-projeleri\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-pangolin-api-kapsamli-rehber-gercek-dunya-projeleri\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/python-pangolin-api-kapsamli-rehber-gercek-dunya-projeleri\/\",\"name\":\"Python Pangolin API: Kapsaml\u0131 Rehber & Ger\u00e7ek D\u00fcnya Projeleri\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-10T08:01:17+00:00\",\"description\":\"Karma\u015f\u0131k 3D verileri h\u0131zl\u0131 ve etkile\u015fimli bir \u015fekilde g\u00f6rselle\u015ftirmek mi istiyorsunuz? \u00d6zellikle robotik, otonom sistemler veya bilgisayar g\u00f6r\u00fc\u015f\u00fc alan\u0131nda \u00e7al\u0131\u015f\u0131yorsan\u0131z, bu s\u00fcrekli bir m\u00fccadeledir. Python Pangolin API, bu zorlu\u011fa g\u00fc\u00e7l\u00fc ve esnek bir \u00e7\u00f6z\u00fcm sunarak, geli\u015ftiricilerin ger\u00e7ek zamanl\u0131 3D g\u00f6rselle\u015ftirmeler ve zengin kullan\u0131c\u0131 aray\u00fczleri olu\u015fturmas\u0131na olanak tan\u0131r. Bu rehberde, Pangolin'in temel kavramlar\u0131ndan ba\u015flayarak, 15'ten fazla kod \u00f6rne\u011fi ve iki ger\u00e7ek d\u00fcnya projesiyle bu g\u00fc\u00e7l\u00fc k\u00fct\u00fcphaneyi nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m \u00f6\u011freneceksiniz.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-pangolin-api-kapsamli-rehber-gercek-dunya-projeleri\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/python-pangolin-api-kapsamli-rehber-gercek-dunya-projeleri\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-pangolin-api-kapsamli-rehber-gercek-dunya-projeleri\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Python Pangolin API: Kapsaml\u0131 Rehber &#038; Ger\u00e7ek D\u00fcnya Projeleri\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Python Pangolin API: Kapsaml\u0131 Rehber & Ger\u00e7ek D\u00fcnya Projeleri","description":"Karma\u015f\u0131k 3D verileri h\u0131zl\u0131 ve etkile\u015fimli bir \u015fekilde g\u00f6rselle\u015ftirmek mi istiyorsunuz? \u00d6zellikle robotik, otonom sistemler veya bilgisayar g\u00f6r\u00fc\u015f\u00fc alan\u0131nda \u00e7al\u0131\u015f\u0131yorsan\u0131z, bu s\u00fcrekli bir m\u00fccadeledir. Python Pangolin API, bu zorlu\u011fa g\u00fc\u00e7l\u00fc ve esnek bir \u00e7\u00f6z\u00fcm sunarak, geli\u015ftiricilerin ger\u00e7ek zamanl\u0131 3D g\u00f6rselle\u015ftirmeler ve zengin kullan\u0131c\u0131 aray\u00fczleri olu\u015fturmas\u0131na olanak tan\u0131r. Bu rehberde, Pangolin'in temel kavramlar\u0131ndan ba\u015flayarak, 15'ten fazla kod \u00f6rne\u011fi ve iki ger\u00e7ek d\u00fcnya projesiyle bu g\u00fc\u00e7l\u00fc k\u00fct\u00fcphaneyi nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m \u00f6\u011freneceksiniz.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/python-pangolin-api-kapsamli-rehber-gercek-dunya-projeleri\/","og_locale":"tr_TR","og_type":"article","og_title":"Python Pangolin API: Kapsaml\u0131 Rehber & Ger\u00e7ek D\u00fcnya Projeleri","og_description":"Karma\u015f\u0131k 3D verileri h\u0131zl\u0131 ve etkile\u015fimli bir \u015fekilde g\u00f6rselle\u015ftirmek mi istiyorsunuz? \u00d6zellikle robotik, otonom sistemler veya bilgisayar g\u00f6r\u00fc\u015f\u00fc alan\u0131nda \u00e7al\u0131\u015f\u0131yorsan\u0131z, bu s\u00fcrekli bir m\u00fccadeledir. Python Pangolin API, bu zorlu\u011fa g\u00fc\u00e7l\u00fc ve esnek bir \u00e7\u00f6z\u00fcm sunarak, geli\u015ftiricilerin ger\u00e7ek zamanl\u0131 3D g\u00f6rselle\u015ftirmeler ve zengin kullan\u0131c\u0131 aray\u00fczleri olu\u015fturmas\u0131na olanak tan\u0131r. Bu rehberde, Pangolin'in temel kavramlar\u0131ndan ba\u015flayarak, 15'ten fazla kod \u00f6rne\u011fi ve iki ger\u00e7ek d\u00fcnya projesiyle bu g\u00fc\u00e7l\u00fc k\u00fct\u00fcphaneyi nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m \u00f6\u011freneceksiniz.","og_url":"https:\/\/fatihsoysal.com\/blog\/python-pangolin-api-kapsamli-rehber-gercek-dunya-projeleri\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-10T08:01:17+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"29 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/python-pangolin-api-kapsamli-rehber-gercek-dunya-projeleri\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/python-pangolin-api-kapsamli-rehber-gercek-dunya-projeleri\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Python Pangolin API: Kapsaml\u0131 Rehber &#038; Ger\u00e7ek D\u00fcnya Projeleri","datePublished":"2025-12-10T08:01:17+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/python-pangolin-api-kapsamli-rehber-gercek-dunya-projeleri\/"},"wordCount":3896,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Python"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/python-pangolin-api-kapsamli-rehber-gercek-dunya-projeleri\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/python-pangolin-api-kapsamli-rehber-gercek-dunya-projeleri\/","url":"https:\/\/fatihsoysal.com\/blog\/python-pangolin-api-kapsamli-rehber-gercek-dunya-projeleri\/","name":"Python Pangolin API: Kapsaml\u0131 Rehber & Ger\u00e7ek D\u00fcnya Projeleri","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-10T08:01:17+00:00","description":"Karma\u015f\u0131k 3D verileri h\u0131zl\u0131 ve etkile\u015fimli bir \u015fekilde g\u00f6rselle\u015ftirmek mi istiyorsunuz? \u00d6zellikle robotik, otonom sistemler veya bilgisayar g\u00f6r\u00fc\u015f\u00fc alan\u0131nda \u00e7al\u0131\u015f\u0131yorsan\u0131z, bu s\u00fcrekli bir m\u00fccadeledir. Python Pangolin API, bu zorlu\u011fa g\u00fc\u00e7l\u00fc ve esnek bir \u00e7\u00f6z\u00fcm sunarak, geli\u015ftiricilerin ger\u00e7ek zamanl\u0131 3D g\u00f6rselle\u015ftirmeler ve zengin kullan\u0131c\u0131 aray\u00fczleri olu\u015fturmas\u0131na olanak tan\u0131r. Bu rehberde, Pangolin'in temel kavramlar\u0131ndan ba\u015flayarak, 15'ten fazla kod \u00f6rne\u011fi ve iki ger\u00e7ek d\u00fcnya projesiyle bu g\u00fc\u00e7l\u00fc k\u00fct\u00fcphaneyi nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m \u00f6\u011freneceksiniz.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/python-pangolin-api-kapsamli-rehber-gercek-dunya-projeleri\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/python-pangolin-api-kapsamli-rehber-gercek-dunya-projeleri\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/python-pangolin-api-kapsamli-rehber-gercek-dunya-projeleri\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Python Pangolin API: Kapsaml\u0131 Rehber &#038; Ger\u00e7ek D\u00fcnya Projeleri"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36203","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=36203"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36203\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36203"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36203"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36203"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}