我正在制作一个在Processing中使用SimpleOpenNI库的草图,我在骨架上安装了一个3D设计,但我一直在想,如果一个不同的人站在Kinect前面,模型将是不同的是,如果这个人比我更高或更小,因为我正在做测试,我想知道是否有一种方法来缩放SimpleOpenNI制作的骨架,所以我可以把它作为我草图中的标准所以任何人前面的支架将与草图中的高度相同,并且3D的所有部分将保持在同一位置。 我希望你们能给我一个提示,因为这是我第一个使用骨架的项目。 谢谢!
答案 0 :(得分:2)
如果你想以相同的比例绘制3D骨架,你可以创建一个3D场景,在固定的位置用固定的摄像头表示骨架(这样刻度不会改变),只需使用关节的方向(旋转矩阵)(不是位置)更新您的自定义头像/角色表示。
使用SimpleOpenNI的getJointOrientationSkeleton()
方法,您可以获得PMatrix3D的方向。然后,您可以使用Processing的applyMatrix()定位自定义网格:
PMatrix3D orientation = new PMatrix3D();
context.getJointOrientationSkeleton(userId,SimpleOpenNI.SKEL_HEAD,orientation);
pushMatrix();
applyMatrix(orientation);//rotate box based on head orientation
box(40);
popMatrix();
或作为最小样本:
import SimpleOpenNI.*;
SimpleOpenNI context;
PMatrix3D orientation = new PMatrix3D();//create a new matrix to store the steadiest orientation (used in rendering)
PMatrix3D newOrientaton = new PMatrix3D();//create a new matrix to store the newest rotations/orientation (used in getting data from the sensor)
void setup() {
size(640, 480,P3D);
context = new SimpleOpenNI(this);
context.enableUser();//enable skeleton tracking
}
void draw(){
context.update();
background(0);
lights();
translate(width * .5, height * .5,0);
if(context.isTrackingSkeleton(1)){//we're tracking user #1
newOrientaton.reset();//reset the raw sensor orientation
float confidence = context.getJointOrientationSkeleton(userId,SimpleOpenNI.SKEL_HEAD,newOrientaton);//retrieve the head orientation from OpenNI
if(confidence > 0.001){//if the new orientation is steady enough (and play with the 0.001 value to see what works best)
orientation.reset();//reset the matrix and get the new values
orientation.apply(newOrientaton);//copy the steady orientation to the matrix we use to render the avatar
}
//draw a box using the head's orientation
pushMatrix();
applyMatrix(orientation);//rotate box based on head orientation
box(40);
popMatrix();
}
}
由您来组织角色的层次结构并设置具有所需视角的camera。