我正在處理創建一些3D對象,並創建了一個遞歸方法,我希望能夠生成更多自由度的手指狀對象。這個想法是,每個分段顯示爲一個框,生成一個新的分段,以便它的底面與前一個分段的底部位於相同的位置(如下所示)。 矩形棱鏡的3D旋轉
問題是,當我嘗試旋轉多個軸(即將deltaX和deltaZ設置爲0.3)時,我的算法失敗,我得到了一些奇怪的東西(如下所示)。
我使用了旋轉矩陣,以便嘗試計算新段的基礎應該基於舊段,它只適用於1個旋轉軸,但在多個時失敗(數學運算在if語句中) 。我已經看過有關Quaternion的文章,但我真的只是好奇爲什麼我的矩陣數學運算不起作用,或者如果Quaternion真的好得多,我可以在我的代碼中實現它們。提前致謝!
void finger(float x, float y, float z, float rx, float ry, float rz, float r,
float h){
translate(x,-y,z);
rotateX(rx);
rotateY(ry);
rotateZ(rz);
translate(0,-h/2,0);
box(r,h,r);
translate(0,h/2,0);
rotateZ(-rz);
rotateY(-ry);
rotateX(-rx);
translate(-x,y,-z);
if(r>10){
finger(x+h*sin(rx)*sin(ry)*cos(rz)+h*cos(rx)*sin(rz),y-h*sin(rx)*sin(ry)*sin(rz)+
h*cos(rx)*cos(rz),z-h*sin(rx)*cos(ry),rx+deltaX,ry+deltaY,rz+deltaZ,r-4,h-5);
}
}
[編輯:MCVE下面,包括我的用於在3D空間中移動的代碼,和設置/變量初始化] [編輯(2):MCVE更新,改變DELTAX,移動deltaY,deltaZ用於移動]
float deltaX,deltaY,deltaZ;
void setup(){
deltaX=0;
deltaY=0;
deltaZ=0;
fullScreen(P3D);
}
void draw(){
noStroke();
camera(-600, -400, -600, 0, -300, 0, 0, 1, 0);
background(#51B6F5);
directionalLight(255,255,255,0.5,1,0.5);
directionalLight(255,255,255,-0.5,1,-0.5);
box(400,10,400);
tree(0,0,0,0,0,0,40,100);
}
void tree(float x, float y, float z, float rx, float ry, float rz, float r, float h){
translate(x,-y,z);
rotateX(rx);
rotateY(ry);
rotateZ(rz);
translate(0,-h/2,0);
box(r,h,r);
translate(0,h/2,0);
rotateZ(-rz);
rotateY(-ry);
rotateX(-rx);
translate(-x,y,-z);
if(r>10){
tree(x+h*sin(rx)*sin(ry)*cos(rz)+h*cos(rx)*sin(rz),y-h*sin(rx)*sin(ry)*sin(rz)+h*cos(rx)*cos(rz),z-h*sin(rx)*cos(ry),rx+deltaX,ry+deltaY,rz+deltaZ,r-4,h-5);
}
}
你可以發佈一個[MCVE](http://stackoverflow.com/help/mcve)而不只是你的'finger()'方法嗎? –
當然,補充。它只包含我在3D空間中移動的代碼,繪製方法中繪製的框和變量初始化。 – Changming
我並不想討厭,但這對MCVE來說太多了。你可以用一個簡單的'draw()'函數發佈一個基本的草圖來調用你的'finger()'函數嗎?您不需要任何額外的用戶交互內容。當我嘗試從你的例子中獲得最小值時,我會得到一個黑色的草圖。只需硬編碼顯示問題所需的變量,然後將其他所有內容排除在外。 –