【问题标题】:Threejs Geometry and TypeScriptThreejs 几何和 TypeScript
【发布时间】:2020-02-24 14:38:25
【问题描述】:

我想为网格顶点和面编写正确的类型。

在第一个示例中,我创建了一个新的 Mesh,当我想从几何体中访问 Vertices 和 Faces 时,我遇到了一些错误:

const material = new THREE.MeshLambertMaterial({color: 0x00ff00});
const geometry = new THREE.Geometry();
const newMesh = new THREE.Mesh(geometry, material);
scene.add(newMesh);

const { vertices, faces } = newMesh.geometry;
// Error: Property 'vertices' does not exist on type 'BufferGeometry | Geometry'
// Error: Property 'faces' does not exist on type 'Geometry | BufferGeometry'.

newMesh.geometry.colorsNeedUpdate = true;
// Error: Property 'colorsNeedUpdate' does not exist on type 'Geometry | BufferGeometry'.

在第二个示例中,我从场景中获取 Mesh,然后出现以下错误:

const mesh = scene.getObjectByName('boxMesh');
const geometry = mesh.geometry; 
// Property 'geometry' does not exist on type 'Object3D'.

【问题讨论】:

    标签: typescript three.js geometry


    【解决方案1】:

    通过网格 (newMesh.geometry) 访问几何图形,您将获得类似于 Mesh 类上的 geometry 属性类型的几何图形。显然,该属性支持两种不同类型的几何,因此您可以得到一个联合:Geometry | BufferGeometry

    如果您确切知道所使用的几何类型,您可以断言属性值的类型:

    const { vertices, faces } = <THREE.Geometry>newMesh.geometry;
    

    如果您不知道geometry 的类型,您需要一些条件逻辑,例如使用类似的东西:

    const geometry = newMesh.geometry;
    if (geometry instanceof THREE.Geometry)
        // geometry will be typed as Geometry here
    else
        // geometry will be typed as BufferGeometry here
    

    在第二种情况下,您使用getObjectByName,它总是返回最基本类型的对象Object3D。在这里,您还必须相应地断言结果的类型。

    // Assuming the thing named boxMesh is a Mesh...
    // The <any> assertion prevents additional type errors.
    const mesh = <THREE.Mesh><any>scene.getObjectByName('boxMesh');
    

    【讨论】:

    • 当我这样写时: const mesh = scene.getObjectByName('boxMesh');我发现错误:“类型'Object3D | undefined'不可分配给类型'Mesh | undefined'。类型'Object3D'缺少'Mesh'类型的以下属性:几何,材料,”
    • 对于此类错误,您可以先将其声明为any&lt;THREE.Mesh&gt;&lt;any&gt;scene.getObjectByName('boxMesh');
    • 应该有比使用any更好的解决方案
    • 嗯,没有。函数getObjectByName 首先不应该返回Object3D,而是有一个从Object3D 派生的泛型参数,因此您可以在函数调用中指定返回类型。首先转换为any 是解决此问题的标准方法(请参阅文档中的double assertion 部分)。
    • @john_per 实际上,单类型断言应该在这种情况下工作,因为MeshObject3D 的子类型。我自己试了一下,没有报错,你是不是用错了Mesh类?
    猜你喜欢
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    • 2016-06-28
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    相关资源
    最近更新 更多