use*_*051 6 three.js typescript
我使用的是 Three.js r97 和 Angular 7。
我可以在本地运行和提供应用程序(按原样工作),但我无法为具有类型错误的生产构建。
错误 TS2339:类型“Object3D”上不存在属性“isMesh”。
错误 TS2339:“Object3D”类型上不存在“材料”属性。
错误 TS2339:类型“Object3D”上不存在属性“几何”。
发生这种情况的地方是在加载对象之后我正在遍历零件。
child.isMesh 并且对子对象所做的修改会引发错误。
我是打字稿的新手,不确定是否有更好的方法来处理这些操作。据我所知,我无法强制进行生产构建。任何有助于解决此问题的建议将不胜感激。
this.loader = new THREE.FBXLoader();
this.loader.load('assets/models/C4D_Export.fbx', object => {
object.traverse( child => {
if( child.type == "Group"){
child.name = 'ToolGroup';
}
if ( child.isMesh ) {
const oldMat = child.material;
//CONVERT MATERIAL TO STANDARD MATERIAL.
child.material = new THREE.MeshStandardMaterial({
color: oldMat.color,
map: oldMat.map,
});
child.castShadow = true;
child.receiveShadow = true;
child.material.combine = THREE.MixOperation;
child.material.envMap = envMap;
child.material.shininess=10;
child.material.refractionRatio=1;
child.material.reflectivity=1;
//child.material.normalMap = texture;
//child.material.normalMapType = 0;
child.material.metalness=1;
child.geometry.applyMatrix(new THREE.Matrix4().makeTranslation(5, 0, 0));
//child.material.color.setHex( 0xffffff );
var f2 = gui.addFolder('Position'+child.name);
f2.add(controller, 'positionX', -50, 50).onChange( function() {
child.position.x = (controller.positionX);
});
f2.add(controller, 'positionY', -50, 50).onChange( function() {
child.position.y = (controller.positionY);
});
f2.add(controller, 'positionZ', -50, 50).onChange( function() {
child.position.z = (controller.positionZ);
});
var sphereAxis = new THREE.AxesHelper(200);
child.add(sphereAxis);
}
});
object.position.y = -20;
object.scale.set(1,1,1);
object.rotation.z = (-90*(Math.PI/180));
objholder.add(object);
});
Run Code Online (Sandbox Code Playgroud)
我尝试为 Object3D 添加一个接口并定义如下属性:
interface Object3D{
isMesh?: any,
geometry?: any,
material?: any,
}
Run Code Online (Sandbox Code Playgroud)
错误仍然存在。
我可以通过在导致问题的//@ts-ignore每一行上方提供信息来解决问题。我不确定这是否是不好的做法,但它似乎有效。
您的 TypeScript 开发配置似乎与生产配置不同。没有其他原因会导致它在构建时出现错误,但在本地开发环境中编译时不会出现错误。(顺便说一句,您看到的错误是正确的,因为child预计是一个Object3D,它没有该.isMesh属性。)
//@ts-ignore您可以将 的类型断言child为您期望的类型,而不是执行:
if ( child.isMesh ) // Error: property .isMesh does not exist in Object3D
if ( (<any> child).isMesh ) // No error, but there's no type-checking with <any>
if ( (<THREE.Mesh> child).isMesh ) // No error, and you get access to Mesh props
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5138 次 |
| 最近记录: |