javascript - OrbitControls 在 Angular2 和 Three.js 中未定义

标签 javascript angular three.js

我无法让 OrbitControls 在我的 Angular2 应用程序中工作。我成功地显示了一个带有盒子的场景,但我无法移动相机。

我发现我的 OrbitComponent(定义轨道控件)返回一个未定义值。

orbit.component.ts

import { Directive, Input } from '@angular/core';

import * as THREE from 'three';
import { OrbitControls } from 'three-orbit-controls';

@Directive({ selector: 'three-orbit-controls' })
export class OrbitControlsComponent {

    @Input() enabled: boolean = true;

    controls: OrbitControls;

    ngOnInit() {
        console.log("hello");
    }

    setupControls(camera, renderer) {
        this.controls = new OrbitControls(camera, renderer.domElement);
        this.controls.enabled = this.enabled;
    }

    updateControls(scene, camera) {
        this.controls.update();
    }
}

渲染器.component.ts

import { Directive, ElementRef, Input, ContentChild, ViewChild } from '@angular/core';
import * as THREE from 'three';

import { OrbitControlsComponent } from './controls/orbit.component';

@Directive({ selector: 'three-renderer' })
export class RendererComponent {

    @ContentChild(OrbitControlsComponent) orbitComponent: OrbitControlsComponent;

    constructor(private element: ElementRef) { }

    ngAfterContentInit() {
        console.log("orbitComponent undefined?", this.orbitComponent === undefined);
        // TODO: OrbitControls is NULL!
        if (this.orbitComponent) {
            this.orbitComponent.setupControls(this.camera, this.renderer);
        }

        this.render();
    }
}

如何返回 OrbitComponent 对象?

最佳答案

Angular2 中的指令和组件几乎相同,但也有差异。

对我来说,使用模板更容易将渲染器作为组件处理。这将使您能够像尝试使用属性注释一样访问嵌套元素。

这里有渲染器的示例:

declare var THREE: any;

@Component({
  selector: 'app-three-renderer',
  template: `
  <app-three-scene
    [renderer]="renderer">
  </app-three-scene>
  `
})
export class RendererComponent implements OnChanges, AfterViewInit {

  @Input() height: number;
  @Input() width: number;
  @ViewChild(SceneComponent) sceneComp: SceneComponent;

  renderer: THREE.WebGLRenderer = new THREE.WebGLRenderer({});

  // ... other stuff
}

这里我将 SceneComponent 设置为渲染器的直接子级。 SceneComponent 将处理 THREE.scene 对象、摄像机灯光等。

尽管如此,最重要的事实是这些建议:

  1. 使渲染器成为组件而不是指令
  2. 使用 @ViewChild 装饰器访问您的 child 。在我的例子中是一个 SceneComponent,但它可以是你的任何组件。确保在渲染器组件模板中包含组件标签选择器。

希望这对你有帮助!

关于javascript - OrbitControls 在 Angular2 和 Three.js 中未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45625578/

相关文章:

asp.net - 如何获取谷歌地图中心的经纬度

javascript - 用正则表达式匹配每个出现并在字符串中获取它们的索引

graphics - 两个网格,相同的纹理,不同的偏移量?

javascript - HTML5 视频上一个 - 下一个和自动播放

javascript - 外部 javascript 文件是否在 HTML 页面之间重新加载?

javascript - Angular2 Observables 最佳实践

Angular 农业网格 : How to render HTML in cell?

angular - 单击按钮后将下拉菜单重置为默认值

reactjs - 如何在 R3F 中为导入的 FBX 对象创建发光效果?

javascript - ThreeJS 在异步加载后更新 FBX 对象的属性