我正在尝试根据XR_EXT_hand_tracking扩展中的XrHandJointLocationEXT
数组给出的位置在 3D 空间中渲染手的模型。我正在使用Valve 的两个 GTLF 手模型,它们具有正确数量的骨骼以匹配XrHandJointEXT枚举中 OpenXR 规范定义的关节。
我的渲染如下:
每一帧我通过将其当前变换与从 GLTF 模型中检索到的逆绑定矩阵相乘来独立更新每个关节。XrPosef
相对于 3D 空间的中心。我正在使用cglm来处理所有的矩阵计算。
for (size_t i = 0; i < XR_HAND_JOINT_COUNT_EXT; ++i) {
const XrHandJointLocationEXT *joint = &locations->jointLocations[i];
const XrPosef *pose = &joint->pose;
glm_mat4_identity(model->bones[i]);
vec3 position;
wxrc_xr_vector3f_to_cglm(&pose->position, position);
glm_translate(model->bones[i], position);
versor orientation;
wxrc_xr_quaternion_to_cglm(&pose->orientation, orientation);
glm_quat_rotate(model->bones[i], orientation, model->bones[i]);
glm_mat4_mul(model->bones[i], model->inv_bind[i], model->bones[i]);
}
然后将该数组与为每个HMD
计算的矩阵bones
一起上传到顶点着色器。view-proj
eye
#version 320 es"
uniform mat4 vp;
uniform mat4 bones[26];
layout (location = 0) in vec3 pos;
layout (location = 1) in vec2 tex_coord;
layout (location = 2) in uvec4 joint;
layout (location = 3) in vec4 weight;
out vec2 vert_tex_coord;
void main() {
mat4 skin =
bones[joint.x] * weight.x +
bones[joint.y] * weight.y +
bones[joint.z] * weight.z +
bones[joint.w] * weight.w;
gl_Position = vp * skin * vec4(pos, 1.0);
vert_tex_coord = tex_coord;
}
计算方法是否正确?我得到了不错但“有问题”的结果。正如您在以下屏幕截图中看到的那样,我在手部模型上渲染了两个独立关节,您可以看到拇指上的故障。
在计算我的骨骼变换时我应该考虑到父骨骼吗?