const threeBehavior = Behavior({
|
methods: {
|
updateThreeMatrix() {
|
// 同步 VKCamera 矩阵信息到 Three Camera
|
if (VKCamera) {
|
// VK接管相机矩阵
|
this.camera.matrixAutoUpdate = false
|
|
// VK ViewMatrix 返回列主序
|
this.camera.matrixWorldInverse.fromArray(VKCamera.viewMatrix)
|
this.camera.matrixWorld.getInverse(this.camera.matrixWorldInverse)
|
|
const projectionMatrix = VKCamera.getProjectionMatrix(NEAR, FAR)
|
|
// projectionMatrix[0] = projectionMatrix[0] / 2;
|
// projectionMatrix[5] = projectionMatrix[5] / 2;
|
|
// VK 返回列主序
|
// 设置 投影矩阵
|
this.camera.projectionMatrix.fromArray(projectionMatrix)
|
this.camera.projectionMatrixInverse.getInverse(this.camera.projectionMatrix)
|
}
|
|
|
// 存在model,更新矩阵
|
if (this.modelWrap && this.points3d && this.shoeTransform) {
|
// console.log('toUpdate')
|
const THREE = this.THREE;
|
|
// 顶点偏移矩阵
|
const positionMat = new THREE.Matrix4();
|
// 认为点 0 0 0
|
positionMat.setPosition(0, 0, 0);
|
|
// Anchor返回矩阵,实际上就是完整的 modelView matrix
|
const anchorMatrix = new THREE.Matrix4();
|
// 目前返回的是行主序矩阵
|
anchorMatrix.set(
|
this.shoeTransform[0], this.shoeTransform[1], this.shoeTransform[2], this.shoeTransform[3],
|
this.shoeTransform[4], this.shoeTransform[5], this.shoeTransform[6], this.shoeTransform[7],
|
this.shoeTransform[8], this.shoeTransform[9], this.shoeTransform[10], this.shoeTransform[11],
|
this.shoeTransform[12], this.shoeTransform[13], this.shoeTransform[14], this.shoeTransform[15],
|
);
|
// 两者叠加
|
// const modelWorld = positionMat.multiply(anchorMatrix);
|
|
const modelWorld = anchorMatrix;
|
|
const pos = new THREE.Vector3();
|
const quaternion = new THREE.Quaternion();
|
const scale = new THREE.Vector3();
|
|
// 解析出 实际的 信息
|
modelWorld.decompose(pos, quaternion, scale );
|
console.log(pos, quaternion, scale);
|
|
// 设置到容器节点上
|
this.modelWrap.position.set(pos.x, pos.y, pos.z);
|
this.modelWrap.quaternion.set(quaternion.x, quaternion.y, quaternion.z, quaternion.w);
|
this.modelWrap.scale.set(scale.x, scale.y, scale.z);
|
|
if (this.model) {
|
// 先把模型放置在脚踝
|
// this.model.position.set(this.points3d[0].x, this.points3d[0].y, this.points3d[0].z);
|
}
|
|
if (this.hintBoxList && this.hintBoxList.length > 0) {
|
// console.log('ready to set', this.hintBoxList);
|
// 存在提示列表,则更新点信息
|
for (let i = 0; i < this.hintBoxList.length; i++) {
|
const hintBox = this.hintBoxList[i];
|
hintBox.position.set(this.points3d[i].x, this.points3d[i].y, this.points3d[i].z);
|
}
|
// console.log('seted', this.hintBoxList);
|
}
|
|
|
// debug 用信息
|
if (!loggerOnce) {
|
// console.log('positionMat', positionMat);
|
// console.log('anchorMat', anchorMat);
|
// console.log('modelWorld', modelWorld);
|
|
// console.log('projectionMatrix', this.camera.projectionMatrix);
|
|
// console.log('this.modelWrap.position', this.modelWrap.position);
|
// console.log('this.modelWrap.quaternion', this.modelWrap.quaternion);
|
// console.log('this.modelWrap.scale', this.modelWrap.scale);
|
|
// console.log('domSize', this.data.domWidth, this.data.domHeight)
|
// VK 直接数值
|
console.log('joints', Array.from(this.points3d))
|
console.log('viewMatrix', Array.from(VKCamera.viewMatrix))
|
console.log('projectionMatrix', Array.from(VKCamera.getProjectionMatrix(NEAR, FAR)))
|
console.log('anchorTransform', Array.from(this.shoeTransform));
|
|
loggerOnce = true;
|
}
|
}
|
|
// 渲染 Three 场景
|
this.renderer.autoClearColor = false
|
this.renderer.state.setCullFace(this.THREE.CullFaceBack)
|
this.renderer.render(this.scene, this.camera);
|
// 为什么去掉这句话会画不出来,我感觉大概率是YUV的面朝向错了
|
this.renderer.state.setCullFace(this.THREE.CullFaceNone)
|
},
|
addShoeHintBox() {
|
const THREE = this.THREE;
|
|
const wrap = this.modelWrap;
|
|
const geometry = new THREE.BoxGeometry( 1, 1, 1 );
|
const boxScale = 0.3;
|
|
const hintBoxList = [];
|
for (let i = 0; i < 8; i++) {
|
const colorHex = (i * 2).toString(16);
|
const material = new THREE.MeshPhysicalMaterial( {
|
metalness: 0.0,
|
roughness: 0.5,
|
color: parseInt(`${colorHex}${colorHex}${colorHex}${colorHex}${colorHex}${colorHex}`, 16),
|
});
|
const mesh = new THREE.Mesh( geometry, material );
|
mesh.position.set(0, 0, 0);
|
mesh.scale.set(boxScale, boxScale, boxScale);
|
wrap.add( mesh );
|
hintBoxList.push(mesh);
|
}
|
|
this.hintBoxList = hintBoxList;
|
},
|
},
|
})
|
|
export default threeBehavior;
|