three.js 蒙皮点而不是网格
three.js skinned points instead of mesh
我正在导入动画机器人手的 .fbx 模型。我想使用蒙皮网格但渲染 gl.POINTS 而不是标准网格。
这是我最初(天真的)尝试。我正在将 THREE.Mesh 中的各个元素交换为 THREE.Points:
loader.load('/robot-arm-01.fbx', (object) => {
let children = object.children.map(child => {
child.material = new THREE.ShaderMaterial({
vertexShader,
fragmentShader,
skinning: true
})
let points = new THREE.Points(child.geometry, child.material)
points.position.copy(child.position)
points.scale.copy(child.scale)
points.rotation.copy(child.rotation)
return points
})
object.children = children
})
问题绝对不在我的顶点着色器中,如果我不交换子数组,我就可以播放动画
这让我的模型正确显示 gl.POINTS,但我的动画根本没有启动。我在这里错过了什么?
我唯一的想法是在运行时将 three.js 网格的绘制调用从 gl.TRIANGLES 更改为 gl.POINTS。如何做这样的事情?是否有更聪明的方法来解决这个问题?
这可能不是理想的方法,但到目前为止对我来说没有问题。我所做的只是将所有 SkinnedMesh
参数复制到 Points
中。希望这有帮助
getSkinnedPoints(skinnedMesh) {
const points = new THREE.Points(skinnedMesh.geometry, skinnedMesh.material);
points.skeleton = skinnedMesh.skeleton;
points.bindMatrix = skinnedMesh.bindMatrix;
points.bindMatrixInverse = skinnedMesh.bindMatrixInverse;
points.bindMode = skinnedMesh.bindMode;
points.drawMode = skinnedMesh.drawMode;
points.name = skinnedMesh.name;
points.parent = skinnedMesh.parent;
points.uuid = skinnedMesh.uuid;
points.type = skinnedMesh.type;
points.isSkinnedMesh = true;
points.bind = skinnedMesh.bind;
points.clone = skinnedMesh.clone;
points.initBones = skinnedMesh.initBones;
points.normalizeSkinWeights = skinnedMesh.normalizeSkinWeights;
points.pose = skinnedMesh.pose;
points.updateMatrixWorld = skinnedMesh.updateMatrixWorld;
return points;
}
我正在导入动画机器人手的 .fbx 模型。我想使用蒙皮网格但渲染 gl.POINTS 而不是标准网格。
这是我最初(天真的)尝试。我正在将 THREE.Mesh 中的各个元素交换为 THREE.Points:
loader.load('/robot-arm-01.fbx', (object) => {
let children = object.children.map(child => {
child.material = new THREE.ShaderMaterial({
vertexShader,
fragmentShader,
skinning: true
})
let points = new THREE.Points(child.geometry, child.material)
points.position.copy(child.position)
points.scale.copy(child.scale)
points.rotation.copy(child.rotation)
return points
})
object.children = children
})
问题绝对不在我的顶点着色器中,如果我不交换子数组,我就可以播放动画
这让我的模型正确显示 gl.POINTS,但我的动画根本没有启动。我在这里错过了什么?
我唯一的想法是在运行时将 three.js 网格的绘制调用从 gl.TRIANGLES 更改为 gl.POINTS。如何做这样的事情?是否有更聪明的方法来解决这个问题?
这可能不是理想的方法,但到目前为止对我来说没有问题。我所做的只是将所有 SkinnedMesh
参数复制到 Points
中。希望这有帮助
getSkinnedPoints(skinnedMesh) {
const points = new THREE.Points(skinnedMesh.geometry, skinnedMesh.material);
points.skeleton = skinnedMesh.skeleton;
points.bindMatrix = skinnedMesh.bindMatrix;
points.bindMatrixInverse = skinnedMesh.bindMatrixInverse;
points.bindMode = skinnedMesh.bindMode;
points.drawMode = skinnedMesh.drawMode;
points.name = skinnedMesh.name;
points.parent = skinnedMesh.parent;
points.uuid = skinnedMesh.uuid;
points.type = skinnedMesh.type;
points.isSkinnedMesh = true;
points.bind = skinnedMesh.bind;
points.clone = skinnedMesh.clone;
points.initBones = skinnedMesh.initBones;
points.normalizeSkinWeights = skinnedMesh.normalizeSkinWeights;
points.pose = skinnedMesh.pose;
points.updateMatrixWorld = skinnedMesh.updateMatrixWorld;
return points;
}