Binary STL Dosya okuma ve goruntuleme

Başlatan Zoroaster, 21 Mayıs 2017, 13:05:58

Zoroaster

3D modellerde kullanilan STL dosyayi anlamaya calisiyorum fakat bir sey anlamadim.

Konu hakkinda calismasi olan varmi?

Seytan deliginden kacti.

bocek

1 ya da 0. işte 'bit'ün mesele..

Zoroaster

Vertexleri kafam da canlandırıyorum da Normal vektörünü anlamadım. Ne işe yarayacak bu normal vektörü?
Seytan deliginden kacti.

mufitsozen

Alıntı Yap1- A normal vector (3 floats) so that identifying the inside and outside of the triangular mesh is easy
--------------------------------------------------------------------
In geometry, a normal is an object such as a line or vector that is perpendicular to a given object. For example, in the two-dimensional case, the normal line to a curve at a given point is the line perpendicular to the tangent line to the curve at the point.

yani
Alıntı Yap1- Normal bir vektör, böylece üçgen örgünün iç ve dışını tanımlamak kolaydır
-------------------------------------------------- ------------------
Geometride "normal", belirli bir nesneye dik olan bir çizgi veya vektör gibi bir nesnedir. Örneğin, iki boyutlu durumda, belirli bir noktadaki bir eğriye ait normal çizgi, eğik çizginin teğet çizgisine dik olan çizgidir.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

Zoroaster

#4


Normal vektörüne ait verileri burada nasıl yorumlamam gerektiğini anlamadım.

Resimde soldaki görüntüyü, STL dosyayı profesyonel bir programla açtığımda elde ediyorum.
Sağdaki görüntü ise benim yazdığım ve normal vektörlerinin dikkate alınmadan çizildiği programa ait.


Edit: Normal vektoru, cizilen ucgen yuzeyine dik dogrultuda plastik olup olmadigini soyluyor. Fakat bu yorumu sadece basit nesneler (kup vs) icin kolayca anlayabiliyoruz. Resimdeki gibi karmasik bir nesnede normal vektoru ne amacla kullanacagimi hala anlamis degilim.

Amacim soldaki resimdeki gibi kaliteli bir gorsel elde etmek degil. Orada golgeleme vs bir suru islem yapilmis. Benim derdim stl dosyadan kendi G kodlarimi uretecek yazilim yapmak.

Fakat hic kolay bir is gibi durmuyor.
Seytan deliginden kacti.

engerex

Şekli kat kat işleyeceğin için sanırım önce dilimleme yapman gerekiyor. İstediğin ölçülerde dilimleme yapabiliyor musun?

bocek

#6
Hocam başka bir şey ararken şuna rastladım: Belki işinize yarar. Normal vektörün ne işe yaradığını anlatıyor.

https://www.khanacademy.org/math/linear-algebra/vectors-and-spaces/dot-cross-products/v/defining-a-plane-in-r3-with-a-point-and-normal-vector

Ekleme:
Anladığım kadarıyla 3-boyutlu uzayda bir düzlemi tanımlamak için bir nokta ve o yüzeyin normal vektörü yeterli.
STL formatında ise normal vektörü aynı olan üçgenlerin aynı düzlemde olduğunu anlıyoruz. Bu bilgi ne işimize yarıyor bilmiyorum.
Belki gölgelendirmede ya da dilimlemede her bir üçgen için ayrı hesap yapmaya gerek kalmamasını sağlıyordur.
1 ya da 0. işte 'bit'ün mesele..

Zoroaster

Alıntı yapılan: engerex - 24 Mayıs 2017, 16:25:03
Şekli kat kat işleyeceğin için sanırım önce dilimleme yapman gerekiyor. İstediğin ölçülerde dilimleme yapabiliyor musun?


Normal vektörü anlamadan dilimleme işine girersem yanlış olur.
Seytan deliginden kacti.

bocek

Dilimleme işleminde katman yüzeyi ile şekle ait üçgen yüzeyin kesişip kesişmediğini anlamak, kesişiyorsa kesişim çizgisinin koordinatlarını hesaplamak için üçgen yüzeyin tanımına ihtiyacınız var.
O tanım normal vektörden çıkarılıyor.
İki yüzeyin kesişimini hesaplama yöntemlerine bakarsanız normal vektörleri kullanarak bu işlem yapılabiliyor.

Aslında üçgenin 3 noktasından normal vektörü kendimiz de hesaplayabiliyoruz ama binlerce üçgenin olduğu bir objede bu işlem gereksiz kaynak harcanmasına yol açıyor. Bu yüzden STL dosya yazılırken normal vektörü de yazılıyor ki işler hızlı yürüsün. Dosyayı yazan programın elinde zaten normal vektörü hesaplanmış bulunuyor belki de.

Normal vektörleri aynı olan üçgenler de aynı düzlemde olmuş oluyor. Bu da hesap kolaylığı ve görselleştirmede güzellik sağlıyor aynı zamanda.

Bunlar biraz araştırınca benim anladıklarım. Yanlışlarım olabilir.
1 ya da 0. işte 'bit'ün mesele..

engerex


İstediğin katıları tespit etmekse,


Normalde nasıl yapılıyor bilemiyorum ama şöyle bir şey söyleyebilirim.


Küpümüz var. Bir yüzeyi 2 üçgenden oluşuyor. Bir üçgenin merkezinden yüzeye dik sonsuza giden bir doğru çizdik. Herhangi bir başka üçgeni kesti mi?


Hayır: demek ki yüzeyin bu tarafı boş.


Evet: bir yüzeyi kesti. Demek ki bu taraf dolu.




Bu işlemi tüm üçgenler için uygulayacak mıyız? Hayır. Birbiri ile bağlantılı tüm poligonlarda bu veriyi kullanabiliriz.

Zoroaster

@bocek : Evet yazdıkların çok mantıklı. İki yüzeyin kesişme koordinatlarını bulmalıyım ki G kodları için gerekli konum bilgilerini üretebileyim.

--------------------------------

İki yüzeyin kesişme noktalarının bulunması ile ilgili karşılaştığınız site sayfalarını da link yazarsanız sevinirim.

Öğrencilik yıllarımda vektörlerden nefret ederdim. Çok da anlamazdım. Amaç sınavı geçecek kadar ezbere iş yapmaktan ibaretti.

Düzlemlerle ilgili örnek yaptığımızı bile hatırlamıyorum. Tekrar öğrencilik yıllarına dönmek gerekecek.

Seytan deliginden kacti.


bocek

Verdiğiniz linkte bir çok şey anlatılmış zaten de.
Ben olsam şöyle yapardım:

Katman katman ilerleyeceğimize göre: o anki katmanımızın yüksekliğine z dersek.
Sırasıyla bütün üçgenleri işleme sokarak katman yüzeyimizle kesişip kesişmediğine bakacağız.

Üçgenin köşe noktalarına t1(x1,y1,z1),  t2(x2,y2,z2), t3(x3,y3,z3) dersek.
z1, z2, ve z3'ün üçü de z'nin altındaysa artık bu üçgeni hayatımızdan çıkartabiliriz çünkü katmanın altında kalmış, işi bitmiş.
z1,z2 ve z3'ün üçü birden z'den büyükse şu anda bir işimiz yok bununla da.
z1,z2 ve z3'ün bir veya ikisi z'nin altında, bir veya ikisi z'nin üstündeyse katmanımızla üçgenimiz kesişiyor demektir.

Kesişim çizgisinin  bulmak için ise sırasıyla "line-plane intersection" algoritmasını üçgenin üç kenarına uygulayacağız.
"line-plane intersection algorithm" (ve daha fazlası)
şuradan ulaştığımız
https://stackoverflow.com/questions/5666222/3d-line-plane-intersection
şu sayfada var:
https://developer.blender.org/diffusion/B/browse/master/source/blender/blenlib/intern/math_geom.c;6856ea06425357921bd9a7e5089c2f2adbf1413a$1352

Bulduğumuz "line"ları havuza atacağız.
Bütün üçgenlerle işimiz bittikten sonra havuza attığımız kesişim "line"larını tek tek ele alıp uçları aynı noktada olanları uç-uca ekleyip kapalı-polyline'ları elde edeceğiz.
Bulduğumuz kapalı-polyline'ları da bir havuzda topladıktan sonra bunları da değerlendirmeye sokacağız;
- Sonuçta tek bir polyline var ise sorun yok, içini doldur gitsin.
- Bir polyline tamamen diğer bir polyline'ın içinde kalıyorsa o polyline'in içi boş demektir.
- İki polyline arasında kalan alana dolgu yapılacak demektir.
- Tabii burada seçilen dolgu yüzdesine göre dolgu alanını "hatch" lemekle ilgili algoritmalara itiyaç duyacağız.

Polyline'lar ile ilgili çeşitli algoritmalara da şuradan ulaşabilirsiniz:
http://www.cs.man.ac.uk/~toby/alan/software/

Kolay gelsin.
1 ya da 0. işte 'bit'ün mesele..

bocek

1 ya da 0. işte 'bit'ün mesele..