定制three.js的模型的可视化操作界面


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(); }

 至此,我们就完成了我们的目标,让我们来看看效果吧:

 

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM