Cara membuat model 3d menggunakan Python

Halo, Habr! Setelah saya perlu membuat model 3D bagian bawah, lebih banyak di artikel ini . Hari ini saya ingin berbicara tentang bagaimana Anda dapat membuat model 3D Python 3. Ada banyak cara untuk melakukan ini: blender python api, Vpython ... Tapi saya ingin memberi tahu bagaimana membuat model hanya menggunakan Python.



Tautan ke Github

STL


Untuk melakukan ini, Anda perlu memahami cara kerja format stl (format file 3D populer).
Seluruh model dalam format ini terdiri dari banyak segitiga, sehingga file terdiri dari koordinat 3 dimensi dari simpul mereka.

File STL
padat
facet normal 0 0 0
lingkaran luar
simpul 0 0 0
simpul 1 0 0
simpul 1 1 0
endloop
endfacet
facet normal 0 0 0
lingkaran luar
simpul 1 1 0
simpul 0 0 0
simpul 0 1 0
endloop
endfacet
ujung-ujungnya

Contoh


Saya ingin menunjukkan cara mengimplementasikan pembuatan model 3D dengan kecerahan piksel dalam foto. Saya mengambil foto ini di bawah.



Gambar diproses (sedikit buram sehingga tidak ada lompatan tajam dalam kecerahan) menggunakan perpustakaan OpenCV.

import cv2 import numpy as np cd_1=['0', '0', '0']#      1  cd_2=['0', '0', '0']#      2  cd_3=['0', '0', '0']#      3  file_stl='new.stl' file_im=r'C:\Users\allex\Pictures\2.jpg'#    op_stl=open(file_stl, 'w') op_im=cv2.imread(file_im) gray = cv2.cvtColor(op_im, cv2.COLOR_BGR2GRAY)#    blur = cv2.GaussianBlur(gray,(0,0),1)#      res=cv2.resize(blur,(320,240))#     320*240 

Di bawah ini adalah fungsi yang mengambil 3 array dengan koordinat simpul segitiga dan menulis 1 wajah segitiga ke file.

 def face_file_stl(cd_1, cd_2, cd_3): op_stl.write("facet normal 0 0 0") op_stl.write("outer loop") op_stl.write("vertex " + " ".join(cd_1))#    1  op_stl.write("vertex " + " ".join(cd_2))#    2  op_stl.write("vertex " + " ".join(cd_3))#    3  op_stl.write("endloop \n\tendfacet") 

Sekarang yang paling penting adalah membuat koordinat verteks segitiga yang benar yang membentuk model 3D.


Sepotong kode yang menciptakan koordinat.

 for i in range(size.shape[1]):#    for k in range(size.shape[0]-1):#    if i!=size.shape[1]-1: try: #making the first triangls for relief cd_1=[str(i), str(k), str(blur[k, i]) ] cd_2=[str(i + 1), str(k), str(blur[k, i+1]) ] cd_3=[str(i+1), str(k+1), str(blur[k+1,i+1])] except: print('er') face_file_stl(cd_1, cd_2, cd_3) try: #making the second triangls for relief cd_1=[str(i), str(k), str(blur[k, i]) ] cd_2=[str(i+1), str(k+1), str(blur[k+1, i+1])] cd_3=[str(i), str(k+1), str(blur[k+1,i]) ] except: print('er') face_file_stl(cd_1, cd_2, cd_3) 

Model 3D yang dibuat
Sebenarnya, hanya itu yang ingin saya tulis sebelum artikel selanjutnya.

Seluruh kode
 import cv2 cd_1=['0', '0', '0']#      1  cd_2=['0', '0', '0']#      2  cd_3=['0', '0', '0']#      3  file_stl='new.stl' file_im=r'C:\Users\allex\Pictures\22.jpg'#    op_stl=open(file_stl, 'w') op_im=cv2.imread(file_im) gray = cv2.cvtColor(op_im, cv2.COLOR_BGR2GRAY)#    blur = cv2.GaussianBlur(gray,(0,0),1)#      blur=cv2.resize(blur,(320,240)) x=0 y=0 file='STL_project-1.stl' o_1="\n\t" o_2="\n\t\t" o_3="\n\t\t\t" op_stl.write("solid") def face_file_stl(cd_1, cd_2, cd_3): op_stl.write(o_1+"facet normal 0 0 0") op_stl.write(o_2 + "outer loop") op_stl.write(o_3 + "vertex " + " ".join(cd_1))#    1  op_stl.write(o_3 + "vertex " + " ".join(cd_2))#    2  op_stl.write(o_3 + "vertex " + " ".join(cd_3))#    3  op_stl.write(o_2 + "endloop \n\tendfacet") #making the first triangls for base for i in range(blur.shape[1]-1): cd_1=[str(i),"0","0"] cd_3=[str(i+1),str(blur.shape[0]-1),"0"] cd_2=[str(i),str(blur.shape[0]-1),"0"] face_file_stl(cd_1, cd_2, cd_3) #making the second triangls for base for i in range(blur.shape[1]-1): cd_1=[str(i+1),str(blur.shape[0]-1),"0"] cd_3=[str(i),"0","0"] cd_2=[str(i+1),"0","0"] face_file_stl(cd_1, cd_2, cd_3) #base has done for i in range(blur.shape[1]): if i%30==0: print(i) for k in range(blur.shape[0]-1):#making the first triangls for relief if i!=blur.shape[1]-1: try: cd_1=[str(i), str(k), str(blur[k, i]) ] cd_2=[str(i + 1), str(k), str(blur[k, i+1]) ] cd_3=[str(i+1), str(k+1), str(blur[k+1,i+1])] except: print('er') face_file_stl(cd_1, cd_2, cd_3) #for j in range(blur.shape[1]-1):#making the second triangls for relief try: cd_1=[str(i), str(k), str(blur[k, i]) ] cd_2=[str(i+1),str(k+1), str(blur[k+1, i+1])] cd_3=[str(i), str(k+1), str(blur[k+1,i]) ] except: print('er') face_file_stl(cd_1, cd_2, cd_3) #relief has done #making the first triangls for right side for i in range(blur.shape[1]): if i!=blur.shape[1]-1: try: cd_1=[str(i),str(blur.shape[0]-1),"0"] cd_3=[str(i+1),str(blur.shape[0]-1),str(blur[blur.shape[0]-1, i+1])] cd_2=[str(i),str(blur.shape[0]-1),str(blur[blur.shape[0]-1, i])] except: print("er") face_file_stl(cd_1, cd_2, cd_3) #making the second triangls for right side try: cd_1=[str(i),str(blur.shape[0]-1),"0"] cd_3=[str(i+1),str(blur.shape[0]-1),"0"] cd_2=[str(i+1),str(blur.shape[0]-1),str(blur[blur.shape[0]-1, i+1])] except: print("er") face_file_stl(cd_1, cd_2, cd_3) if i!=blur.shape[1]-1: try: cd_1=[str(i),'0',"0"] cd_2=[str(i+1),'0',str(blur[0, i+1])] cd_3=[str(i),'0',str(blur[0, i])] except: print("er") face_file_stl(cd_1, cd_2, cd_3) #making the second triangls for right side try: cd_1=[str(i),'0',"0"] cd_2=[str(i+1),'0',"0"] cd_3=[str(i+1),'0',str(blur[0, i+1])] except: print("er") face_file_stl(cd_1, cd_2, cd_3) for i in range(blur.shape[0]): if i!=blur.shape[0]-1: try: cd_1=['0',str(i),"0"] cd_3=['0',str(i+1),str(blur[ i+1,0])] cd_2=['0',str(i),str(blur[i,0])] except: print("er") face_file_stl(cd_1, cd_2, cd_3) #making the second triangls for right side try: cd_1=['0',str(i),"0"] cd_3=['0',str(i+1),"0"] cd_2=['0',str(i+1),str(blur[i+1,0])] except: print("er") face_file_stl(cd_1, cd_2, cd_3) try: cd_2=[str(blur.shape[1]-1),str(i),"0"] cd_3=[str(blur.shape[1]-1),str(i+1),str(blur[ i+1,blur.shape[1]-1])] cd_1=[str(blur.shape[1]-1),str(i),str(blur[i,blur.shape[1]-1])] except: print("er") face_file_stl(cd_1, cd_2, cd_3) #making the second triangls for right side try: cd_2=[str(blur.shape[1]-1),str(i),"0"] cd_3=[str(blur.shape[1]-1),str(i+1),"0"] cd_1=[str(blur.shape[1]-1),str(i+1),str(blur[i+1,blur.shape[1]-1])] except: print("er") face_file_stl(cd_1, cd_2, cd_3) op_stl.write("\nendsolid" ) op_stl.close() print('end') 

Source: https://habr.com/ru/post/id411899/


All Articles