在TypeScript中使用Threejs + OrbitContols

asd*_*sdf 12 html javascript three.js typescript

我无法在TypeScript中使用前面提到的组合这个例子.

我有<script src="lib/three.min.js"></script><script src="lib/OrbitControls.js"></script>我的html <head>和typescript文件<body>:

/// <reference path="lib\three.d.ts" />
...
this.controls = new THREE.OrbitControls(this.camera); //there's the error
this.controls.addEventListener('change', this.render);
...
Run Code Online (Sandbox Code Playgroud)

this.controls.update();
Run Code Online (Sandbox Code Playgroud)

在周期性调用render()函数.据我所知,设置与expample相同,但在编译OrbitControls构造函数行时给出了一个巨大的错误(缩写):

The property 'OrbitControls' does not exist on value of type '{REVISION:string;   
CullFace: {[x: number ...
Run Code Online (Sandbox Code Playgroud)

我猜这个错误中有整个Threejs,因为Visual Studio在我点击它时崩溃了:).谢谢你的帮助.

nic*_*nel 15

经过几个小时花在这个问题上,我最终创建了一个新的包:三轨道控制

import * as THREE from 'three';
import { OrbitControls } from 'three-orbitcontrols-ts';

const controls = new OrbitControls(camera, renderer.domElement);
Run Code Online (Sandbox Code Playgroud)


小智 8

导入THREE后直接从源文件导入OrbitControl对我来说很有用(不使用three-orbitcontrols-ts包):

import * as THREE from 'three';
import 'three/examples/js/controls/OrbitControls';
Run Code Online (Sandbox Code Playgroud)

仅使用three@types/three

  • 问题在于,在第一次导入后,`THREE` 是一个导入对象,而不是窗口对象上的属性,如 `three/examples/js/controls/OrbitControls` 期望的以便自行安装。 (2认同)

ken*_*nny 5

文档中所述,请执行以下操作:

import * as THREE from 'three';
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
Run Code Online (Sandbox Code Playgroud)

重要的是您使用文件夹jsm而不是js。并且请记住,并不是所有模块都在jsm文件夹中可用


asd*_*sdf 1

感觉有点傻,因为解决方案(或至少是解决方法)非常简单......

只需声明OrbitControls变量:

declare var THREE.OrbitControls: any; // even "declare var THREE.OrbitControls;" will do the trick
Run Code Online (Sandbox Code Playgroud)

仍然存在一些编译错误,但它可以工作。