我正在处理创建一些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()'函数吗?您不需要任何额外的用户交互内容。当我尝试从你的例子中获得最小值时,我会得到一个黑色的草图。只需硬编码显示问题所需的变量,然后将其他所有内容排除在外。 –