想要將雙目照片合成立體圖實現三維重建,徹底沒有頭緒。可是對三維理解是必須的。因此將之前在單片機上運行的 3D畫圖 程序移植到python上。效果以下:html
沒有用numpy、openGL等,只用了純math庫,這樣移植起來很快,只須要將原來的C代碼簡單修改就能夠了,但代價是效率很低,後面加上圖片旋轉後更爲明顯,速度急劇降低,功耗急劇上升,臺式機帶起來速度都不怎麼樣,更別說運行在JetsonTx2開發板上了。python
理論上來講,只要實現了裏面的畫點函數和畫線函數,就能夠快速移植到包括 Micropython在內的python環境中了,個人好幾塊Mycropython板子不知扔哪去了,以前的編程環境也很差找了,屏幕還須要現插,就不實驗了。算法
忽然發現我還有塊荔枝派的堪智K210開發板,上面刷了Micropython環境,等有空移植試試。編程
整個程序是在之前的 3D旋轉立方體 的C代碼上移植過來的,新增長了任意中文字符顯示函數和圖片顯示函數,圖片顯示使用了opencv。數組
程序中,最核心的處理部分就是如下幾點:緩存
gMAT=structure_3D() #//構建單位矩陣 gMAT=Translate3D(gMAT,-(width/2),-(height/2),0); #//平移變換矩陣 gMAT=Scale_3D(gMAT,size,size,size); #//比例變換矩陣 gMAT=Rotate_3D(gMAT,ax,ay,az); #//旋轉變換矩陣 Point1=vector_matrix_MULTIPLY(Point0,gMAT) #座標點矩陣變換,Point0即爲當前點的三維座標 PointDis=PerProject(Point1,0,0) #三維轉二維計算
而後按照上面的順序,將每一個點帶入Point0中,進行計算後就能夠得出二維座標下三維數據應該所在的座標。微信
程序由兩個文檔組成,Transform.py 和 main.py 兩部分,第一部分使用了pygame庫,若有須要請自行更改實現爲其餘顯示庫。第二部分爲展現部分,裏面還實現了圖片3D旋轉的程序,使用了opencv庫,若有須要可屏蔽或是換爲其餘庫來實現圖片的讀取和計算。ide
程序中實現的3D顯示包含:立方體,圓,取模字符,任意中文字符和彩色圖片的簡單3D顯示。因爲沒有進行更高級的三維處理,因此點陣類目標(字符和圖片)會出現近處的點或者放大必定倍數後有空隙的狀況,若有須要請自行進行更高級的算法處理,好比將畫點的大小與三維轉換算法結合起來。函數
程序中任意中文文本的顯示使用到了HZK16和HZK32兩種字庫,注意將路徑修改成本身字庫的路徑下。圖片顯示中也須要修改圖片的路徑。測試
Transform.py 內容以下:
1 from math import * 2 import pygame 3 from pygame.locals import * 4 import time 5 import sys 6 import binascii #任意中文字符時使用到此庫 7 8 ''' 9 * 文檔: Transform3D.py 10 * 做者: 執念執戰 11 * QQ:572314251 12 * 微信:zhinianzhizhan 13 * 原名:王成程 14 * 時間:2019-6 15 * 隨夢,隨心,隨願,恆執念,爲夢執戰,執戰蒼天! 16 * 17 * 18 * 19 * 說明: 本文檔是由以前的能夠在單片機上實現3D顯示的程序修改而來 20 * 直接運行時須要math、time、sys、pygame、binascii 等庫的支持 21 * 3D算法從底層一步一步實現 22 * 全部的算法都是使用基本的math庫算法實現,沒有使用高級的numpy矩陣算法 23 * 因此理論上來講,只要移植好Gui_Point()函數和GUI_Line()函數,去掉須要pygame庫支持的部分, 24 * 就能夠移植到任意Python環境中(包括能夠在單片機上運行的MicroPython環境中),只不過速度有差距 25 * 26 * 轉載或使用情註明出處 27 ''' 28 29 30 31 FOCAL_DISTANCE = 512 #透視模型 32 '''基於透視投影的基本模型''' 33 34 35 36 37 SCREEN_X_MAX = 800 #屏幕的寬和高 38 SCREEN_Y_MAX = 600 39 40 BLACK=(0,0,0) 41 WHITE=(255,255,255) 42 RED=(255,0,0) 43 GREEN=(0,255,0) 44 BLUE=(0,0,255) 45 46 ForeColor = RED #前景色和背景色 47 BackColor = BLACK 48 #Screen=[[0 for i in range(SCREEN_X_MAX)] for j in range(SCREEN_Y_MAX)] #屏幕緩存 49 50 screen = pygame.display.set_mode((SCREEN_X_MAX,SCREEN_Y_MAX)) 51 52 def Gui_Point(x,y,color): 53 '''|********************************************************** 54 |**函數:Gui_Point 55 |**功能:畫點函數 56 |**說明:x,y:座標點 57 | color:顏色 58 | 若想支持其餘Python環境,須要完成本函數的移植 59 | 60 | 61 |**做者: 執念執戰 62 |**時間:2019-6-3 63 |*********************************************************''' 64 #Screen[(int)(y)][(int)(x)]=color 65 pygame.draw.line(screen,color,(x,y),(x+1,y),2) 66 def GUI_Line(xstart,ystart,xend,yend,color): 67 '''|********************************************************** 68 |**GUI_Line 69 |**功能:畫線函數 70 |**說明:xstart,ystart:起始座標點 71 | xend,yend:結束座標點 72 | color:顏色 73 | 若想支持其餘Python環境,須要完成本函數的移植 74 | 75 | 76 |**做者: 執念執戰 77 |**時間:2019-6-3 78 |*********************************************************''' 79 pygame.draw.line(screen,color,(xstart,ystart),(xend,yend),2) 80 81 82 83 class zuobiaostruct: 84 '''座標結構體''' 85 def __init__(self): 86 self.x=0 87 self.y=0 88 self.z=0 89 90 Cube_Size = 16.0 #立方體基本邊長 91 Cube=[zuobiaostruct() for i in range(8)] 92 93 ''' 94 至關於正方形的頂點座標。 95 修改長度能夠改成長方形,或是修改邊長等。 96 固然,也可修改頂點座標爲任意數據,而後對頂點座標進行3D運算,最後按照順序在須要的頂點之間畫線,就能生成其餘3D圖形 97 98 ''' 99 Cube[0].x=0.0 100 Cube[0].y=0.0 101 Cube[0].z=0.0 102 103 Cube[1].x=Cube_Size 104 Cube[1].y=0.0 105 Cube[1].z=0.0 106 107 Cube[2].x=0.0 108 Cube[2].y=Cube_Size 109 Cube[2].z=0.0 110 111 Cube[3].x=Cube_Size 112 Cube[3].y=Cube_Size 113 Cube[3].z=0.0 114 115 Cube[4].x=0.0 116 Cube[4].y=0.0 117 Cube[4].z=Cube_Size 118 119 Cube[5].x=Cube_Size 120 Cube[5].y=0.0 121 Cube[5].z=Cube_Size 122 123 Cube[6].x=0.0 124 Cube[6].y=Cube_Size 125 Cube[6].z=Cube_Size 126 127 Cube[7].x=Cube_Size 128 Cube[7].y=Cube_Size 129 Cube[7].z=Cube_Size 130 '''Cube=[[0,0,0], 131 [16,0,0], 132 [0,16,0], 133 [16,16,0], 134 135 [0,0,16], 136 [16,0,16], 137 [0,16,16], 138 [16,16,16]] 139 ''' 140 141 142 143 144 145 146 ''' 147 -**************************************************************- 148 3D座標運算部分 149 -**************************************************************- 150 ''' 151 152 153 154 155 def MATRIX_copy(sourceMAT): 156 '''|********************************************************** 157 |**函數:MATRIX_copy 158 |**功能:矩陣拷貝 159 |**說明: sourceMAT[4][4](源矩陣,source matrix), 160 | targetMAT[4][4] (目標矩陣 target matrix) 161 | 邊學邊寫 162 |**做者: 執念執戰 163 |**時間:2015-11-29,21:52 164 |*********************************************************''' 165 targetMAT=[[0.0 for i in range(4)] for n in range(4)] 166 for a in range(4): 167 for b in range(4): 168 targetMAT[a][b]=sourceMAT[a][b] 169 return targetMAT 170 171 '' 172 173 def MATRIX_multiply(MAT1,MAT2): 174 '''|******************************************************* 175 |**函數:MATRIX_multiply 176 |**功能:矩陣相乘 177 |**說明: MAT1[4][4](矩陣1),MAT2[4][4](矩陣2), 178 | newMAT[4][4] (結果矩陣 ) 179 | 邊學邊寫 180 |**做者: 執念執戰 181 |**時間:2015-11-29 182 |**********************************************************''' 183 newMAT=[[0.0 for i in range(4)] for n in range(4)] 184 for a in range(4): 185 for b in range(4): 186 newMAT[a][b]=MAT1[a][0]*MAT2[0][b]+MAT1[a][1]*MAT2[1][b]+MAT1[a][2]*MAT2[2][b]+MAT1[a][3]*MAT2[3][b] 187 return newMAT 188 189 190 191 def vector_matrix_MULTIPLY(Source,MAT): 192 '''********************************************************** 193 |**函數: vector_matrix_MULTIPLY 194 |**功能:矢量與矩陣相乘 195 |**說明: Source(源矢量座標) MAT[][](變換座標) 196 | 邊學邊寫 197 |**做者: 執念執戰 198 |**時間:2015-11-29 199 |***********************************************************''' 200 Result=zuobiaostruct() 201 Result.x=Source.x*MAT[0][0]+Source.y*MAT[1][0]+Source.z*MAT[2][0]+MAT[3][0] 202 Result.y=Source.x*MAT[0][1]+Source.y*MAT[1][1]+Source.z*MAT[2][1]+MAT[3][1] 203 Result.z=Source.x*MAT[0][2]+Source.y*MAT[1][2]+Source.z*MAT[2][2]+MAT[3][2] 204 return Result 205 206 207 208 def structure_3D(): 209 '''********************************************************** 210 |**函數: structure_3D 211 |**功能:構造單位矩陣 212 |**說明: 將一個數組構形成單位矩陣(對角線上全爲1,其餘爲0) 213 | 邊學邊寫 214 |**做者: 執念執戰 215 |**時間:2015-11-29 216 |*********************************************************''' 217 MAT=[[0.0 for i in range(4)] for i in range(4)] 218 MAT[0][0]=1.0 219 MAT[0][1]=0.0 220 MAT[0][2]=0.0 221 MAT[0][3]=0.0 #// 1 0 0 0 222 223 MAT[1][0]=0.0 224 MAT[1][1]=1.0 225 MAT[1][2]=0.0 226 MAT[1][3]=0.0 #// 0 1 0 0 227 228 MAT[2][0]=0.0 229 MAT[2][1]=0.0 230 MAT[2][2]=1.0 231 MAT[2][3]=0.0 232 #// 0 0 1 0 233 MAT[3][0]=0.0 234 MAT[3][1]=0.0 235 MAT[3][2]=0.0 236 MAT[3][3]=1.0 237 #// 0 0 0 1 238 239 return MAT 240 241 242 243 def Translate3D(MAT,tx, ty, tz): 244 '''******************************************************** 245 |**函數: Translate3D 246 |**功能:平移變換矩陣 247 |**說明: 1:tx,ty,tz 爲平移參數 248 | 2:當爲邊長的一半的倒數時,圖像繞着本身旋轉,即原點在中心 249 | 250 | 邊學邊寫 251 |**做者: 執念執戰 252 |**時間:2015-11-29 253 |**********************************************************''' 254 tMAT=[[0.0 for i in range(4)] for i in range(4)] 255 tMAT[0][0]=1 256 tMAT[0][1]=0 257 tMAT[0][2]=0 258 tMAT[0][3]=0 #// 1 0 0 tx 259 260 tMAT[1][0]=0 261 tMAT[1][1]=1 262 tMAT[1][2]=0 263 tMAT[1][3]=0 #// 0 1 0 ty 264 265 tMAT[2][0]=0 266 tMAT[2][1]=0 267 tMAT[2][2]=1 268 tMAT[2][3]=0 #// 0 0 1 tz 269 270 tMAT[3][0]=tx 271 tMAT[3][1]=ty 272 tMAT[3][2]=tz 273 tMAT[3][3]=1; #// 0 0 0 1 274 275 return MATRIX_multiply(MAT,tMAT)#//相乘 276 277 278 279 def Scale_3D( MAT, sx, sy, sz): 280 '''******************************************************* 281 |**函數: Scale_3D 282 |**功能:比例(scale)變換矩陣 283 |**說明: 1:相對於原點上的比例變換 284 | 2:sx,sy,sz 是對應軸上的縮放量 285 | 3:矩陣根據三個比例進行比例變換 286 | 邊學邊寫 287 |**做者: 執念執戰 288 |**時間:2015-11-30,7:45 289 |*********************************************************''' 290 tMAT=[[0.0 for i in range(4)] for i in range(4)] 291 tMAT[0][0]=sx 292 tMAT[0][1]=0 293 tMAT[0][2]=0 294 tMAT[0][3]=0 #// sx0 0 0 295 tMAT[1][0]=0 296 tMAT[1][1]=sy 297 tMAT[1][2]=0 298 tMAT[1][3]=0 #// 0 sy0 0 299 tMAT[2][0]=0 300 tMAT[2][1]=0 301 tMAT[2][2]=sz 302 tMAT[2][3]=0 #// 0 0 sz0 303 tMAT[3][0]=0 304 tMAT[3][1]=0 305 tMAT[3][2]=0 306 tMAT[3][3]=1 #// 0 0 0 1 307 return MATRIX_multiply(MAT,tMAT) # //相乘 308 309 310 311 312 313 314 def Rotate_3D( MAT, ax, ay, az): 315 '''**********************************************************/ 316 |**函數: Rotate_3D 317 |**功能:旋轉變換矩陣 318 |**說明: 1:繞z軸旋轉az度角 319 | 2:az爲旋轉的角度量,賦正值爲順時針轉 320 | 3:矩陣MAT根據AZ度角進行旋轉變換 321 | 邊學邊寫 322 |**做者: 執念執戰 323 |**時間:2015-11-30,7:45 324 |**********************************************************''' 325 MAT1=[[0.0 for i in range(4)] for i in range(4)] 326 MAT2=[[0.0 for i in range(4)] for i in range(4)] 327 MATx=[[0.0 for i in range(4)] for i in range(4)] 328 MATy=[[0.0 for i in range(4)] for i in range(4)] 329 MATz=[[0.0 for i in range(4)] for i in range(4)] 330 331 ax=(3.1415926*ax)/180.0 #//角度轉換爲弧度量 332 ay=(3.1415926*ay)/180.0 333 az=(3.1415926*az)/180.0 334 '''/*****************************繞x軸旋轉********************************************/''' 335 336 MATx[0][0]=1 337 MATx[0][1]=0 338 MATx[0][2]=0 339 MATx[0][3]=0 #//1 0 0 0 340 MATx[1][0]=0 341 MATx[1][1]=cos(ax) 342 MATx[1][2]=-sin(ax) 343 MATx[1][3]=0 #//0 cos(ax) -sin(ax) 0 344 MATx[2][0]=0 345 MATx[2][1]=sin(ax) 346 MATx[2][2]=cos(ax) 347 MATx[2][3]=0 #//0 sin(ax) cos(ax) 0 348 MATx[3][0]=0 349 MATx[3][1]=0 350 MATx[3][2]=0 351 MATx[3][3]=1 #//0 0 0 1 352 353 '''/*****************************繞y軸旋轉********************************************/''' 354 MATy[0][0]=cos(ay) 355 MATy[0][1]=0 356 MATy[0][2]=sin(ay) 357 MATy[0][3]=0 #//cos(ay) 0 sin(ay) 0 358 MATy[1][0]=0 359 MATy[1][1]=1 360 MATy[1][2]=0 361 MATy[1][3]=0 #// 0 1 0 0 362 MATy[2][0]=-sin(ay) 363 MATy[2][1]=0 364 MATy[2][2]=cos(ay) 365 MATy[2][3]=0 #// -sin(ay) 0 cos(ay) 0 366 MATy[3][0]=0 367 MATy[3][1]=0 368 MATy[3][2]=0 369 MATy[3][3]=1 #// 0 0 0 1 370 371 372 '''/*****************************繞z軸旋轉********************************************/''' 373 MATz[0][0]=cos(az) 374 MATz[0][1]=-sin(az) 375 MATz[0][2]=0 376 MATz[0][3]=0 #//cos(az) -sin(az) 0 0 377 MATz[1][0]=sin(az) 378 MATz[1][1]=cos(az) 379 MATz[1][2]=0 380 MATz[1][3]=0 #// sin(az) cos(az) 0 0 381 MATz[2][0]=0 382 MATz[2][1]=0 383 MATz[2][2]=1 384 MATz[2][3]=0 #// 0 0 1 0 385 MATz[3][0]=0 386 MATz[3][1]=0 387 MATz[3][2]=0 388 MATz[3][3]=1 #// 0 0 0 1 389 390 MAT1=MATRIX_multiply(MAT,MATx) 391 MAT2=MATRIX_multiply(MAT1,MATy) 392 return MATRIX_multiply(MAT2,MATz) 393 #return MAT 394 395 ''' 396 /********************************************************************************/ 397 /*------------------------------------------------------------------------------*/ 398 /* 投影算法 三維轉二維的相關函數 */ 399 /*------------------------------------------------------------------------------*/ 400 /********************************************************************************/ 401 ''' 402 403 404 405 406 407 def OrtProject(Space): 408 '''******************************************************** 409 |**函數: OrtProject 410 |**功能:透視投影(Perspective projection) 411 |**說明:簡單透視 412 413 | 邊學邊寫 414 |**做者: 執念執戰 415 |**時間:2015-11-30 416 |*********************************************************''' 417 Screen=zuobiaostruct() 418 Screen.x=(int)(Space.x) 419 Screen.y=(int)(Space.y) 420 421 return Screen; 422 423 424 425 def PerProject( Space, XO, YO): 426 '''**********************************************************/ 427 |**函數: PerProject 428 |**功能:透視投影(Perspective projection) 429 |**說明:XO,YO爲投影后的圖形中心的屏幕座標 430 431 | 邊學邊寫 432 |**做者: 執念執戰 433 |**時間:2015-11-30 434 |********************************************************''' 435 436 Screen=zuobiaostruct() 437 if (Space.z==0): 438 Space.z=0.01 #//被除數不能爲零 439 Screen.x=(int)(FOCAL_DISTANCE*Space.x /(Space.z+FOCAL_DISTANCE)+XO) 440 Screen.y=(int)(FOCAL_DISTANCE*Space.y /(Space.z+FOCAL_DISTANCE)+YO) 441 return Screen 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 def RateCube_size( sx, sy, sz, x,y,color,X_Size=1,Y_Size=1,Z_Size=1, ratio=1): 458 '''**********************************************************/ 459 |**函數: RateCube_size 460 |**功能:顯示3D的立方體 461 |**說明:sx,sy,sz :角度值 462 | x,y: 欲顯示的座標位置 463 | X_Size,Y_Size,Z_Size:立方體的三個邊長,默認爲1 464 | ratio:放大比例 465 466 | 467 |**做者: wcc 執念執戰 468 |**時間:2019-6-3 469 |********************************************************''' 470 gMAT=[[0.0 for i in range(4)] for n in range(4)] 471 temp=zuobiaostruct() 472 Cube_dis=[zuobiaostruct() for i in range(8)] 473 474 475 476 477 gMAT=structure_3D() #//構造爲單位矩陣 478 gMAT=Translate3D(gMAT,-10,-8,-8) #//平移變換矩陣,當爲邊長的一半的倒數時,圖像繞着本身旋轉,即原點在中心 479 gMAT=Scale_3D(gMAT,X_Size*ratio,Y_Size*ratio,Z_Size*ratio) #//比例變換矩陣 480 gMAT=Rotate_3D(gMAT,sx,sy,sz) #//旋轉變換矩陣 481 gMAT=Translate3D(gMAT,8,8,8) #//平移變換矩陣 x:調節距離中心點的位置,至關於下面Point0.z 482 #// y:上下調動位置 ,具體根據實際修改 483 484 485 for i in range(8): 486 487 488 temp=vector_matrix_MULTIPLY(Cube[i],gMAT)# //矢量與矩陣相乘 489 Cube_dis[i]=PerProject(temp,0,0)# //正射投影 xo,yo:position 490 Cube_dis[i].x+=x 491 Cube_dis[i].y+=y 492 #Cube_dis[i].x+=SCREEN_X_MAX 493 #Cube_dis[i].y+=SCREEN_Y_MAX 494 495 496 '''將目標頂點按照預期鏈接起來''' 497 GUI_Line(Cube_dis[0].x,Cube_dis[0].y,Cube_dis[1].x,Cube_dis[1].y,color) 498 GUI_Line(Cube_dis[0].x,Cube_dis[0].y,Cube_dis[2].x,Cube_dis[2].y,color) 499 GUI_Line(Cube_dis[3].x,Cube_dis[3].y,Cube_dis[1].x,Cube_dis[1].y,color) 500 GUI_Line(Cube_dis[3].x,Cube_dis[3].y,Cube_dis[2].x,Cube_dis[2].y,color) 501 502 503 GUI_Line(Cube_dis[0+4].x,Cube_dis[0+4].y,Cube_dis[1+4].x,Cube_dis[1+4].y,color) 504 GUI_Line(Cube_dis[0+4].x,Cube_dis[0+4].y,Cube_dis[2+4].x,Cube_dis[2+4].y,color) 505 GUI_Line(Cube_dis[3+4].x,Cube_dis[3+4].y,Cube_dis[1+4].x,Cube_dis[1+4].y,color) 506 GUI_Line(Cube_dis[3+4].x,Cube_dis[3+4].y,Cube_dis[2+4].x,Cube_dis[2+4].y,color) 507 508 509 GUI_Line(Cube_dis[0].x,Cube_dis[0].y,Cube_dis[0+4].x,Cube_dis[0+4].y,color) 510 GUI_Line(Cube_dis[1].x,Cube_dis[1].y,Cube_dis[1+4].x,Cube_dis[1+4].y,color) 511 GUI_Line(Cube_dis[2].x,Cube_dis[2].y,Cube_dis[2+4].x,Cube_dis[2+4].y,color) 512 GUI_Line(Cube_dis[3].x,Cube_dis[3].y,Cube_dis[3+4].x,Cube_dis[3+4].y,color) 513 514 515 516 517 518 Last_flg1=False 519 Last_flg2=False 520 Last_x1=0 521 Last_y1=0 522 523 Last_x2=0 524 Last_y2=0 525 526 527 def Rotatecircle( ax, ay, az,x, y,Z_Size, r, color ): 528 '''**********************************************************/ 529 |**函數: Rotatecircle 530 |**功能:顯示3D的圓 531 |**說明:sx,sy,sz :角度值 532 | x,y: 欲顯示的座標位置 533 | Z_Size:距旋轉軸的距離 534 | r:半徑 535 | color:顏色 536 537 | 538 |**做者: wcc 執念執戰 539 |**時間:2019-6-3 540 |********************************************************''' 541 542 global Last_flg1 543 global Last_flg2 544 global Last_x1,Last_y1,Last_x2,Last_y2 545 546 gMAT=[[0.0 for i in range(4)] for n in range(4)] 547 Point0=zuobiaostruct() 548 Point3=zuobiaostruct() 549 550 Point1=zuobiaostruct() 551 PointDis=zuobiaostruct() 552 553 gMAT=structure_3D() #//構造單位矩陣 554 gMAT=Translate3D(gMAT,-r,0,0) #//平移變換矩陣 555 gMAT=Scale_3D(gMAT,3,3,3) #//比例變換矩陣 556 gMAT=Rotate_3D(gMAT,ax,ay,az) #//旋轉變換矩陣 557 #gMAT=Translate3D(gMAT,-r/2,-r/2,-r/2) #//平移變換矩陣 558 559 560 561 for i in range(0,r+r+1): 562 563 Point0.x=i 564 Point0.y=r-(r-sqrt(r*r-(r-i)*(r-i))) 565 Point0.z=0#Point0.z+Z_Size 566 Point3.x=i 567 Point3.y=r-(r+sqrt(r*r-(r-i)*(r-i))) 568 Point3.z=0#Point3.z+Z_Size 569 570 571 Point1=vector_matrix_MULTIPLY(Point0,gMAT) #//矢量與矩陣相乘 572 PointDis=PerProject(Point1,0,0) #//映射投影 573 #PointDis.x+=SCREEN_X_MAX 574 #PointDis.y+=SCREEN_Y_MAX #//用來解決超出屏幕後亂碼的問題。去掉後順時針轉到超出左邊界後會找不到座標無限劃線, 575 #// 還要注意圖像不要大到超過兩個屏 576 577 if Last_flg1 == True and i!=0: 578 GUI_Line(PointDis.x+x,PointDis.y+y,Last_x1+x,Last_y1+y,color) #鏈接上次的保存,避免點的空隙過大 579 else: 580 GUI_Line(PointDis.x+x,PointDis.y+y,PointDis.x+1+x,PointDis.y+1+y,color) 581 Last_x1= PointDis.x 582 Last_y1= PointDis.y 583 Last_flg1=True 584 585 Point1=vector_matrix_MULTIPLY(Point3,gMAT) #//矢量與矩陣相乘 586 PointDis=PerProject(Point1,0,0) #//映射投影 587 588 #PointDis.x+=SCREEN_X_MAX 589 # PointDis.y+=SCREEN_Y_MAX #//用來解決超出屏幕後亂碼的問題。去掉後順時針轉到超出左邊界後會找不到座標無限劃線, 590 if Last_flg2 == True and i!=0: 591 GUI_Line(PointDis.x+x,PointDis.y+y,Last_x2+x,Last_y2+y,color)#鏈接上次的保存,避免點的空隙過大 592 else: 593 GUI_Line(PointDis.x+x,PointDis.y+y,PointDis.x+1+x,PointDis.y+1+y,color) 594 Last_x2= PointDis.x 595 Last_y2= PointDis.y 596 Last_flg2=True 597 598 599 SETCH32X29=[[0 for i in range(128)] for i in range(4)] 600 601 '''// 設置宋體小二常規, 參數中的其餘選項爲縱向取模,字節倒序,保留,任什麼時候候都加零''' 602 ''' 本字符集爲 寬29 高 32的字符,使用時注意 32/8''' 603 604 ''' 605 /*-- 執--*/ 606 /*-- 29 x32 ---*/ 607 ''' 608 SETCH32X29[0]=(0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0xFC,0x04,0x80,0x80,0x00,0x00,0x00,0xFC, 609 0xFC,0xFC,0x08,0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01, 610 0x81,0x81,0x81,0xFF,0xFF,0xFF,0x61,0x23,0xB3,0x93,0x82,0x82,0xFF,0xFF,0xFF,0x02, 611 0x02,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x03,0x03,0x01,0x01, 612 0xFF,0xFF,0xFF,0x00,0x00,0x80,0xE0,0xF9,0x7F,0x1F,0x07,0x0E,0x1E,0x1C,0x1F,0x7F, 613 0xFF,0xF0,0x80,0xC0,0xF8,0xF8,0x00,0x00,0x00,0x02,0x02,0x06,0x0E,0x0F,0x0F,0x0B, 614 0x0C,0x07,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x03, 615 0x07,0x07,0x07,0x00, 616 ) 617 618 '''/*-- 念 --*/ 619 /*-- 29 x32 ---*/''' 620 SETCH32X29[1]=( 621 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF8,0xFC,0xBE,0x1E,0x3C, 622 0x70,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x30, 623 0x18,0x18,0x0C,0x26,0x27,0x23,0x21,0x21,0x20,0x21,0x27,0x2F,0x2F,0x24,0xE0,0xF1, 624 0xF1,0x73,0x27,0x06,0x0E,0x0E,0x0C,0x0C,0x04,0x00,0x00,0x00,0x80,0xC0,0xF0,0xF8, 625 0x78,0x00,0xFC,0xFC,0xFC,0x0B,0x0F,0x3E,0x3C,0x1E,0x07,0x07,0x03,0xE0,0xE0,0x88, 626 0x38,0xF8,0xF0,0xE0,0xC0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x00,0x00,0x07, 627 0x07,0x07,0x06,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x07,0x07,0x07,0x02,0x00,0x01, 628 0x01,0x00,0x00,0x00, ) 629 630 '''/*-- 執--*/ 631 /*-- 29 x32 ---*/''' 632 SETCH32X29[2]=( 633 634 0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0xFC,0x04,0x80,0x80,0x00,0x00,0x00,0xFC, 635 0xFC,0xFC,0x08,0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01, 636 0x81,0x81,0x81,0xFF,0xFF,0xFF,0x61,0x23,0xB3,0x93,0x82,0x82,0xFF,0xFF,0xFF,0x02, 637 0x02,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x03,0x03,0x01,0x01, 638 0xFF,0xFF,0xFF,0x00,0x00,0x80,0xE0,0xF9,0x7F,0x1F,0x07,0x0E,0x1E,0x1C,0x1F,0x7F, 639 0xFF,0xF0,0x80,0xC0,0xF8,0xF8,0x00,0x00,0x00,0x02,0x02,0x06,0x0E,0x0F,0x0F,0x0B, 640 0x0C,0x07,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x03, 641 0x07,0x07,0x07,0x00, ) 642 '''/*-- 戰 --*/ 643 /*-- 29 x32 ---*/''' 644 SETCH32X29[3]=( 645 646 0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xFC,0xFC,0x08,0x00,0x00,0x80,0x80,0x80,0x00, 647 0xFE,0xFE,0xFC,0x04,0x08,0x18,0x70,0xF0,0xF0,0x60,0x00,0x00,0x00,0x00,0x00,0xC0, 648 0xC0,0x80,0x80,0xFF,0xFF,0xFF,0x81,0x81,0xC9,0xC9,0xC9,0x89,0x0D,0x0F,0xFF,0xFF, 649 0xF4,0x04,0x04,0xC4,0xF6,0xF7,0x63,0x66,0x04,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x80, 650 0x80,0x80,0x80,0x80,0x80,0xFF,0xFF,0xFF,0x00,0x00,0x80,0xC3,0xFF,0x7F,0xFC,0xFF, 651 0xCF,0x07,0x01,0xF0,0xF0,0x00,0x00,0x00,0x00,0x07,0x03,0x03,0x00,0x00,0x00,0x00, 652 0x00,0x08,0x0B,0x0F,0x07,0x06,0x03,0x01,0x01,0x00,0x00,0x00,0x01,0x03,0x07,0x07, 653 0x0F,0x0F,0x08,0x00,) 654 655 656 657 658 659 660 661 662 663 664 def Show3DCharXxY(dp,dp_x,dp_y,ax,ay,az,x,y,Z_Size,color): 665 '''**********************************************************/ 666 |**函數: Show3DCharXxY 667 |**功能:顯示3D字體,須要本身取模,支持任意python環境 668 |**說明:dp:字體數組的名稱,爲須要取模的字體。如上面的 SETCH32X29[]數組 669 取模方式:設置宋體小二常規, 參數中的其餘選項爲縱向取模,字節倒序,保留,任什麼時候候都加零 670 dp_x,dp_y:取模字體的長寬,好比32x29的字符爲:29,32/4,由於保存的字符格式爲列項一個字節表示8個像素點,具體參考取模原理 671 | ax,ay,az:角度值 672 | x,y: 欲顯示的座標位置 673 | Z_Size:距旋轉軸的距離 674 | color:顏色 675 676 | 677 |**做者: wcc 執念執戰 678 |**時間:2019-6-3 679 |********************************************************''' 680 681 gMAT=[[0.0 for i in range(4)] for n in range(4)] 682 Point0=zuobiaostruct() 683 Point1=zuobiaostruct() 684 PointDis=zuobiaostruct() 685 686 gMAT=structure_3D() #//構建單位矩陣 687 gMAT=Translate3D(gMAT,-16,-12,-6); #//平移變換矩陣 688 gMAT=Scale_3D(gMAT,4,4,4); #//比例變換矩陣 689 gMAT=Rotate_3D(gMAT,ax,ay,az); #//旋轉變換矩陣 690 #gMAT=Translate3D(gMAT,0,-8,8); #//平移變換矩陣 x:調節距離中心點的位置,至關於下面Point0.z 691 #//y:上下調動位置 ,具體根據實際修改 692 693 694 695 for i in range(dp_y): 696 for k in range(8): 697 temp = 0x01 << k 698 for j in range(dp_x): 699 data=dp[i*dp_x+j] 700 if data & temp == temp: 701 702 Point0.x=j 703 Point0.y=(i*8)+k 704 Point0.z =Z_Size #//此參數可以改變字符距離旋轉軸中心的距離 705 706 Point1=vector_matrix_MULTIPLY(Point0,gMAT)#//矢量與矩陣相乘 707 PointDis=PerProject(Point1,0,0) #//映射投影 708 #PointDis.x+=SCREEN_X_MAX 709 #PointDis.y+=SCREEN_Y_MAX #//用來解決超出屏幕後亂碼的問題。去掉後順時針轉到超出左邊界後會找不到座標無限劃線, 710 Gui_Point(PointDis.x+x,PointDis.y+y,color) 711 712 713 714 715 716 717 def Show3D16x16Font(font,ax,ay,az,x,y,Z_Size,frontcolor,backcolor,model=0): 718 '''**********************************************************/ 719 |**函數: Show3D16x16Font 720 |**功能:顯示3D的16x16字符,爲從漢字庫讀取的字符數據,支持數千個漢字 721 | 本函數須要 binascii 庫的支持,不支持此庫的環境沒法運行本函數 722 |**說明:font:欲顯示的漢字,目前只支持一個字符的顯示,只支持漢字的顯示 723 | sx,sy,sz :角度值 724 | x,y: 欲顯示的座標位置 725 | Z_Size:距旋轉軸的距離 726 | frontcolor,backcolor:顏色,前景色和背景色 727 | model:顯示模式,只有模式爲1時才填充背景色,不然只填充前景色 728 | 729 |**做者: wcc 執念執戰 730 |**時間:2019-6-3 731 |********************************************************''' 732 length = len(font) 733 if length == 1: #只支持一個支付的顯示 734 text = font 735 else: 736 return 737 gb2312 = text.encode('gb2312') 738 hex_str = binascii.b2a_hex(gb2312) 739 result = str(hex_str,encoding = 'utf-8' ) 740 741 area = eval('0x' + result[:2]) - 0xA0 742 index = eval('0x' + result[2:]) - 0xA0 743 offset = (94 * (area - 1)+ (index - 1))*32 744 font_rect = None 745 with open("D:/Mystudy/Python/pyGame/HZK16","rb") as f: #16x16字符集的地址 746 f.seek(offset) 747 font_rect = f.read(32) 748 f.close() 749 750 gMAT=[[0.0 for i in range(4)] for n in range(4)] 751 Point0=zuobiaostruct() 752 Point1=zuobiaostruct() 753 PointDis=zuobiaostruct() 754 755 gMAT=structure_3D() #//構建單位矩陣 756 gMAT=Translate3D(gMAT,-8,-8,-8); #//平移變換矩陣 757 gMAT=Scale_3D(gMAT,4,4,4); #//比例變換矩陣 758 gMAT=Rotate_3D(gMAT,ax,ay,az); #//旋轉變換矩陣 759 #gMAT=Translate3D(gMAT,8,8,8); #//平移變換矩陣 x:調節距離中心點的位置,至關於下面Point0.z 760 761 762 763 i=0 764 k=0 765 j=0 766 XO=0 767 YO=0 768 769 for i in range(16): 770 for k in range(8): 771 temp = 0x01 << k 772 for j in range(2): 773 data=font_rect[i*2+j] 774 if data & temp == temp: 775 776 Point0.x=16-(k+(1-j)*8) 777 Point0.y=i #(i*8)+k 778 Point0.z=Z_Size #//此參數可以改變字符距離旋轉軸中心的距離 779 780 Point1=vector_matrix_MULTIPLY(Point0,gMAT)#//矢量與矩陣相乘 781 PointDis=PerProject(Point1,XO,YO) #//映射投影 782 #PointDis.x+=SCREEN_X_MAX 783 #PointDis.y+=SCREEN_Y_MAX #//用來解決超出屏幕後亂碼的問題。去掉後順時針轉到超出左邊界後會找不到座標無限劃線, 784 Gui_Point(PointDis.x+x,PointDis.y+y,frontcolor) 785 else: 786 if model ==1: #模式爲1 時纔會繪製底色 787 Point0.x=16-(k+(1-j)*8) 788 Point0.y=i #(i*8)+k 789 Point0.z=Z_Size #//此參數可以改變字符距離旋轉軸中心的距離 790 791 Point1=vector_matrix_MULTIPLY(Point0,gMAT)#//矢量與矩陣相乘 792 PointDis=PerProject(Point1,XO,YO) #//映射投影 793 #PointDis.x+=SCREEN_X_MAX 794 #PointDis.y+=SCREEN_Y_MAX #//用來解決超出屏幕後亂碼的問題。去掉後順時針轉到超出左邊界後會找不到座標無限劃線, 795 Gui_Point(PointDis.x+x,PointDis.y+y,backcolor) 796 797 798 799 800 801 802 803 804 def Show3D32x32Font(font,ax,ay,az,x,y,Z_Size,frontcolor,backcolor,model=0): 805 '''**********************************************************/ 806 |**函數: Show3D32x32Font 807 |**功能:顯示3D的32x32字符,爲從漢字庫讀取的字符數據,支持數千個漢字 808 | 本函數須要 binascii 庫的支持,不支持此庫的環境沒法運行本函數 809 |**說明:font:欲顯示的漢字,目前只支持一個字符的顯示,只支持漢字的顯示 810 | sx,sy,sz :角度值 811 | x,y: 欲顯示的座標位置 812 | Z_Size:距旋轉軸的距離 813 | frontcolor,backcolor:顏色,前景色和背景色 814 | model:顯示模式,只有模式爲1時才填充背景色,不然只填充前景色 815 | 816 |**做者: wcc 執念執戰 817 |**時間:2019-6-3 818 |********************************************************''' 819 length = len(font) 820 if length == 1: #只支持一個支付的書寫 821 text = font 822 else: 823 return 824 gb2312 = text.encode('gb2312') 825 hex_str = binascii.b2a_hex(gb2312) 826 result = str(hex_str,encoding = 'utf-8' ) 827 828 area = eval('0x' + result[:2]) - 0xA0 829 index = eval('0x' + result[2:]) - 0xA0 830 offset = (94 * (area - 1)+ (index - 1))*32*4 831 font_rect = []*32*4 832 with open("D:/Mystudy/Python/pyGame/HZK32zkkh","rb") as f:#32x32字符集的地址,HZK32wryh 爲微軟雅黑字體,HZK32zkkh爲站酷酷黑字體 833 f.seek(offset) 834 font_rect = f.read(32*4) 835 f.close() 836 837 gMAT=[[0.0 for i in range(4)] for n in range(4)] 838 #temp=zuobiaostruct() 839 Point0=zuobiaostruct() 840 Point1=zuobiaostruct() 841 PointDis=zuobiaostruct() 842 843 gMAT=structure_3D() #//構建單位矩陣 844 gMAT=Translate3D(gMAT,-16,-12,-6); #//平移變換矩陣,可以調節字體相對中心軸的位置 845 gMAT=Scale_3D(gMAT,4,4,4); #//比例變換矩陣 846 gMAT=Rotate_3D(gMAT,ax,ay,az); #//旋轉變換矩陣 847 #gMAT=Translate3D(gMAT,8,8,8); #//平移變換矩陣 x:調節距離中心點的位置,至關於下面Point0.z 848 849 850 851 i=0 852 k=0 853 j=0 854 XO=0 855 YO=0 856 857 for i in range(32): 858 for k in range(8): 859 temp = 0x01 << k 860 for j in range(4): 861 data=font_rect[i*4+j] 862 if data & temp == temp: 863 864 Point0.x=32-(k+(3-j)*8) 865 Point0.y=i #(i*8)+k 866 Point0.z=Z_Size #//此參數可以改變字符距離旋轉軸中心的距離 867 868 Point1=vector_matrix_MULTIPLY(Point0,gMAT)#//矢量與矩陣相乘 869 PointDis=PerProject(Point1,XO,YO) #//映射投影 870 #PointDis.x+=SCREEN_X_MAX 871 #PointDis.y+=SCREEN_Y_MAX #//用來解決超出屏幕後亂碼的問題。去掉後順時針轉到超出左邊界後會找不到座標無限劃線, 872 Gui_Point(PointDis.x+x,PointDis.y+y,frontcolor) 873 else: 874 if model ==1: #模式爲1 時纔會繪製底色 875 Point0.x=32-(k+(3-j)*8) 876 Point0.y=i #(i*8)+k 877 Point0.z=Z_Size #//此參數可以改變字符距離旋轉軸中心的距離 878 879 Point1=vector_matrix_MULTIPLY(Point0,gMAT)#//矢量與矩陣相乘 880 PointDis=PerProject(Point1,XO,YO) #//映射投影 881 #PointDis.x+=SCREEN_X_MAX 882 #PointDis.y+=SCREEN_Y_MAX #//用來解決超出屏幕後亂碼的問題。去掉後順時針轉到超出左邊界後會找不到座標無限劃線, 883 Gui_Point(PointDis.x+x,PointDis.y+y,backcolor) 884 885 886 887 888 889 890 891 892 def example_1(ax,ay,az,x,y,char1,char2,forecolor,backcolor): 893 '''**********************************************************/ 894 |**函數: example_1 895 |**功能:旋轉立方體 + 旋轉字符,字符爲取模字符,支持取模,支持其餘Python環境 896 | 只能顯示取模字體 897 |**說明: 898 | ax,ay,az :角度值 899 | x,y: 欲顯示的座標位置 900 char1,char2:切換顯示哪一個字符 901 | Z_Size:距旋轉軸的距離 902 | frontcolor,backcolor:顏色,前景色和背景色 903 | 904 | 905 |**做者: wcc 執念執戰 906 |**時間:2019-6-3 907 |********************************************************''' 908 RateCube_size(ax,ay,az,x,y,forecolor,8,8,8,1) 909 RateCube_size(ax,ay+45,az,x,y,forecolor,12,12,12,1) 910 911 Show3DCharXxY(SETCH32X29[char1],29,4,ax,ay,az,x,y,-12,forecolor) 912 Show3DCharXxY(SETCH32X29[char2],29,4,ax,ay-90,az,x,y,-12,forecolor) 913 914 def example_2(ax,ay,az,x,y,char1,char2,forecolor,backcolor): 915 '''**********************************************************/ 916 |**函數: example_2 917 |**功能:旋轉立方體 + 旋轉字符,字符爲字符集,須要庫支持,須要字符集支持 918 | 修改內部的 char 字符串可現實任意(字符集所支持的)中文字符 919 |**說明: 920 | ax,ay,az :角度值 921 | x,y: 欲顯示的座標位置 922 char1,char2:切換顯示哪一個字符 923 | Z_Size:距旋轉軸的距離 924 | frontcolor,backcolor:顏色,前景色和背景色 925 | 926 | 927 |**做者: wcc 執念執戰 928 |**時間:2019-6-3 929 |********************************************************''' 930 931 char="執念執戰" 932 RateCube_size(ax,ay,az,x,y,forecolor,8,8,8,1) 933 RateCube_size(ax,ay,az,x,y,forecolor,12,12,12,1) 934 935 Show3D32x32Font(char[char1],ax,ay%90,az,x,y,-12,forecolor,backcolor,0) 936 Show3D32x32Font(char[char2],ax,ay%90-90,az,x,y,-12,forecolor,backcolor,0) 937 938 def example_3(ax,ay,az,x,y,char1,char2,forecolor,backcolor): 939 '''**********************************************************/ 940 |**函數: example_3 941 |**功能:旋轉的16x16的中文字符串 942 | 修改內部的 char 字符串可現實任意(字符集所支持的)中文字符 943 |**說明: 944 | ax,ay,az :角度值 945 | x,y: 欲顯示的座標位置 946 char1,char2:切換顯示哪一個字符 947 | Z_Size:距旋轉軸的距離 948 | frontcolor,backcolor:顏色,前景色和背景色 949 | 950 | 951 |**做者: wcc 執念執戰 952 |**時間:2019-6-3 953 |********************************************************''' 954 char="任意中文字符測試" 955 length = len(char) 956 for i in range(length): 957 Show3D16x16Font(char[i],ax,ay,az,x+16*4*i,y,2,forecolor,backcolor,0) 958 959
main.py 內容以下:
1 # -*- coding: utf-8 -*- 2 """ 3 Created on Mon Jun 3 14:41:48 2019 4 5 @author: Administrator 6 """ 7 8 9 from Transform3D import * 10 import cv2 11 12 def Pic3DShow(ax,ay,az,x,y,size): 13 '''**********************************************************/ 14 |**函數: Pic3DShow 15 |**功能:顯示3D圖片 16 |**說明:ax,ay,az:旋轉角度 17 | x,y:顯示位置 18 | size:放大倍數 19 本函數因爲是使用的基礎運算符,沒有加速,因此圖片過大時,佔用運算資源較多 20 修改成numpy來進行運算會快 21 | 22 |**做者: wcc 執念執戰 23 |**時間:2019-6-3 24 |********************************************************''' 25 26 27 color1=[0,0,0] 28 img=cv2.imread("D:/Mystudy/Python/pyGame/python.png") 29 width=img.shape[1] 30 height=img.shape[0] 31 32 gMAT=[[0.0 for i in range(4)] for n in range(4)] 33 Point0=zuobiaostruct() 34 Point1=zuobiaostruct() 35 PointDis=zuobiaostruct() 36 37 gMAT=structure_3D() #//構建單位矩陣 38 gMAT=Translate3D(gMAT,-(width/2),-(height/2),0); #//平移變換矩陣,繞着中心軸轉 39 gMAT=Scale_3D(gMAT,size,size,size); #//比例變換矩陣,放大多少倍 40 gMAT=Rotate_3D(gMAT,ax,ay,az); #//旋轉變換矩陣 41 42 43 for i in range(width): 44 for j in range(height): 45 color=img[j][i] 46 color1[0]=color[2] #將 opencv的BGR顏色轉換爲正常的RGB顏色 47 color1[1]=color[1] 48 color1[2]=color[0] 49 Point0.x=i 50 Point0.y=j 51 Point0.z=0 52 Point1=vector_matrix_MULTIPLY(Point0,gMAT) 53 PointDis=PerProject(Point1,0,0) 54 Gui_Point(PointDis.x+x,PointDis.y+y,color1) 55 56 57 58 SCREEN_X_MAX = 800 #屏幕的寬和高 59 SCREEN_Y_MAX = 600 60 61 BLACK=(0,0,0) 62 WHITE=(255,255,255) 63 RED=(255,0,0) 64 GREEN=(0,255,0) 65 BLUE=(0,0,255) 66 67 ForeColor = RED #前景色和背景色 68 BackColor = BLACK 69 70 71 pygame.init() 72 sx=0 73 sy=0 74 sz=0 75 turn=0 76 flg1=0 77 flg2=1 78 screen = pygame.display.set_mode((SCREEN_X_MAX,SCREEN_Y_MAX)) 79 80 while True: 81 for event in pygame.event.get(): 82 if event.type in (QUIT,KEYDOWN): 83 pygame.quit() 84 sys.exit() 85 86 sx+=1 87 sy+=1 88 sz+=1 89 turn+=1 90 if sy>89: 91 sy=0 92 flg1+=1 93 flg2+=1 94 if flg1>3: 95 flg1=0 96 if flg2>3: 97 flg2=0 98 screen.fill(BackColor) 99 example_1(0,sy,0,SCREEN_X_MAX/4,SCREEN_Y_MAX/2,flg1,flg2,ForeColor,BackColor) 100 example_2(0,sy,0,SCREEN_X_MAX/2+100,SCREEN_Y_MAX/2,flg1,flg2,ForeColor,BackColor) 101 example_3(0,turn,0,SCREEN_X_MAX/4,100,flg1,flg2,ForeColor,BackColor) 102 Pic3DShow(0,turn,0,100,100,3) 103 pygame.display.update() 104 #time.sleep(30/1000) #延時,防止速度過快 105
全部的代碼都有基本註釋,若是想要了解更詳細的的3D算法的實現能夠參考 https://wenku.baidu.com/view/ba9e9e64783e0912a2162ab2.html 等3維計算原理的講解。
本文代碼和字庫及圖片打包見 附件。
本文水平有限,內容不少詞語因爲知識水平問題不嚴謹或很離譜,但主要做爲記錄做用,能理解就行了,但願之後的本身和路過的大神對必要的錯誤提出批評與指點,對好笑的錯誤不要嘲笑,指出來我會改正的。
另外,轉載使用請註明出處。
-------------隨夢,隨心,隨願,執念執戰,執戰蒼天!