three.js自帶一個dat.gui.js,可以方便地對一個模型創建可視化操作界面,如圖:

但有時候界面的風格和整體不搭,而且這界面修改起來挺麻煩。通過對模型的屬性的了解,我們是可以對模型進行參數面板的定制的。
前期准備:three.js,jquery.js,jquery-ui.js,為了美觀點,可以再下載個bootstrap包導入。
准備完成,我們就可以開始了。這里舉個簡單的例子:
html部分
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>簡單的一個梨子</title>
<link rel="stylesheet" href="./css/index.css">
<link rel="stylesheet" href="./css/bootstrap.min.css">
<link rel="stylesheet" href="./css/jquery-ui.min.css">
<script type="text/javascript" src="js/three.js"></script>
<script type="text/javascript" src="js/jquery-3.2.1.min.js"></script>
<script type="text/javascript" src="js/jquery-ui.min.js"></script>
</head>
<body>
<!-- 放置主場景 -->
<div id="output">
</div>
<!-- 放置模型參數界面 -->
<div id="cube-ui">
<button type="button" class="btn btn-default cube-ui_button"><p>折疊收縮</p></button>
<div class="panel panel-default cube-ui_cube">
<div class="cube-ui_cube_depth">
<p align=right>長度:</p>
<div class="cube-ui_slider" id="cube-depth-slider"></div>
<input type="text" id="cube-depth-input" value="0"/>
</div>
<div class="cube-ui_cube_width">
<p align=right>寬度:</p>
<div class="cube-ui_slider" id="cube-width-slider"></div>
<input type="text" id="cube-width-input" value="0"/>
</div>
<div class="cube-ui_cube_height">
<p align=right>高度:</p>
<div class="cube-ui_slider" id="cube-height-slider"></div>
<input type="text" id="cube-height-input" value="0"/>
</div>
</div>
</div>
<script type="text/javascript" src="js/cubeUI.js"></script>
<script type="text/javascript" src="js/init.js"></script>
</body>
</html>
css部分
body {
margin: 0;
overflow: hidden;
}
#cube-ui{
position:absolute;
z-index:1;
right:0;
top:0;
display:block;
}
.cube-ui_button{
position:absolute;
right:0;
width: 250px;
height: 30px;
margin: 0 0 2px 0;
display: block;
}
.cube-ui_button p{
color:#000;
}
.cube-ui_cube{
width:100%;
height:30px;
margin:5px 0 0 0;
}
.geometry-parameter p{
position:absolute;
right:182px;
margin:5px 0 0 0;
width:65px;
}
.geometry-parameter .huadongtiao{
position:absolute;
right:50px;
margin:8px 0 0 0;
width:130px;
}
.geometry-parameter input{
position:absolute;
right:5px;
margin:4px 0 0 0;
width:40px;
height:20px;
text-align:center
}
#cube-ui .panel{
position:absolute;
top:35px;
right:0;
height: 120px;
width: 250px;
display: none;
}
js部分
這里我們創建兩個js(init.js,cubeUI.js)。init.js用來創建場景及模型,cubeUI.js實現參數面板對模型的操作。
init.js:
var scene,camera,webGLRenderer,spotLight;
function init(){
//場景
scene = new THREE.Scene();
//相機
camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.set(-20,30,40);
camera.lookAt(new THREE.Vector3(10, 0, 0));
//渲染器
webGLRenderer = new THREE.WebGLRenderer();
webGLRenderer.setClearColor(new THREE.Color(0xEEEEEE, 1.0));
webGLRenderer.setSize(window.innerWidth, window.innerHeight);
webGLRenderer.shadowMapEnabled = true;
document.getElementById("output").appendChild(webGLRenderer.domElement);
//燈光
spotLight = new THREE.SpotLight(0xffffff);
spotLight.position.set(-40, 60, -10);
scene.add(spotLight);
//創建一個立方體
var cube = createMesh(new THREE.BoxGeometry(10, 10, 10));
cube_ui(cube);
scene.add(cube);
render();
}
window.onload = init;
//渲染
function render(){
webGLRenderer.render(scene, camera);
}
//給立方體附加材質
function createMesh(geom){
var meshMaterial = new THREE.MeshNormalMaterial();
meshMaterial.side = THREE.DoubleSide;
var mesh = new THREE.Mesh(geom, meshMaterial);
mesh.position.set(0,0,0);
return mesh;
}
cubeUI.js:
//折疊收縮立方體UI
$(document).ready(function(){
$(".btn").click(function(){
$(".panel").slideToggle("slow");
return false;
});
});
var objUI = [];
//存儲立方體參數ui中的組件id
var cubeUiParameters = {
depth_slider: "cube-depth-slider",
width_slider: "cube-width-slider",
height_slider: "cube-height-slider",
depth_input: "cube-depth-input",
width_input: "cube-width-input",
height_input: "cube-height-input",
};
//立方體的相關變量
var cubeParameters = {
depth: 0,
width: 0,
height: 0,
};
//通過改變input中的值,改變模型
$("#"+cubeUiParameters.depth_input+",#"+cubeUiParameters.width_input+",#"+cubeUiParameters.height_input).change(function(){
//取到input中的值
cubeParameters.depth = document.getElementById(cubeUiParameters.depth_input).value;
cubeParameters.width = document.getElementById(cubeUiParameters.width_input).value;
cubeParameters.height = document.getElementById(cubeUiParameters.height_input).value;
//將取到的值賦給滑動條
$("#"+cubeUiParameters.depth_slider).slider("value",cubeParameters.depth);
$("#"+cubeUiParameters.width_slider).slider("value",cubeParameters.width);
$("#"+cubeUiParameters.height_slider).slider("value",cubeParameters.height);
//更新模型
updateCube(cubeParameters.width,cubeParameters.height,cubeParameters.depth);
});
//初始化滑動條的輸入框的值
function cube_ui(cube){
objUI = [];
objUI.push(cube);
//取得立方體的長、寬、高
document.getElementById(cubeUiParameters.depth_input).value = cube.geometry.parameters.depth;
document.getElementById(cubeUiParameters.width_input).value = cube.geometry.parameters.width;
document.getElementById(cubeUiParameters.height_input).value = cube.geometry.parameters.height;
cubeParameters.depth = cube.geometry.parameters.depth;
cubeParameters.width = cube.geometry.parameters.width;
cubeParameters.height = cube.geometry.parameters.height;
//生成滑動條
$("#"+cubeUiParameters.depth_slider+",#"+cubeUiParameters.width_slider+",#"+cubeUiParameters.height_slider).slider({
min:0,
max:500,
step:1,
value:0,
slide:function(event,ui){
$(this).slider("value",ui.value);
cube_value();
}
});
//給滑動條賦值
$("#"+cubeUiParameters.depth_slider).slider("value",cubeParameters.depth);
$("#"+cubeUiParameters.width_slider).slider("value",cubeParameters.width);
$("#"+cubeUiParameters.height_slider).slider("value",cubeParameters.height);
}
//取到滑條的值賦給input框並更新立方體
function cube_value(){
cubeParameters.depth = $("#"+cubeUiParameters.depth_slider).slider("value");
cubeParameters.width = $("#"+cubeUiParameters.width_slider).slider("value");
cubeParameters.height = $("#"+cubeUiParameters.height_slider).slider("value");
document.getElementById(cubeUiParameters.depth_input).value = cubeParameters.depth;
document.getElementById(cubeUiParameters.width_input).value = cubeParameters.width;
document.getElementById(cubeUiParameters.height_input).value = cubeParameters.height;
updateCube(cubeParameters.width,cubeParameters.height,cubeParameters.depth);
}
//創建改變參數的立方體
function updateCube(width,height,depth){
//刪除改變前模型
objUI[0].geometry.dispose();
scene.remove(objUI[0]);
objUI = [];
var cube = createMesh(new THREE.CubeGeometry(width, height, depth));
cube.position.set(0,0,0);
objUI.push(cube);
scene.add(cube);
render();
}
至此,我們就完成了我們的目標,讓我們來看看效果吧:


