2015-04-13 3 views
1

Я пытаюсь сгенерировать куб с Three.js, который можно динамически изменять в соответствии с входами пользователей. Связывание осуществляется через angular.js:Динамическое изменение размеров куба с помощью angularjs

Это HTML-код, который позволяет пользователю вводить и изменять значения:

<body> 
<div id="mainContainer"> 
    <h2 id="mainTitle">3D house generator</h2> 
    <form ng-app="3dHouseGenerator" ng-controller="validateInput" name="myForm" novalidate> 
    <p>House length: </br> 
     <input type="number" name="length" ng-model="length.value" min="0.001" required /> 
    </p> 

    <p>House width: </br> 
     <input type="number" name="width" ng-model="width.value" min="0.001" required /> 
    </p> 

    <p>House walls height: </br> 
     <input type="number" name="height" ng-model="height.value" min="0.001" required /> 
    </p> 
</body> 

Это код связан с Three.js и то, что я хотел бы сделать, это для ввода входных значений для куба. Это то, что я хотел бы достичь:

var geometry = new THREE.BoxGeometry(length, width, height); 
var material = new THREE.MeshBasicMaterial({color: 0xCC0000}); 
var cube = new THREE.Mesh(geometry, material); 
scene.add(cube); 

// dynamically change and update the dimensions 
cube.geometry.dynamic = true; 
cube.geometry.verticesNeedUpdate = true; 
cube.geometry.normalsNeedUpdate = true; 

У вас есть идея или возможное решение проблемы? Заранее благодарим за внимание!

Edit:

Это вся code. Чтобы лучше объяснить то, что я ищу, это начальное значение.

var geometry = new THREE.BoxGeometry(1, 1, 1); 

И вот что я пытаюсь достичь.

var geometry = new THREE.BoxGeometry(length.value, width.value, height.value); 

Edit # 2

По просьбе msmolens, я добавляя angularjs контроллер

(function(angular) { 
angular.module('3dHouseGenerator', []) 
    .controller('validateHouseInput', ['$scope', function($scope) { 
     $scope.length = {value: 7}; 
     $scope.width = {value: 5}; 
     $scope.height = {value: 4};   
    }]); 

})(window.angular); 
+0

Можете ли вы опубликовать код для своего контроллера? – msmolens

+0

Несомненно, приятель! Я собираюсь отредактировать вопрос и добавить его –

ответ

0

А где вопрос? В JavaScript вызова

cube.scale.set(x,y,z) // xyz are numeric value of scale 1=100%

cube.scale.set(1,2,1) для двойной высоты.

+0

Он должен быть cube.scale.set (length.value, width.value, height.value), но он не работает. Может быть, я должен попытаться включить функцию внутри angular.module? –

+0

И используете ли вы функцию анимации? Я имею в виду, если ваша сцена отображается только один раз или она анимируется requestAnimationFrame (анимация)? – Martin

+0

Это целый код https://jsfiddle.net/05stmtus/ –

0

Вам необходимо обновить шкалу куба, когда пользователь изменяет входы. Один из способов сделать это состоит в использовании ng-change на вашем <input> с:

<input type="number" name="height" ng-model="height.value" ng-change="setScale()" min="0.001" required /> 

и определить setScale() в контроллере:

$scope.setScale = function() { 
    cube.scale.set(length.value, width.value, height.value); 
}; 

В зависимости от того, как структурирована вашего кода, дополнительный вопрос может быть, что вы не имеют доступа к cube в вашем контроллере. Структурированный способ решения этого вопроса заключается в том, чтобы поместить ваш код three.js в службу, ввести службу в ваш контроллер и обновить масштаб куба с помощью функции службы.

+0

Кажется правдоподобным решением. На данный момент я использую