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();
}
至此,我们就完成了我们的目标,让我们来看看效果吧:


