|
import * as THREE from 'three' |
|
import { FindObjectItem } from './utils/three-utils' |
|
import { LoadFBXFile, LoadGLTFile, LoadObjFile } from './utils/loader' |
|
|
|
export let HandObject: THREE.Group | null = null |
|
export let FootObject: THREE.Group | null = null |
|
|
|
export const HandModelInfo = { |
|
meshName: 'shoupolySurface1', |
|
bonePrefix: 'shoujoint', |
|
} |
|
export const FootModelInfo = { |
|
meshName: 'FootObject', |
|
bonePrefix: 'FootBone', |
|
} |
|
|
|
export const ExtremitiesMapping: Record< |
|
string, |
|
{ |
|
meshName: string |
|
bonePrefix: string |
|
} |
|
> = { |
|
left_hand: HandModelInfo, |
|
right_hand: HandModelInfo, |
|
left_foot: FootModelInfo, |
|
right_foot: FootModelInfo, |
|
} |
|
|
|
export function IsMatchBonePrefix(name: string) { |
|
if (name.startsWith(HandModelInfo.bonePrefix)) return true |
|
if (name.startsWith(FootModelInfo.bonePrefix)) return true |
|
return false |
|
} |
|
|
|
export async function LoadHand( |
|
handFBXFileUrl: string, |
|
onLoading?: (loaded: number) => void |
|
) { |
|
const fbx = await LoadFBXFile(handFBXFileUrl, onLoading) |
|
|
|
|
|
const mesh = FindObjectItem<THREE.SkinnedMesh>(fbx, HandModelInfo.meshName)! |
|
mesh.material = new THREE.MeshPhongMaterial() |
|
|
|
|
|
|
|
|
|
|
|
mesh.skeleton.bones.forEach((o) => { |
|
const point = new THREE.Mesh( |
|
new THREE.SphereGeometry(0.2), |
|
new THREE.MeshBasicMaterial({ |
|
color: 0xff0000, |
|
|
|
depthTest: false, |
|
opacity: 1, |
|
transparent: true, |
|
|
|
|
|
|
|
}) |
|
) |
|
point.name = 'red_point' |
|
|
|
|
|
o.add(point) |
|
}) |
|
|
|
const mask = new THREE.Mesh( |
|
new THREE.CylinderGeometry(1, 1, 0.4, 32), |
|
new THREE.MeshBasicMaterial({ color: 0x000000 }) |
|
) |
|
mask.name = 'hand_mask' |
|
mask.visible = false |
|
mask.rotateZ(Math.PI / 2) |
|
mesh.skeleton.bones[0].add(mask) |
|
|
|
HandObject = fbx |
|
return fbx |
|
} |
|
|
|
export async function LoadFoot( |
|
footFBXFileUrl: string, |
|
onLoading?: (loaded: number) => void |
|
) { |
|
const fbx = await LoadFBXFile(footFBXFileUrl, onLoading) |
|
|
|
console.log(fbx) |
|
|
|
|
|
const mesh = FindObjectItem<THREE.SkinnedMesh>(fbx, FootModelInfo.meshName)! |
|
mesh.material = new THREE.MeshPhongMaterial() |
|
|
|
|
|
|
|
|
|
console.log(mesh.skeleton.bones) |
|
mesh.skeleton.bones.forEach((o) => { |
|
if (o.name !== 'FootBone2') return |
|
const point = new THREE.Mesh( |
|
new THREE.SphereGeometry(0.1), |
|
new THREE.MeshBasicMaterial({ |
|
color: 0xff0000, |
|
depthTest: false, |
|
opacity: 1, |
|
transparent: true, |
|
}) |
|
) |
|
|
|
point.name = 'red_point' |
|
|
|
point.translateX(-0.3) |
|
o.add(point) |
|
}) |
|
|
|
const mask = new THREE.Mesh( |
|
new THREE.CylinderGeometry(0.35, 0.35, 0.2, 32), |
|
new THREE.MeshBasicMaterial({ color: 0x000000 }) |
|
) |
|
mask.scale.setX(0.7) |
|
mask.name = 'foot_mask' |
|
mask.visible = false |
|
mesh.skeleton.bones[0].add(mask) |
|
|
|
FootObject = fbx |
|
return fbx |
|
} |
|
|