當前位置:首頁 » 編程軟體 » 骨架編程

骨架編程

發布時間: 2023-08-02 14:32:55

1. 加工中心上G16代碼怎樣編程詳細點!

G16 G17 G90極坐標建立G01 X...Y....F.... 其中X指終點到原點的距離,也就是模或半徑。Y指終點與原點連線和 X正半軸的夾角.....G15 取消極坐標。

① G41 D01 G16 G01 X36.0 Y-5.0 F100;

G41刀具半徑左補償 順著加工方向刀具在工件的左側。

G16 極坐標編程 X 極軸長Y 角度。

② G02 X24.0 Y-5.0 R6.; ①和② 角度都是 -5 極軸長不一樣。

③ G03 X24.0 Y275.0 R-24.0; 圓弧大於180°用 R負。

④ G02 X36.0 Y275.0 R6.0;

⑤ G02 X36.0 Y-5.0 R-36.0; ⑤和①點位是同一個點。

(1)骨架編程擴展閱讀:

數控機床通常使用G代碼來描述機床的加工信息,如走刀軌跡、坐 標系的選擇、冷卻液的開斗碼扒啟等,將G代碼解釋為數控系統能夠識別的數據塊是G代碼解釋器的主要功能。G代碼解釋器的開放性也是設計和實現中必須要考慮的問題。在G代碼解釋器中,對G 代空昌碼進行關鍵字分解是骨架,對代碼進行分組則是進行語法檢查的基礎。

2. g代碼編程實例及解釋有哪些

G代碼是數控程序中的指令。一般都稱為G指令。使用G代碼可以實現快速定位、逆圓插補、順圓插補、中間點圓弧插補、半徑編程、跳轉加工。

G00------快速定位

G01------直線插補

G02------順時針方向圓弧插補

G03------逆時針方向圓弧插補

G04------定時暫停

G05------通過中間點圓弧插補

G06------拋物線插補

G07------Z 樣條曲線插補

G08------進給加速

G09------進給減速

G10------數據設置

G16------極坐標編程

(2)骨架編程擴展閱讀:

在G代碼解釋器中,對G代碼進行關鍵字分解是骨架,,對代碼進行分組則是進行語法檢查的基 礎。王心光等人在虛擬數控加工模擬中使用Microsoft的GRETA正則類庫,解決了G代碼關鍵詞分解問題,這種方法建立在 Microsoft提供的工具基礎上,同時使用C++語言;付振山使用VC++ 6.0 開發, 構造了有窮自動機來描述在輸入字元串中關鍵字識別模式G代碼解釋器是全軟體式數控系統的重要模塊。

3. 如何做人體骨架模型

本文提供一種將骨架動作矢量映射到人體骨架模型的一種方法,通過輸入各個骨骼的當前方向,反饋給骨架模型,這樣就實現了動畫的效果。實驗開發工具是VC6.0在OpenGL平台上開發完成。

閱讀對象:

假定讀者已經熟悉OpenGL編程,就算不熟悉,只要了解基本的旋轉,平移,堆棧操作就好。
假定讀者已經了解基本的c++編程,其中需要了解遞歸的演算法,遞歸的方法請參考一下數據結構吧。

製作過程:

第一步,3D模型准備

這一步驟的目的是提供分解的骨骼模型,它需要導出多個組成身體結構的文件,模型可以不用自己製作,只要到網上找找吧,應該很多,最好是是人體模型,如果用動物的模型也可以,不過需要自己定義映射骨架了,比如圖中的骷髏模型是我從人體動畫軟體poser 5.0找到的。然後使用3d max 將身體的各個部位導出為3ds文件,這個步驟很簡單,也不需要有什麼3d max的基礎。這里有一個小的技巧就是可以選中多個部分作為一個3ds模型導出,比如我需要將左右肩胛骨與脊椎骨肋骨作為同一個部分導出,這樣可以將它命名為身體軀干(body)。這樣我們就准備了各個3ds文件了,分別是:

身體軀干 BODY.3DS
頭部 HEAD.3DS
左臂 LSHOULDER.3DS
右臂 RSHOULDER.3DS
左小臂 LELBOW.3DS
右小臂 RELBOW.3DS
左大腿 LTHIGH.3DS
右大腿 RTHIGH.3DS
左小腿 LFEET.3DS
右小腿 RFEET.3DS

這樣這些組成部分就可以靈活的拼接出一個人體來了。

第二步,定義相關的核心數據結構

為了得到運動的各個身體部分數據信息,我們需要存儲一些運動信息,主要有:
骨骼ID
骨骼關節的當前位置;r_x,r_y,r_z
骨骼之間的關系,例如手臂是軀乾的延伸,而左小臂是左臂的延伸;PID,CID

我們可以通過下圖來了解骨骼之間的結構關系

存放3ds文件位置;file_name_3ds
3ds模型的初始化方向;這個是比較抽象一點的概念,它是指從父節點指向子節點的方向,例如左小臂的初始位置是平放向下,那麼對應的矢量就是 (-0.2,-1,0)

以下是數據結構部分:
class bone
{
public:
int y;
int x;
int r_z; //現實世界z坐標
int r_y;
int r_x;
int rotated_X; //旋轉後的坐標
int rotated_Y;
int is_marked; //是否已經標記
int PID; //父節點
int CID; //子節點,目前針對軸關節和膝蓋有效
float start_arc_x,end_arc_x; //相對父節點的x 左右方向轉動角度限制
float start_arc_y,end_arc_y; //相對父節點的y 上下方向轉動角度限制
float start_arc_z,end_arc_z; //相對父節點的z 前後方向轉動角度限制
double LengthRatio;
char name[80]; //名稱
char file_name_3ds[180]; //3ds文件名稱
int ID;
bone(int ID,char *name,int PID);
virtual ~bone();
float bone_init_x,bone_init_y,bone_init_z; //初始化骨骼的矢量方向,3d max 模型
};

第三步,初始化骨架結構

在定義了bone的結構以後,我們定義一個skeleton類來在第一次初始化時載入這些結構,

obone = bone (2,"head",1); //定義一個bone
strcpy(obone.file_name_3ds,"head.3DS"); //設置它的3ds文件名
obone.bone_init_x = 0; //初始化骨骼的矢量方向
obone.bone_init_y = 1;
obone.bone_init_z = 0;
bonevec.push_back (obone); //放入vector結構,這里用到了STL編程技術中的vector

以下是實現的部分代碼:
skelecton::skelecton()
{
float fy = 0.56f ;
float ftx = 0.19f;
float ffx = 0.08f;
bone obone = bone (1,"neck",0);
bonevec.push_back (obone);

obone = bone (2,"head",1);
strcpy(obone.file_name_3ds,"head.3DS");
obone.bone_init_x = 0;
obone.bone_init_y = 1;
obone.bone_init_z = 0;
bonevec.push_back (obone);

obone = bone (3,"rShoulder",1);
bonevec.push_back (obone);

obone = bone (4,"lShoulder",1);
bonevec.push_back (obone);

obone = bone (5,"rElbow",3);
strcpy(obone.file_name_3ds,"rShoulder.3DS");
obone.bone_init_x = fy;
obone.bone_init_y = -1;
obone.bone_init_z = 0;
obone.CID = 7;
bonevec.push_back (obone);

obone = bone (6,"lElbow",4);
strcpy(obone.file_name_3ds,"lShoulder.3DS");
obone.bone_init_x = -fy;
obone.bone_init_y = -1;
obone.bone_init_z = 0;
obone.CID = 8;
bonevec.push_back (obone);

//.............太長只給出部分的代碼..........................
}

第四步,學習3ds公共的類CLoad3DS,可以用來載入顯示模型

這個類是公用一個類,詳細的類CLoad3DS的介面信息可以到一個open source項目里參考。http://scourge.sourceforge.net
http://scourge.sourceforge.net/api/3ds_8h-source.html
實際上在使用這個類時候,我做了一些修改,加了得到最大頂點的方法。這個在第五步會說明。

我們定義一個OpenGL的類來做模型控制類,負責載入模型,

CLoad3DS* m_3ds;

int OpenGL::Load3DS(int ID, char *filename)
{
if(m_3ds!=NULL) m_3ds->Init(filename,ID);
return 0;
}

然後在顯示時候調用

int OpenGL::show3ds(int ID)
{
m_3ds->show3ds(ID,0,0,0,2);
return 0;
}

第五步,使用遞歸方法分層次載入模型

這里是重點的內容了,讓我們思考一些問題,實現骨骼會隨著輸入的方向而改變方向,需要做那些事情呢?

首先針對一塊骨骼來考慮:

第一,我們需要讓骨骼繞著它的節點旋轉到輸入的方向上

第二,我們需要知道骨骼目前節點的位置,才能旋轉。可是我們知道骨骼會跟著它的父骨骼轉動的,例如左小臂會跟著左臂轉動,當身體轉動時左臂也會跟著身體轉動的,這里看起來像是有一個父子連動的關系,所以當前節點的位置會與它的父骨骼有關,父骨骼轉動的角度,子骨骼也必須轉動,所以這里自然想到了遞歸模型了,至於如何存儲這些轉動過程呢,還好openGL提供了glPushMatrix();glPopMatrix();那麼所有的子骨骼必須包含在父骨骼的glPushMatrix();glPopMatrix();好了,這個變成

//遞歸實現3d現實
int skelecton::Render_skeleton_3D(int ID)
{

glPushMatrix(); //開始記錄堆棧
joint_point = pgl->get_joint_point(ID); //找到節點位置
glTranslatef(joint_point.x,joint_point.y,joint_point.z); //坐標移到節點位置
pgl->rotate_bone (vt1,vt2,vto); //旋轉骨骼到指定的方向
glTranslatef(-joint_point.x,-joint_point.y,-joint_point.z);//坐標移回來
pgl->show3ds(ID); //顯示模型

//遍歷子節點
for (theIterator = bonevec.begin(); theIterator != bonevec.end(); theIterator++)
{
pbone = theIterator;
if((pbone->PID == ID) )
{
Render_skeleton_3D(pbone->ID); //遞歸調用
}
}

glPopMatrix(); //退出記錄堆棧
}

剩下需要解決的問題就是如何找到節點位置。
尋找節點位置,我們看到上面代碼 get_joint_point(ID)就是找到節點了,其實如果不追求高的准確度,我們可以假設每個模型的最高的點即為骨骼的節點,當然這個假設前提是人體模型是正面站立的,手臂自然垂下,這樣可以近似認為每個模型的最高的點即為骨骼的節點,這樣函數就很簡單了,這個方法是修改了Cload3ds類的方法,如下:

Vector3f CLoad3DS::get_joint_point(int j0)
{
CVector3 LastPoint;
Vector3f vect;
LastPoint.y = -1000 ;
if(j0==2) LastPoint.y = 1000 ;//頭部節點朝下

// 遍歷模型中所有的對象
for(int l = 0; l < g_3DModel[j0].numOfObjects; l++)
{
if(g_3DModel[j0].pObject.size() <= 0) break;// 如果對象的大小小於0,則退出
t3DObject *pObject = &g_3DModel[j0].pObject[l];// 獲得當前顯示的對象

for(int j = 0; j < pObject->numOfFaces; j++) // 遍歷所有的面
{
for(int tex = 0; tex < 3; tex++) // 遍歷三角形的所有點
{
int index = pObject->pFaces[j].vertIndex[tex]; // 獲得面對每個點的索引

if(j0==2)
{
if(pObject->pVerts[index].y < LastPoint.y )
LastPoint = pObject->pVerts[index];
}
else
{
if(pObject->pVerts[index].y > LastPoint.y )
LastPoint = pObject->pVerts[index];
}
}
}
}
vect.x = LastPoint.x ;
vect.y = LastPoint.y ;
vect.z = LastPoint.z ;
return vect;
}

比較特殊的是頭部節點是通過脖子連接的,所以它是取最低的點。

現在解決最後的問題了,如何旋轉了,具體來講就是骨骼從原來自然的狀態旋轉到目前的方向,例如手臂從自然垂下變成抬起,垂下和抬起兩個狀態的矢量是不同的方向的,如何旋轉呢? 這里就要用到了空間幾何里的點積和叉積的概念了,簡單來講就是利用點積來求矢量夾角餘弦,利用叉積來求兩個矢量的法向量,如果你忘記了這些概念,可以回去參考一下高等數學書,這個連接也提供了一些資料,可以幫助理解http://www.gameres.com/Articles/Program/Visual/Other/shiliang.htm
然後呢,我們知道了兩個矢量的夾角與它們的法向量,下面的事情就變得簡單了,我們讓骨骼原來的矢量以法向量為旋轉軸,旋轉一定角度,這個角度就是兩個矢量的夾角,這樣問題就解決了,所以這里的代碼如下:

int OpenGL::rotate_bone(Vector3f vVector1, Vector3f vVector2, Vector3f vVectorOrgin)
{
Vector3f vt1 = Vector3f(vVector1.x,vVector1.y,vVector1.z);
Vector3f vt2 = Vector3f(vVector2.x,vVector2.y,vVector2.z);
Vector3f vt4 = vt2-vt1;

double arc12 = AngleBetweenVectors(vVectorOrgin,vt4);
double rarc12 = 180*arc12/pi;
float len= Distance(vt1,vt2);
Vector3f vt3 = Cross(vVectorOrgin,vt4);
glRotatef ((float)rarc12,vt3.x,vt3.y,vt3.z);

return 0;
}

熱點內容
徵婚交友源碼 發布:2025-02-05 17:45:24 瀏覽:918
3nvm伺服器怎麼搭建 發布:2025-02-05 17:43:52 瀏覽:661
cocosandroid開發 發布:2025-02-05 17:22:17 瀏覽:669
編程員發型 發布:2025-02-05 17:09:18 瀏覽:226
網站會員管理源碼 發布:2025-02-05 17:03:32 瀏覽:194
伺服器埠怎麼調節 發布:2025-02-05 16:57:41 瀏覽:48
樂山海棠社區民意上傳 發布:2025-02-05 16:55:52 瀏覽:511
編程老爺爺 發布:2025-02-05 16:48:20 瀏覽:130
支持ftp的免費空間 發布:2025-02-05 16:32:00 瀏覽:891
python時間比較 發布:2025-02-05 16:31:46 瀏覽:52