五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

STL模型在單片機(jī)上3D旋轉(zhuǎn)顯示

2023-07-05 14:46 作者:村夫唐某  | 我要投稿

STL文/件說(shuō)明:

??STL文/件是一種由三角形面組成3D模型的文/件,常用于3D打印機(jī)。 由于經(jīng)常接觸,就很好奇SLT文件到底怎么組成的?還可以怎么玩? 1:STL分為BIN格式和ASCLL格式。 BIN格式的構(gòu)成大概就一堆二進(jìn)制文/件,需要對(duì)應(yīng)結(jié)構(gòu)解碼使用。

ASCLL格式則是文本格式,用記事本就可以直觀看到數(shù)據(jù)說(shuō)明。

這里我的代碼是使用的BIN文/件格式解碼。。。 2:BIN格式STL文件說(shuō)明 可以看到圖片中的數(shù)據(jù),前80字節(jié)為文/件描述頭,

緊接著就是4字節(jié)的關(guān)鍵數(shù)據(jù):構(gòu)成物體的三角面?zhèn)€數(shù)。 源碼部分也是通過(guò)它來(lái)??【校驗(yàn)是否為BIN格式】??和??【顯示(點(diǎn)/線/面)】。

緊接著的就是每個(gè)面的數(shù)據(jù)了,一個(gè)面的描述共50字節(jié)。 3*4字節(jié)float浮點(diǎn)的法向量數(shù)據(jù)(x,y,z), 3*4字節(jié)float浮點(diǎn)的點(diǎn)1坐標(biāo)數(shù)據(jù)(x,y,z), 3*4字節(jié)float浮點(diǎn)的點(diǎn)2坐標(biāo)數(shù)據(jù)(x,y,z), 3*4字節(jié)float浮點(diǎn)的點(diǎn)3坐標(biāo)數(shù)據(jù)(x,y,z), 2字節(jié)的u16說(shuō)明數(shù)據(jù)(可忽略)。 源碼的編寫:

1:結(jié)構(gòu)體的定義 其實(shí)可以發(fā)現(xiàn)BIN格式的STL文/件就是面數(shù)量和面組成結(jié)構(gòu)比較重要, 所以代碼部分就省去了文/件的頭結(jié)構(gòu)體,你非得使用也沒事。。。 //三角面結(jié)構(gòu)體 typedef struct { ??float Normalvector[3];//法線矢量 ??float Vertex1[3];//頂點(diǎn)坐標(biāo)1 ??float Vertex2[3];//頂點(diǎn)坐標(biāo)2 ??float Vertex3[3];//頂點(diǎn)坐標(biāo)3 ??uint16_t attributebytexountend;//屬性統(tǒng)計(jì) } TRIAN; ////BIN格式STL文件結(jié)構(gòu)體?不重要,可以不用。 //typedef struct { //??u8 header[80]; //80字節(jié) “SOLID?”不重要 //??uint32_t Numberoftriangles;//三角面片數(shù)量 //??TRIAN trian; //} STL 2:驗(yàn)證是否是BIN格式STL文/件 由于文/件時(shí)存儲(chǔ)在SD卡文/件夾內(nèi)的,所以需要使用FAT文/件系統(tǒng)進(jìn)行文件讀取, 一般讀取SD文/件時(shí)大多是即用即取,這里全部讀取數(shù)據(jù)提高了數(shù)據(jù)獲取數(shù)據(jù),減少延時(shí)。 由于SLT-BIN格式?數(shù)據(jù)頭描述固定為80+4字節(jié),一個(gè)三角面的組成固定為50字節(jié), 所以就可以直接通過(guò)?【總字節(jié)=80+4+面*50】?進(jìn)行驗(yàn)證。 如上圖的正方形bin.STL文件 總字節(jié)數(shù)(684)=80+4+(三角面)12*50??驗(yàn)證通過(guò)。 //讀取文件全部一次讀取方便快速計(jì)算 ????f_read(&stl_file,file_buff,stl_file.obj.objsize,(UINT*)&br); ????LCD_ShowxNum(300,170,br,5,16,0); ????f_close(&stl_file);//關(guān)閉文件 stl_file.obj.objsize被釋放了 以br為主 ????? ????//獲取面?zhèn)€數(shù) ????tmp = (u8*)&number; ????reda=(file_buff+80); ????for(x=0;x<4;x++) *tmp++ = *reda++; ????Show_Str(30,190,200,16,"STL 三角面?zhèn)€數(shù)",16,0); ????LCD_ShowxNum(210,190,number,5,16,0); ????? ????///判斷是否為BIN格式STL?總字節(jié)=面?zhèn)€數(shù)*58+84 ????if(br != (number*50+84))? ????{ ??????Show_Str(30,210,400,24,"該STL文件不是BIN格式!",24,0); ??????while(1); ????} 3:需要特/別注意RAM的存取BUG 在代碼中,多次使用了最簡(jiǎn)單的?單字節(jié)指針進(jìn)行數(shù)據(jù)傳遞。 for(x=0;x<4;x++) *tmp++ = *reda++; 理論上只要數(shù)據(jù)類型(強(qiáng)/制轉(zhuǎn)換)一樣就可以用等式進(jìn)行傳遞, //trian2=*(TRIAN *)reda; 這是為什么呢?是因?yàn)榍懊嫖覀儗⑺蠸TL數(shù)據(jù)存儲(chǔ)在了RAM里面, 將指針指向文/件時(shí),在進(jìn)行float類型數(shù)據(jù)儲(chǔ)存時(shí),部分?jǐn)?shù)據(jù)沒有4字節(jié)對(duì)齊, 然后就直接觸發(fā)BUG了。。。。(調(diào)試了好久。。一把心酸淚啊。) reda=(file_buff+84+i*50); tmp = (u8*)&trian2; for(x=0;x<50;x++) *tmp++ = *reda++; //trian2=*(TRIAN *)reda;//直接取值會(huì)導(dǎo)致float 4字節(jié)不對(duì)齊 跑飛 4:3D物體的旋轉(zhuǎn)及顯示 旋轉(zhuǎn)部分移植的網(wǎng)友開源的代碼,也沒問(wèn)他具體哪里弄的(發(fā)現(xiàn)也是移植過(guò)的,OPENGL?)。自己也寫過(guò)三維矩陣代碼,但是沒這個(gè)快。功能沒這個(gè)多(后面不顯示,面填充(應(yīng)該是他寫的),面顏色角度渲染)。。。 這里是通過(guò)按鍵進(jìn)行點(diǎn),線,面進(jìn)行切換顯示。 ????????if(showmode==0) ????????{ ??????????//顯示點(diǎn) ??????????if(++color_nm > 9)color_nm=0; ??????????POINT_COLOR=color[color_nm];? ??????????pBackBuffer[(((int)cube[0][1]+LOGO16_GLCD_HEIGHT)*480+((int)cube[0][0])+LOGO16_GLCD_WIDTH)] = POINT_COLOR; ??????????if(++color_nm > 9)color_nm=0; ??????????POINT_COLOR=color[color_nm];? ??????????pBackBuffer[(((int)cube[1][1]+LOGO16_GLCD_HEIGHT)*480+((int)cube[1][0])+LOGO16_GLCD_WIDTH)] = POINT_COLOR; ??????????if(++color_nm > 9)color_nm=0; ??????????POINT_COLOR=color[color_nm];? ??????????pBackBuffer[(((int)cube[2][1]+LOGO16_GLCD_HEIGHT)*480+((int)cube[2][0])+LOGO16_GLCD_WIDTH)] = POINT_COLOR; ????????} ????????else if(showmode==1) ????????{ ??????????//顯示點(diǎn)連線?全顯示 ??????????if(++color_nm > 9)color_nm=0; ??????????POINT_COLOR=color[color_nm];? ??????????LCD_Buff_DrawLine(LOGO16_GLCD_WIDTH+cube[0][0],LOGO16_GLCD_HEIGHT+cube[0][1],LOGO16_GLCD_WIDTH+cube[1][0],LOGO16_GLCD_HEIGHT+cube[1][1],pBackBuffer); ??????????if(++color_nm > 9)color_nm=0; ??????????POINT_COLOR=color[color_nm]; ??????????LCD_Buff_DrawLine(LOGO16_GLCD_WIDTH+cube[0][0],LOGO16_GLCD_HEIGHT+cube[0][1],LOGO16_GLCD_WIDTH+cube[2][0],LOGO16_GLCD_HEIGHT+cube[2][1],pBackBuffer); ??????????if(++color_nm > 9)color_nm=0; ??????????POINT_COLOR=color[color_nm]; ??????????LCD_Buff_DrawLine(LOGO16_GLCD_WIDTH+cube[1][0],LOGO16_GLCD_HEIGHT+cube[1][1],LOGO16_GLCD_WIDTH+cube[2][0],LOGO16_GLCD_HEIGHT+cube[2][1],pBackBuffer); ????????} ????????else ????????{ ??????????//判斷是否顯示面? ??????????dx0=cube[1][0]-cube[0][0]; ??????????dx1=cube[2][0]-cube[0][0]; ??????????dy0=cube[1][1]-cube[0][1]; ??????????dy1=cube[2][1]-cube[0][1]; ??????????if(dx0*dy1 > dx1*dy0) ??????????{ ????????????trian2.Normalvector[0]=((cube[1][1]-cube[0][1])*(cube[2][2]-cube[0][2]))-((cube[1][2]-cube[0][2])*(cube[2][1]-cube[0][1])); ????????????trian2.Normalvector[1]=((cube[1][2]-cube[0][2])*(cube[2][0]-cube[0][0]))-((cube[1][0]-cube[0][0])*(cube[2][2]-cube[0][2])); ????????????trian2.Normalvector[2]=((cube[1][0]-cube[0][0])*(cube[2][1]-cube[0][1]))-((cube[1][1]-cube[0][1])*(cube[2][0]-cube[0][0])); ????????????lenSq = trian2.Normalvector[0]*trian2.Normalvector[0]+ trian2.Normalvector[1]*trian2.Normalvector[1]+ trian2.Normalvector[2]*trian2.Normalvector[2]; ????????????ilen = sqrt(lenSq); ????????????if (fabs(ilen) > 0.001f) ilen = 1.0f/ilen; ????????????else ilen = 0; ????????????trian2.Normalvector[2] *= ilen; ????????????POINT_COLOR = sqrt(trian2.Normalvector[2]) * 31.5f; ????????????RotatePoly(cube,3); ????????????renderPolygonSub(cube,3,POINT_COLOR); ??????????}?????????? ????????} 程序源碼工程附近不支持上傳,這里附上鏈接,或者在開源廣場(chǎng)搜索此文章找到對(duì)應(yīng)工程附件下載就行。 https:// oshwhub.com /article/dan-pian-ji-xuan-zhuai-xian-shi-3dmu-xing-stl

STL模型在單片機(jī)上3D旋轉(zhuǎn)顯示的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
砀山县| 石河子市| 凯里市| 青河县| 涟源市| 鸡东县| 临武县| 荃湾区| 泊头市| 平顶山市| 八宿县| 固安县| 庆云县| 南岸区| 临潭县| 晋城| 福安市| 鄢陵县| 罗山县| 英德市| 广南县| 日喀则市| 红桥区| 河间市| 建平县| 东海县| 普陀区| 辽源市| 齐齐哈尔市| 乐陵市| 浦县| 南乐县| 淮阳县| 固镇县| 黑河市| 安国市| 沧州市| 朝阳市| 台南县| 湘潭市| 东乌珠穆沁旗|