Я возился с обработкой, создавая некоторые 3D-объекты, и я создал рекурсивный метод, который, как я надеюсь, сгенерирует объект, похожий на палец, с большим количеством степеней свободы. Идея состоит в том, что каждый сегмент, отображаемый в виде прямоугольника, создает новый сегмент, так что его нижняя грань находится в том же месте, что и нижняя грань предыдущего сегмента (показано ниже).
Проблема в том, что когда я пытаюсь повернуть более одной оси (т. е. установить для deltaX и deltaZ значение 0,3), мой алгоритм дает сбой, и я получаю что-то странное (покажите ниже).
Я использовал матрицы вращения, чтобы попытаться вычислить, где база нового сегмента должна основываться на старой, и она работает только для одной оси вращения, но не работает для нескольких (математика находится в операторе if). Я видел сообщения о кватернионах, но мне просто любопытно, почему моя матричная математика не работает, или действительно ли кватернионы намного лучше, как я могу реализовать их в своем коде. Заранее спасибо!
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);
}
}
finger()
? - person Kevin Workman   schedule 08.01.2016draw()
, которая вызывает вашу функциюfinger()
? Вам не нужны какие-либо дополнительные элементы взаимодействия с пользователем. Когда я пытаюсь получить минимум из вашего примера, я получаю черный набросок. Просто жестко закодируйте переменные, необходимые для демонстрации проблемы, и оставьте все остальное. - person Kevin Workman   schedule 08.01.2016