javascript - three.js OrbitControls 与 HTML5 Canvas 冲突?

标签 javascript canvas three.js

我有一个 HTML5 Canvas(在本例中使用 Fabric.js)和一个渲染出来的 three.js 对象。使用 OrbitControls 旋转我的 3D 图像时,会出现两种奇怪的行为。

1) 下拉字段和动态 slider 不下拉或滑动

2) 当我在页面上有另一个 Canvas 并在该 Canvas 上移动图像时,three.js Canvas 中的 3D 图像会与图像的移动同步移动。如果我移动 3D 图像, Canvas 中的图像不会同步移动/不受影响

如果我在“Box Controller - Collada Files” Controller 中注释掉/或删除我的旋转控件,下拉菜单会工作,并且正如预期的那样, Canvas 中的图像和呈现的 3D 图像之间没有“链接移动”通过 three.js(很可能是因为旋转控件被删除)。

我如何才能做到这一点,这样 OrbitControls 就不会停止下拉菜单和其他项目来运行/取消同步图像与 3D 对象的移动?

这是我的示例 HTML:

<!DOCTYPE html>
<html lang="en" data-ng-app="appControllersBox">
<head>
<title>three.js webgl - loaders - collada loader</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">

<!-- Core files (jQuery, Angular, etc.) -->
<script src="js/scripts/jquery-2.1.4.min.js"></script>
<!-- Switch to AngularUI if appropriate -->
<script src="js/scripts/bootstrap.min.js"></script>
<script src="js/scripts/angular.min.js"></script>

<!-- Three.js: http://threejs.org/ -->
<script src="js/scripts/three.min.js"></script>
<script src="js/scripts/ColladaLoader.js"></script>
<script src="js/scripts/OrbitControls.js"></script>

<!-- Fabric.js: http://fabricjs.com/ -->
<script src="js/scripts/fabric.min.js"></script>

<!-- Color Picker JS: https://github.com/buberdds/angular-bootstrap-colorpicker -->
<script src="js/scripts/bootstrap-colorpicker-module.min.js"></script>

<!-- Angular App Specific Files -->
<script src="js/controllers/controllers2.js"></script>

<!-- CSS Files -->
<link href="css/bootstrap.min.css" rel="stylesheet" />
<link href="css/colorpicker.min.css" rel="stylesheet" />
</head>

<body>
<div data-ng-controller="canvasCtrl">
    <div class="row">
        <div class="col-md-6">
            <p>
                <label>Select list</label>
                <select id="myList">
                    <option value="1">one</option>
                    <option value="2">two</option>
                    <option value="3">three</option>
                    <option value="4">four</option>
                </select>

            </p>
            <p>
                <input type="file" id="imageLoader" name="imageLoader" />
                <button id="textCreate" class="primaryButton" data-ng-click="textMe()">
                    Create Text
                </button>
            </p>
        </div>
    </div>
    <div class="col-md-6">
        <canvas id="c" style="border:5px solid" height="1023px" width="772px"></canvas>
    </div>
</div>
<div class="col-md-12" data-ng-controller="3dboxCtrl">
    <div id="webGL-container">
    </div>
</div>
</body>
</html>

这是我的 JS/Controllers2.js 文件(注意有两个 Angular Controller ):

    'use strict';

var appControllersBox = angular.module('appControllersBox', ['colorpicker.module']);

// Box Controller - Canvas
appControllersBox.controller('canvasCtrl', ['$scope', '$timeout', function ($scope, $timeout) {

    // Canvas
    var canvas = new fabric.Canvas('c');

    // Add Text
    $scope.textMe = function () {
        var text = new fabric.IText('hello world', { left: 100, top: 100 });
        canvas.add(text);
    }

    // Load Image
    var imageLoader = document.getElementById('imageLoader');
    imageLoader.addEventListener('change', handleImage, false);
    var ctx = canvas.getContext('2d');


    function handleImage(e) {
        var reader = new FileReader();
        reader.onload = function (event) {
            var imgAdd = new Image();
            imgAdd.onload = function () {
                var img = new fabric.Image(imgAdd);
                canvas.add(img);
            }
            imgAdd.src = event.target.result;
        }
        reader.readAsDataURL(e.target.files[0]);
    }
}]);


// Box Controller - Collada File
appControllersBox.controller('3dboxCtrl', ['$scope', '$timeout', function ($scope, $timeout) {

    // 3D Object
    var scene;
    var camera;
    var renderer;
    var box;
    var controls;

    // instantiate a loader
    var loader = new THREE.ColladaLoader();
    loader.options.convertUpAxis = true;
    loader.load('models/box.dae', function (collada) {

        box = collada.scene;

        box.traverse(function (child) {

            if (child instanceof THREE.SkinnedMesh) {

                var animation = new THREE.Animation(child, child.geometry.animation);
                animation.play();

            }
        });

        box.scale.x = box.scale.y = box.scale.z = .2;
        box.updateMatrix();

        init();
        animate();
    });


    function init() {
        scene = new THREE.Scene();
        camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
        renderer = new THREE.WebGLRenderer();

        renderer.setClearColor(0xdddddd);
        renderer.setSize(window.innerWidth, window.innerHeight);

        // Load the box file
        scene.add(box);

        // Lighting
        var light = new THREE.AmbientLight();
        scene.add(light);

        // Camera
        camera.position.x = 40;
        camera.position.y = 40;
        camera.position.z = 40;

        camera.lookAt(scene.position);

        // Rotation Controls
        controls = new THREE.OrbitControls(camera);

        controls.rotateSpeed = 5.0;
        controls.zoomSpeed = 5;

        controls.noZoom = false;
        controls.noPan = false;

        $("#webGL-container").append(renderer.domElement);
    }

    function animate() {
        requestAnimationFrame(animate);
        renderer.render(scene, camera);
    }

}]);

最佳答案

如果您正在使用 OrbitControlsTrackballControls 并且这些控件会干扰其他 HTML 元素,您需要将 domElement 参数添加到控制构造函数:

controls = new THREE.OrbitControls( camera, renderer.domElement );

三.js.r71

关于javascript - three.js OrbitControls 与 HTML5 Canvas 冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32151598/

相关文章:

javascript - 在页面上包含 Facebook 事件会引发错误

javascript - Canvas 类 JavaScript

matrix - 将对象的旋转定向到THREE.JS中的样条点切线

javascript - 仅显示/隐藏 javascript 一项

JavaScript 在 Chrome 中工作,在 Firefox 中不工作

ruby-on-rails - 谷歌地图标记只显示了它的四分之一

javascript - 创建一个带有阴影的圆锥体

javascript - 如何使用键盘拉伸(stretch)和压缩立方体的长宽高?

javascript - 在 Three.js 中计算自定义几何体的光

javascript - 使用 JSDoc-3.3.0-alpha5 记录原型(prototype)属性和方法