这将是一个“奇怪”的问题,因为我的代码有效。我只想检查是否可以调整,因为我没有编程经验。 我写了一个脚本,它获取了一个kinect关节流,并在一个带有webgl渲染器的坐标系上的三个js场景上绘制它们。 首先,我基于Stemkoski的示例创建一组球体,然后为更新函数中的json骨架添加事件侦听器,这样我就可以更新球体坐标并使其移动。 这样做的唯一问题是,现在我不能用我的鼠标旋转坐标系统(当我用静态球体或脉冲球体测试时,我可以这样做,如Stemkoski的例子)。 所以第一个问题是如何纠正这个问题。 第二个更复杂的问题是:这是正确的做法吗?我可能不是开发人员,但我了解到,当我的直觉说这是尴尬或不好的做法时,它可能是......任何帮助和建议,赞赏。 哦,我已经为场景中的一个骨架实现了这个。我将尝试为更多的骷髅制作它,但我会等待你的输入,以防这一切都更简单,写得更好。 这是相关的代码,球体/关节的初始化和更新函数:
WholeSkeleton = new THREE.Object3D();
particleAttributes = { startSize: [], startPosition: [] };
var totalParticles = 20; //=num.skeleton.joints //add later variable number
var radiusRange = 50;
for (var i = 0; i < totalParticles; i++) { // INITIALIZE THE SKELETON JOINTS POSITION
var sphereMaterial = new THREE.MeshLambertMaterial({ color: 'rgb(255,0,0)' });
var jointSphere = new THREE.Mesh(sphereGeometry, sphereMaterial);
//initialize positions
jointSphere.position.set(0, 0, 0);
WholeSkeleton.add(jointSphere);
// add variable qualities to arrays, if they need to be accessed later
particleAttributes.startPosition.push(jointSphere.position.clone());
}
scene.add(WholeSkeleton);
}
function animate() {
requestAnimationFrame(animate);
render();
update();
}
function update() {
document.addEventListener("skeletonEvent", function (e) {
jsonObject = e.detail.SkeletonSourceData;
// for (var i = 0; i < jsonObject.Skeletons.length; i++) {
for (var j = 0; j < jsonObject.Skeletons[0].Joints.length; j++) { //only for skeleton 0.
var incoming=jsonObject.Skeletons[0].Joints[j];
var joint = WholeSkeleton.children[j];
joint.position.x = (particleAttributes.startPosition[j].x + incoming.Position.X)*30;
joint.position.y = (particleAttributes.startPosition[j].y + incoming.Position.Y)*30;
joint.position.z = (particleAttributes.startPosition[j].z + incoming.Position.Z)*10;
}
// }
});
}
-