Cómo crear modelos 3d usando Python

Hola Habr! Una vez que necesitaba crear un modelo 3D de la parte inferior, más en este artículo . Hoy quiero hablar sobre cómo puedes crear modelos 3D de Python 3. Hay muchas maneras de hacer esto: api de Python blender, Vpython ... Pero quiero decirte cómo hacer modelos usando solo Python.



Enlace a Github

STL


Para hacer esto, debe comprender cómo funciona el formato stl (un formato de archivo 3D popular).
Todo el modelo en este formato consta de muchos triángulos, por lo que el archivo consta de coordenadas tridimensionales de sus vértices.

Archivo STL
solido
faceta normal 0 0 0
bucle externo
vértice 0 0 0
vértice 1 0 0
vértice 1 1 0
endloop
cara final
faceta normal 0 0 0
bucle externo
vértice 1 1 0
vértice 0 0 0
vértice 0 1 0
endloop
cara final
Endolid

Ejemplo


Me gustaría mostrar cómo implementar la creación de un modelo 3D por el brillo de los píxeles en la foto. Tomé esta foto a continuación.



La imagen se procesa (ligeramente borrosa para que no haya saltos bruscos en el brillo) utilizando la biblioteca 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 

A continuación se muestra una función que toma 3 matrices con las coordenadas de los vértices de un triángulo y escribe 1 cara triangular en el archivo.

 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") 

Ahora lo más importante es crear las coordenadas correctas de los vértices de los triángulos que componen el modelo 3D.


El fragmento de código que crea las coordenadas.

 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) 

Modelo 3D creado
En realidad, eso es todo lo que quería escribir antes del próximo artículo.

Código completo
 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/es411899/


All Articles